package edu.stanford.rsl.tutorial.parallel;

import edu.stanford.rsl.conrad.data.numeric.Grid2D;
import edu.stanford.rsl.tutorial.filters.RamLakKernel;
import edu.stanford.rsl.tutorial.phantoms.DotsGrid2D;
import edu.stanford.rsl.tutorial.phantoms.Phantom;
import ij.ImageJ;

/**
 * This is a simple example of a parallel-beam reconstruction.
 * First, a phantom is created. Then we generate parallel projections using a parallel projector.
 * This allows us to visualize the sinogram.
 * For reconstruction, we filter the sinogram for every detector row.
 * Then, the sinogram is backprojected.
 * 
 * @author Shiyang Hu
 *
 */
public class ParallelReconExample {

	public static void main (String [] args){
		new ImageJ();
		
		int x = 200;
		int y = 200;
		// 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, 400, 1);
		Grid2D sinogram = projector.projectRayDrivenCL(phan);
		sinogram.show("The Sinogram");
		Grid2D filteredSinogram = new Grid2D(sinogram);
		
		
		// Filter with RamLak
		RamLakKernel ramLak = new RamLakKernel(400, 1);
		for (int theta = 0; theta < sinogram.getSize()[1]; ++theta) {
			ramLak.applyToGrid(filteredSinogram.getSubGrid(theta));
		}
		filteredSinogram.show("The Filtered Sinogram");
		
		// Backproject and show
		ParallelBackprojector2D backproj = new ParallelBackprojector2D(200, 200, 1, 1);
		backproj.backprojectPixelDriven(filteredSinogram).show("The Reconstruction");
		
	}
	
}
/*
 * Copyright (C) 2010-2014 Shiyang Hu
 * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/