content: package edu.stanford.rsl.tutorial.parallel;
  
  import edu.stanford.rsl.conrad.data.numeric.Grid2D;
  import edu.stanford.rsl.conrad.data.numeric.NumericPointwiseOperators;
  import edu.stanford.rsl.tutorial.phantoms.DotsGrid2D;
  import edu.stanford.rsl.tutorial.phantoms.MickeyMouseGrid2D;
  import edu.stanford.rsl.tutorial.phantoms.Phantom;
  import edu.stanford.rsl.tutorial.phantoms.UniformCircleGrid2D;
  import ij.IJ;
  import ij.ImageJ;
  
  
  /**
   * This example can be used to demonstrate Backprojection
   *
   */
  public class ParallelOnlineBackprojectionExample {
  
  	public static void main (String [] args){
  		new ImageJ();
  		
  		int x = 256;
  		int y = 256;
  		// Create a phantom
  		Phantom phan = new DotsGrid2D(x, y);
  		phan = new UniformCircleGrid2D(x, y);
  		//phan = new MickeyMouseGrid2D(x, y);
  		phan.show("The Phantom");
  		
  		// Project forward parallel
  		ParallelProjector2D projector = new ParallelProjector2D(Math.PI-Math.PI/180.0, Math.PI/180.0, 400, 1);
  		Grid2D sinogram = projector.projectRayDriven(phan);
  		sinogram.show("The Sinogram");
  		Grid2D filteredSinogram = new Grid2D(sinogram);
  		
  		Grid2D empty = new Grid2D(x,y);
  		empty.show("Current Reconstruction");
  		
  		// Backproject and show
  		ParallelBackprojector2D backproj = new ParallelBackprojector2D(x, y, 1, 1);
  		for (int i =0; i < filteredSinogram.getSize()[1]; i++){
  			Grid2D toAdd = backproj.backprojectPixelDriven(filteredSinogram, i);
  			//toAdd.show();
  			NumericPointwiseOperators.addBy(empty, toAdd);
  			try {
  				Thread.sleep(100);
  			} catch (InterruptedException e) {
  				// TODO Auto-generated catch block
  				e.printStackTrace();
  			}
  			IJ.run("Enhance Contrast", "0");
  			//return;
  		}
  		System.out.println("Backprojection Done");
  		
  	}
  	
  }
  /*
   * Copyright (C) 2010-2014 Shiyang Hu
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */