package edu.stanford.rsl.conrad.io;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import org.junit.Test;
import edu.stanford.rsl.conrad.pipeline.ProjectionSource;
import edu.stanford.rsl.conrad.utils.CONRAD;
import edu.stanford.rsl.conrad.utils.FileUtil;
import ij.IJ;
import ij.io.FileInfo;
/**
* Class to read Dennerlein's Format. It's basically raw float data with a 6 byte header containing x,y, and z.
*
* @author akmaier
*
*/
public class DennerleinProjectionSource extends FileProjectionSource {
protected boolean debug = false;
@Override
public void initStream (String filename) throws IOException {
fi = getHeaderInfo(filename);
init();
}
/**
* Reads the header information from the file into a fileinfo object
* @param filename the filename
* @return the FileInfo
* @throws IOException
*/
public FileInfo getHeaderInfo( String filename ) throws IOException {
if (IJ.debugMode) CONRAD.log("Entering Nrrd_Reader.readHeader():");
FileInfo fi = new FileInfo();
File file = new File(filename);
fi.fileName=file.getName();
fi.directory = file.getParent() + "/";
// NB Need RAF in order to ensure that we know file offset
RandomAccessFile input = new RandomAccessFile(fi.directory+fi.fileName,"r");
fi.fileType = FileInfo.GRAY8; // just assume this for the mo
fi.fileFormat = FileInfo.RAW;
fi.nImages = 1;
byte [] header = new byte [6];
input.read(header);
fi.width = (int) convertToUnsignedShort(header, 0);
fi.height = (int) convertToUnsignedShort(header, 1);
fi.nImages = (int) convertToUnsignedShort(header, 2);
CONRAD.log("Dennerlein Reading image with " + fi.nImages + " frames with " + fi.width + "x" + fi.height + " resolution");
fi.compression = FileInfo.COMPRESSION_NONE;
fi.fileType=FileInfo.GRAY32_FLOAT;
// exception for projection matrix data
if (fi.width == 3 && fi.height == 4){
fi.width = 4;
fi.height = 3;
fi.fileType=FileInfo.GRAY64_FLOAT;
}
if (fi.width == 4 && fi.height == 3){
fi.fileType=FileInfo.GRAY64_FLOAT;
}
fi.offset = 6;
fi.intelByteOrder = true;
input.close();
return (fi);
}
@Test
public void testProjectionSource(){
// Test to read a large Dennerlein file. Result should be that the memory consumption does not increase.
// Which is the case in the current implementation.
// akmaier
try {
String filenameString = FileUtil.myFileChoose(".bin", false);
ProjectionSource test = FileProjectionSource.openProjectionStream(filenameString);
while(test.getNextProjection() != null){
System.out.println("Read Projection " + test.getCurrentProjectionNumber());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/