package edu.stanford.rsl.conrad.utils;
import ij.io.FileInfo;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class DicomConfigurationUpdater implements ConfigurationUpdater {
private Configuration config;
private String filename = null;
public Configuration getConfiguration() {
return config;
}
public void readConfigFromDICOM(String filename) throws IOException{
String directory = new File(filename).getParent();
String fileName = new File(filename).getName();
DicomDecoder dd = new DicomDecoder(directory, fileName);
dd.setInputStream(new BufferedInputStream(new FileInputStream(directory + "/" + fileName)));;
FileInfo fi = dd.getFileInfo();
if (fi.width == 616) fi.width = 620;
config.getGeometry().setDetectorWidth(fi.width);
config.getGeometry().setDetectorHeight(fi.height);
dd.setInputStream(new BufferedInputStream(new FileInputStream(directory + "/" + fileName)));;
//System.out.println(dd.getDicomInfo());
String [] lines = dd.getDicomInfo().split("\n");
for (String line: lines){
if (line.contains("Positioner Primary Angle Increment:")){
double [] angles = parseDICOMFieldForDoubleArray(line);
config.getGeometry().setPrimaryAngleArray(angles);
config.getGeometry().setAverageAngularIncrement(DoubleArrayUtil.computeAverageIncrement(angles));
}
if (line.contains("Positioner Secondary Angle Increment:")){
config.getGeometry().setSecondaryAngleArray(parseDICOMFieldForDoubleArray(line));
}
if (line.contains("Imager Pixel Spacing:")){
double [] pixelSpacing = parseDICOMFieldForDoubleArray(line);
config.getGeometry().setPixelDimensionX(pixelSpacing[0]);
config.getGeometry().setPixelDimensionY(pixelSpacing[1]);
}
if (line.contains("Number of Frames:")){
config.getGeometry().setProjectionStackSize((int) parseDICOMFieldForDouble(line));
}
if (line.contains("Intensifier Size:")){
config.setIntensifierSize((int) parseDICOMFieldForDouble(line));
}
if (line.contains("Distance Source to Patient:")){
config.getGeometry().setSourceToAxisDistance(parseDICOMFieldForDouble(line));
}
if (line.contains("Distance Source to Detector:")){
config.getGeometry().setSourceToDetectorDistance(parseDICOMFieldForDouble(line));
}
if (line.contains("Device Serial Number:")){
int number = (int) parseDICOMFieldForDouble(line);
config.setDeviceSerialNumber("" + number);
}
}
}
private double [] parseDICOMFieldForDoubleArray(String line){
String [] preprocess = line.split("\\\\");
String [] temp = preprocess[0].split(" ");
preprocess[0] = temp[temp.length -1];
double [] revan = new double [preprocess.length];
for (int i = 0; i < revan.length; i++){
revan[i] = Double.parseDouble(preprocess[i]);
}
return revan;
}
private double parseDICOMFieldForDouble(String line){
String [] preprocess = line.split(" ");
return Double.parseDouble(preprocess[preprocess.length - 1]);
}
public void readConfiguration() {
try {
readConfigFromDICOM(filename);
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
}
}
public void setConfiguration(Configuration config) {
this.config = config;
}
public Configuration getConfig() {
return config;
}
public void setConfig(Configuration config) {
this.config = config;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/