import edu.stanford.rsl.conrad.physics.EnergyDependentCoefficients;
import edu.stanford.rsl.conrad.physics.XRaySpectrum;
import edu.stanford.rsl.conrad.physics.EnergyDependentCoefficients.Material;
import edu.stanford.rsl.conrad.utils.BilinearInterpolatingDoubleArray;
import edu.stanford.rsl.conrad.utils.Configuration;
import edu.stanford.rsl.conrad.utils.LinearInterpolatingDoubleArray;
import edu.stanford.rsl.conrad.utils.UserUtil;
import edu.stanford.rsl.conrad.utils.VisualizationUtil;
import ij.plugin.PlugIn;
public class Generate_Beam_Hardening_Lookup_Table implements PlugIn{
public Generate_Beam_Hardening_Lookup_Table (){
}
@Override
public void run(String arg) {
try {
// get Stats for the spectrum
double min = UserUtil.queryDouble("Minimum [keV]", 10);
double max = UserUtil.queryDouble("Maximum [keV]", 150);
double delta = UserUtil.queryDouble("Delta [keV]", 0.5);
double maxWater = UserUtil.queryDouble("Maximal observed accumulated attenuation in the water corrected image: ", 15);
double maxPassedMaterial = UserUtil.queryDouble("Maximal observed accumulated attenuation in the hard material: ", 3);
double stepSize = UserUtil.queryDouble("Step size for the sampling of the lookup table: ", 0.01);
// Query the materials
Material material = UserUtil.queryMaterial("Please Select the soft Material:", "Material Selection");
LinearInterpolatingDoubleArray lutSoft = EnergyDependentCoefficients.getPhotonMassAttenuationLUT(material);
material = UserUtil.queryMaterial("Please Select the hard Material:", "Material Selection");
LinearInterpolatingDoubleArray lutHard = EnergyDependentCoefficients.getPhotonMassAttenuationLUT(material);
// sample the x-ray spectrum
int steps = (int) ((max - min) / delta);
double [] energies = new double [steps];
for (int i = 0; i < steps; i ++){
energies[i] = min + (i*delta);
}
double [] spectrum = XRaySpectrum.generateXRaySpectrum(energies, 120, "W", 1, 1, 12, 2.38, 3.06, 2.66, 10.5);
BilinearInterpolatingDoubleArray beamHardeningLut = EnergyDependentCoefficients.getBeamHardeningLookupTable(maxWater, maxPassedMaterial, stepSize, energies, spectrum, lutSoft, lutHard);
Configuration.getGlobalConfiguration().setBeamHardeningLookupTable(beamHardeningLut);
VisualizationUtil.showImageProcessor(beamHardeningLut.toFloatProcessor(2048, 512), "Generated Beam Hardening Lookup Table");
} 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).
*/