content: /*
   * 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.io.IOException;
  import java.io.Serializable;
  import java.util.ArrayList;
  
  import edu.stanford.rsl.apps.gui.GUIConfigurable;
  import edu.stanford.rsl.conrad.physics.PhysicalObject;
  import edu.stanford.rsl.conrad.utils.CONRAD;
  
  
  /**
   * Creates a absorption model for the projection. Note that the absorption model is also able to model
   * multi-channel data for multi-material or multi-energy applications.
   * 
   * @author Rotimi X Ojo
   * @author Andreas Maier
   */
  public abstract class AbsorptionModel implements GUIConfigurable, Serializable {
  	/**
  	 * 
  	 */
  	private static final long serialVersionUID = -6082919111796044239L;
  	public static int COHERENT_SCATTER = 1;
  	public static int INCOHERENT_SCATTER = 2;
  
  	/**
  	 * Evaluates the absorption along the line integral according to the model.
  	 * @param segments
  	 * @return the integral value
  	 */
  	public abstract double evaluateLineIntegral(ArrayList<PhysicalObject> segments);		
  
  	@Override
  	public abstract String toString();
  
  	
  	/**
  	 * Creates an array of all known absorption models known in the current ClassLoader.
  	 * 
  	 * @return the absorption model array
  	 */
  	public static AbsorptionModel[] getAvailableAbsorptionModels(){
  		AbsorptionModel[] aList = null;
  		if (aList ==null) {
  			try {
  				ArrayList<Object> list = CONRAD.getInstancesFromConrad(AbsorptionModel.class);
  				aList = new AbsorptionModel[list.size()];
  				for (int i = 0; i < list.size(); i++){
  					aList[i] = (AbsorptionModel) list.get(i);
  				}
  			} catch (ClassNotFoundException e) {
  				// TODO Auto-generated catch block
  				e.printStackTrace();
  			} catch (IOException e) {
  				// TODO Auto-generated catch block
  				e.printStackTrace();
  			}
  		}
  		return aList;
  	}
  
  	/**
  	 * Method that is notified once the rendering process using this AbsorptionModel is finished.
  	 * This method is intended to be used with AbsorptionModels that collect information about the
  	 * rendering process. For example a histogram of path lengths could be stored in an AbsortionModel
  	 * and in this call the result could be stored in the registry or a certain file.
  	 * <br>
  	 * The default implementation just does nothing. 
  	 */
  	public void notifyEndOfRendering(){	
  	}
  	
  }
  