package edu.stanford.rsl.conrad.geometry.trajectories; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import edu.stanford.rsl.conrad.geometry.Projection; import edu.stanford.rsl.conrad.numerics.SimpleMatrix; public class ProjectionTableFileTrajectory extends ConfigFileBasedTrajectory{ /** * */ private static final long serialVersionUID = 8539564781880779305L; private int version = 3; private boolean success = false; public ProjectionTableFileTrajectory(String filename, Trajectory model) throws IOException{ super(model); readConfigFile(filename); } public ProjectionTableFileTrajectory(Trajectory model) { super(model); } public void readConfigFile(String filename) throws IOException{ String projectionConfig = filename; FileReader read = new FileReader(projectionConfig); BufferedReader bufferedReader = new BufferedReader(read); String line = ""; // Read version line = bufferedReader.readLine(); if (line.contains("version 4")) version = 4; if (line.contains("version 3")) version = 3; if (line.contains("version 5")) version = 5; if (line.contains("version 6")) version = 6; // skip three lines line = bufferedReader.readLine(); line = bufferedReader.readLine(); line = bufferedReader.readLine(); if (version == 4) line = bufferedReader.readLine(); if ((version == 5)||(version == 6)) line = bufferedReader.readLine(); //read number of matrices if (version == 3) { numProjectionMatrices = Integer.parseInt(bufferedReader.readLine()); } if ((version == 4)||(version == 5)||(version == 6)){ String [] elements = bufferedReader.readLine().split("\\s+"); numProjectionMatrices = Integer.parseInt(elements[0]); } this.projectionStackSize = numProjectionMatrices; projectionMatrices = new Projection[numProjectionMatrices]; secondaryAngles = new double[numProjectionMatrices]; primaryAngles = new double[numProjectionMatrices]; if ((version == 6)){ line = bufferedReader.readLine(); line = bufferedReader.readLine(); line = bufferedReader.readLine(); } //skip one line; line = bufferedReader.readLine(); int count = 0; while (line != null){ // projection number line = bufferedReader.readLine(); // angles line = bufferedReader.readLine(); if (line != null){ String [] elements = line.split(" "); this.primaryAngles[count] = Double.parseDouble(elements[0]); this.secondaryAngles[count] = Double.parseDouble(elements[1]); //read one matrix; double [][] projectionMatrix = new double[3][4]; for (int i =0; i<3;i++){ line = bufferedReader.readLine(); elements = line.split(" "); for (int j = 0; j < elements.length; j++){ projectionMatrix[i][j] = Double.parseDouble(elements[j]); } } projectionMatrices[count] = new Projection(new SimpleMatrix(projectionMatrix)); //skip one line count++; } if (count >= this.numProjectionMatrices) break; line = bufferedReader.readLine(); } if (count != numProjectionMatrices){ success = false; bufferedReader.close(); throw new IOException("Number of Matrices in projection table file does not match the actual number in the file. Please check consistency."); } else { success = true; bufferedReader.close(); } } @Override public boolean getSuccess() { return success; } } /* * Copyright (C) 2010-2014 Andreas Maier * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */