/*
* 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.physics.PhysicalObject;
import edu.stanford.rsl.conrad.utils.CONRAD;
import edu.stanford.rsl.conrad.utils.StatisticsUtil;
import edu.stanford.rsl.jpop.utils.UserUtil;
public class SelectableEnergyMonochromaticAbsorptionModelWithNoise extends
SelectableEnergyMonochromaticAbsorptionModel {
/**
*
*/
private static final long serialVersionUID = -5967404911378538039L;
double photonNumber = 50000;
@Override
public void configure() throws Exception {
try {
photonNumber=UserUtil.queryDouble("Enter Number of photons: ", photonNumber);
super.configure();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public String toString() {
if(configured) return super.toString() + " with " + photonNumber + " photons";
else return "Monochromatic Absorption (select energy) with noise";
}
@Override
public double evaluateLineIntegral(ArrayList<PhysicalObject> segments) {
double lineIntegral = super.evaluateLineIntegral(segments);
double photonsAfterAbsorption = photonNumber * Math.exp(-lineIntegral);
double withNoise = StatisticsUtil.poissonRandomNumber(photonsAfterAbsorption);
double lineIntegralWithNoise = -Math.log(withNoise/photonNumber);
if (Double.isInfinite(lineIntegralWithNoise)) lineIntegralWithNoise = CONRAD.BIG_VALUE;
return lineIntegralWithNoise;
}
public void setPhotonNumber(double photonNumber) {
this.photonNumber = photonNumber;
}
public double getPhotonNumber() {
return photonNumber;
}
}