content: package edu.stanford.rsl.conrad.phantom.workers;
  
  import edu.stanford.rsl.conrad.data.numeric.Grid2D;
  import edu.stanford.rsl.conrad.geometry.trajectories.Trajectory;
  import edu.stanford.rsl.conrad.utils.Configuration;
  import edu.stanford.rsl.conrad.utils.UserUtil;
  import ij.process.FloatProcessor;
  
  /**
   * Phantom to create a Dirac pulse in the center of the projection. Useful to investigate frequency space.
   * 
   * 
   * @author akmaier
   *
   */
  public class DiracProjectionPhantom extends SliceWorker {
  
  	private double alpha = 0.1;
  
  	@Override
  	public void workOnSlice(int k){
  		Trajectory traj = Configuration.getGlobalConfiguration().getGeometry();
  		int dimx = traj.getReconDimensionX();
  		int dimy = traj.getReconDimensionY();
  		FloatProcessor fl = new FloatProcessor(dimx, dimy);
  		int width = fl.getWidth();
  		int height = fl.getHeight();
  		for (int j = 0; j < height; j++){
  			for (int i = 0; i < width; i++) {
  				fl.putPixelValue(i, j, (1.0 - (Math.abs((0.0 + height / 2) - j) / (height / 2))) *  diracFunction(i - (width/2) - k, alpha));
  			}
  		}
  		Grid2D grid = new Grid2D((float[])fl.getPixels(), fl.getWidth(), fl.getHeight());
  		this.imageBuffer.add(grid, k);
  	}
  
  	/**
  	 * Evaluates the delta function at x given alpha.
  	 * @param x the x coordinate
  	 * @param alpha the shape of the pulse
  	 * @return value
  	 */
  	public static double diracFunction(double x, double alpha){
  		return Math.exp(- (x * x) / (alpha * alpha)) / (alpha * Math.sqrt(Math.PI));
  	}
  
  	@Override
  	public String toString(){
  		return "Dirac Projection Phantom";
  	}
  
  	@Override
  	public String getBibtexCitation() {
  		String bibtex = "@BOOK{Dirac58-TPO,\n" +
  		"  author = {{Dirac}, P. A. M.},\n" +
  		"  title = {{Principles of Quantum Mechanics}},\n" +
  		"  publisher = {Oxford University Press Inc.},\n" +
  		"  address = {New York, NY, United States},\n" +
  		"  year = {1958}\n" +
  		"}";
  		return bibtex;
  	}
  
  	@Override
  	public String getMedlineCitation() {
  		return "Dirac PAM, Principles of Quantum Mechanics, Oxford University Press Inc., New York, NY, United States, 1958.";
  	}
  
  	@Override
  	public void configure() throws Exception {
  		alpha = UserUtil.queryDouble("Enter alpha: ", alpha);
  		super.configure();
  	}
  
  	@Override
  	public SliceWorker clone() {
  		DiracProjectionPhantom clone = new DiracProjectionPhantom();
  		clone.alpha = alpha;
  		return clone;
  	}
  
  
  	@Override
  	public String getProcessName() {
  		return toString();
  	}
  
  
  }
  /*
   * Copyright (C) 2010-2014 Andreas Maier
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */