/* * Copyright (C) 2010-2014 Andreas Maier, Rotimi X Ojo * 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.utils.CONRAD; /** * Creates a absorption model for monochromatic projections * @author Rotimi X Ojo */ public class DensityAbsorptionModel extends AbsorptionModel { /** * */ private static final long serialVersionUID = 7805745771273109739L; public double evaluateLineIntegral(ArrayList<PhysicalObject> segments) { double sum = 0; for (PhysicalObject o: segments){ double att = o.getMaterial().getDensity(); double len = ((Edge)o.getShape()).getLength(); sum += att * len; } // 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/mc^3] = [g*0.1cm/cm^3] to [g/cm^2] // double t = sum/10.0; double t = sum; if(t < CONRAD.SMALL_VALUE){ return 0; } return t; } @Override public String toString() { return "Density as Attenuation Model"; } @Override public void configure() throws Exception { } @Override public boolean isConfigured() { return true; } }