/*
* Copyright (C) 2014 Andreas Maier, Maximilian Dankbar
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/
package edu.stanford.rsl.conrad.physics.absorption;
import java.util.ArrayList;
import edu.stanford.rsl.conrad.geometry.shapes.simple.Edge;
import edu.stanford.rsl.conrad.physics.PhysicalObject;
import edu.stanford.rsl.conrad.physics.materials.utils.AttenuationType;
import edu.stanford.rsl.jpop.utils.UserUtil;
public class SelectableEnergyMonochromaticAbsorptionModel extends
AbsorptionModel {
/**
*
*/
private static final long serialVersionUID = 7218141334431913465L;
/**
* Energy [keV]
*/
double energy = 80;
boolean configured = false;
public SelectableEnergyMonochromaticAbsorptionModel(){
super();
}
@Override
public double evaluateLineIntegral(ArrayList<PhysicalObject> segments) {
//outputSpectrum = new PolychromaticXRaySpectrum();
double sum = 0;
for (PhysicalObject o: segments){
double att = o.getMaterial().getAttenuation(energy,AttenuationType.TOTAL_WITH_COHERENT_ATTENUATION);
double len = ((Edge)o.getShape()).getLength();
sum += att * len;
}
if(sum < 0){
sum = 0;
}
// TODO: Normalization is never considered in the backprojectors,
// thus, iteratively applying forward and backward projections
// would yield to a scaling issue!
//
// length is in [mm]
// attenuation is in [g/cm^3]
// conversion from [g*mm/cm^3] = [g*0.1cm/cm^3] to [g/cm^2]
// --> sum/10.0;
return sum / 10;
}
@Override
public String toString() {
if(configured) return "Monochromatic Absorption ("+energy+" keV)";
else return "Monochromatic Absorption (select energy)";
}
@Override
public void configure() throws Exception {
try {
energy=UserUtil.queryDouble("Enter energy in [keV]: ", energy);
configured = true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void configure(double energy){
this.energy=energy;
configured = true;
}
@Override
public boolean isConfigured() {
return configured;
}
public void setEnergy(double energy) {
this.energy = energy;
}
public double getEnergy() {
return energy;
}
public void setConfigured(boolean configured) {
this.configured = configured;
}
}