//******************************************************************************
//
// File:    TissuesDataSetReader.java
// Package: edu.rit.mri
// Unit:    Class edu.rit.mri.TissuesDataSetReader
//
// This Java source file is copyright (C) 2008 by Alan Kaminsky. All rights
// reserved. For further information, contact the author, Alan Kaminsky, at
// ark@cs.rit.edu.
//
// This Java source file is part of the Parallel Java Library ("PJ"). PJ is free
// software; you can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// PJ is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
// A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// A copy of the GNU General Public License is provided in the file gpl.txt. You
// may also obtain a copy of the GNU General Public License on the World Wide
// Web at http://www.gnu.org/licenses/gpl.html.
//
//******************************************************************************

package edu.rit.mri;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * Class TissuesDataSetReader provides an object that reads a magnetic resonance
 * image tissues data set from a file. The data set includes the results of a
 * spin relaxometry analysis for each pixel in the image, including number of
 * tissues, spin density of each tissue, and spin-lattice relaxation rate of
 * each tissue.
 * 

* The tissues data set file format is defined in class {@linkplain * TissuesDataSetWriter}. * * @author Alan Kaminsky * @version 21-Jun-2008 */ public class TissuesDataSetReader { // Hidden data members. private RandomAccessFile myFile; private int H; private int W; private int P; // Exported constructors. /** * Construct a new tissues data set reader. * * @param theFile File to read. * * @exception NullPointerException * (unchecked exception) Thrown if theFile is null. * @exception IOException * Thrown if an I/O error occurred. */ public TissuesDataSetReader (File theFile) throws IOException { // Verify preconditions. if (theFile == null) { throw new NullPointerException ("TissuesDataSetReader(): theFile is null"); } // Open file for read-only. myFile = new RandomAccessFile (theFile, "r"); // Read height and width. H = myFile.readInt(); W = myFile.readInt(); P = H*W; } // Exported operations. /** * Get the height H of this data set's magnetic resonance image. * * @return Height (number of rows). */ public int getHeight() { return H; } /** * Get the width W of this data set's magnetic resonance image. * * @return Width (number of columns). */ public int getWidth() { return W; } /** * Get the number of pixels P in this data set's magnetic resonance * image. * * @return Number of pixels. */ public int getPixelCount() { return P; } /** * Get the pixel index for the given row and column indexes. * * @param r Row index, 0 ≤ r ≤ H−1. * @param c Column index, 0 ≤ c ≤ W−1. * * @return Pixel index. * * @exception IndexOutOfBoundsException * (unchecked exception) Thrown if r or c is out of * bounds. */ public int indexFor (int r, int c) { if (0 > r || r >= H) { throw new IndexOutOfBoundsException ("TissuesDataSetReader.indexFor(): r (= "+r+") out of bounds"); } if (0 > c || c >= W) { throw new IndexOutOfBoundsException ("TissuesDataSetReader.indexFor(): c (= "+c+") out of bounds"); } return r*W + c; } /** * Get the row index corresponding to the given pixel index. * * @param i Pixel index, 0 ≤ i ≤ P−1. * * @return Row index. * * @exception IndexOutOfBoundsException * (unchecked exception) Thrown if i is out of bounds. */ public int rowFor (int i) { if (0 > i || i >= P) { throw new IndexOutOfBoundsException ("TissuesDataSetReader.rowFor(): i (= "+i+") out of bounds"); } return i/W; } /** * Get the column index corresponding to the given pixel index. * * @param i Pixel index, 0 ≤ i ≤ P−1. * * @return Column index. * * @exception IndexOutOfBoundsException * (unchecked exception) Thrown if i is out of bounds. */ public int columnFor (int i) { if (0 > i || i >= P) { throw new IndexOutOfBoundsException ("TissuesDataSetReader.columnFor(): i (= "+i+") out of bounds"); } return i%W; } /** * Get the pixel tissues data for the given pixel in this data set. If the * given pixel has no associated tissues data, null is returned. * * @param i Pixel index, 0 ≤ i ≤ P−1. * * @return {@linkplain PixelTissues} object for pixel i, or null. * * @exception IndexOutOfBoundsException * (unchecked exception) Thrown if i is out of bounds. * @exception IOException * Thrown if an I/O error occurred. */ public PixelTissues getPixelTissues (int i) throws IOException { // Verify preconditions. if (0 > i || i >= P) { throw new IndexOutOfBoundsException ("TissuesDataSetReader.getPixelTissues(): i (= "+i+ ") out of bounds"); } // Read offset to pixel tissues data. myFile.seek (8L + i*8L); long offset = myFile.readLong(); if (offset == 0L) return null; // Read pixel tissues data. myFile.seek (offset); PixelTissues tissues = new PixelTissues(); tissues.pixelIndex (i); tissues.read (myFile); return tissues; } /** * Close this data set. * * @exception IOException * Thrown if an I/O error occurred. */ public void close() throws IOException { myFile.close(); } /** * Finalize this data set. */ protected void finalize() { try { close(); } catch (IOException exc) {} } }

Ads help maintain this website.