//******************************************************************************
//
// File:    SignalDataSetReader.java
// Package: edu.rit.mri
// Unit:    Class edu.rit.mri.SignalDataSetReader
//
// 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 edu.rit.numeric.ArraySeries;
import edu.rit.numeric.Series;

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

/**
 * Class SignalDataSetReader provides an object that reads a magnetic resonance
 * image spin signal data set from a file. The data set includes the measured
 * spin signals for each pixel in the image.
 * 

* The spin signal data set file format is defined in class {@linkplain * SignalDataSetWriter}. * * @author Alan Kaminsky * @version 21-Jun-2008 */ public class SignalDataSetReader { // Hidden data members. private RandomAccessFile myFile; private int H; private int W; private int P; private int M; private Series t_series; // Exported constructors. /** * Construct a new spin signal 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 SignalDataSetReader (File theFile) throws IOException { // Verify preconditions. if (theFile == null) { throw new NullPointerException ("SignalDataSetReader(): theFile is null"); } // Open file for read-only. myFile = new RandomAccessFile (theFile, "r"); // Read height and width. H = myFile.readInt(); W = myFile.readInt(); // Skip pixel signal data offsets. P = H*W; myFile.seek (8L + P*8L); // Read time series. M = myFile.readShort(); double[] t_array = new double [M]; for (int i = 0; i < M; ++ i) { t_array[i] = myFile.readDouble(); } t_series = new ArraySeries (t_array); } // 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 ("SignalDataSetReader.indexFor(): r (= "+r+") out of bounds"); } if (0 > c || c >= W) { throw new IndexOutOfBoundsException ("SignalDataSetReader.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 ("SignalDataSetReader.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 ("SignalDataSetReader.columnFor(): i (= "+i+") out of bounds"); } return i%W; } /** * Get the time series for this data set. * * @return Time series. */ public Series getTimeSeries() { return t_series; } /** * Get the pixel signal data for the given pixel in this data set. If the * given pixel has no associated signal data, null is returned. * * @param i Pixel index, 0 ≤ i ≤ P−1. * * @return {@linkplain PixelSignal} 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 PixelSignal getPixelSignal (int i) throws IOException { // Verify preconditions. if (0 > i || i >= P) { throw new IndexOutOfBoundsException ("SignalDataSetReader.getPixelSignal(): i (= "+i+ ") out of bounds"); } // Read offset to pixel signal data. myFile.seek (8L + i*8L); long offset = myFile.readLong(); if (offset == 0L) return null; // Read pixel signal data. myFile.seek (offset); PixelSignal signal = new PixelSignal(); signal.pixelIndex (i); signal.read (myFile); return signal; } /** * 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.