content: package edu.stanford.rsl.apps.gui.roi;
  
  
  import ij.IJ;
  import ij.gui.Plot;
  import ij.gui.PointRoi;
  
  import edu.stanford.rsl.conrad.utils.DoubleArrayUtil;
  import edu.stanford.rsl.conrad.utils.FFTUtil;
  import edu.stanford.rsl.conrad.utils.UserUtil;
  import edu.stanford.rsl.conrad.utils.VisualizationUtil;
  
  
  public class Measure2DBeadMTFAngularRange extends Measure3DBeadMTF {
  
  	double r = 16, start=-15, end=15;
  	int sizeOfBead = 10;
  
  	@Override
  	public Object evaluate() {
  		if (configured) {
  			if (roi instanceof PointRoi){
  				PointRoi point = (PointRoi) roi;
  				double [] sum = null;
  				double min = 0;
  				double max = 0;
  				int px = point.getBounds().x;
  				int py = point.getBounds().y;
  				int pz = image.getCurrentSlice()-1;
  				int smallstep = 1;
  				for (int i = (int) start; i < end; i++){
  					double beta = ((i*smallstep) / 180.0) * Math.PI;
  					// direction vector
  					double x = r * Math.cos(beta);
  					double y = r * Math.sin(beta);
  					double z = 0;
  					// Interpolate along line
  					double [] pixels = getPixels(image, px, px+x, py,py+y,pz,pz+z, (int) (2*r));
  					double [] minmax = DoubleArrayUtil.minAndMaxOfArray(pixels);
  					min += minmax[0];
  					max += minmax[1];
  					double [] mtf = computeMTF(pixels, pixels.length * 16);
  					if (sum == null){
  						sum = mtf;
  					} else {
  						DoubleArrayUtil.add(sum, mtf);
  					}
  				}
  				double steps = Math.abs(end - start);
  				DoubleArrayUtil.divide(sum, steps);
  				min /= steps;
  				max /= steps;
  				double range = max - min;
  				System.out.println("MTF:");
  				for (int i=0; i<(sum.length/4); i++) {
  					System.out.println(FFTUtil.abs(i, sum));
  				}
  				double pixelSize = image.getCalibration().pixelWidth;
  				double [] measuredFrequencies = computeComplexFrequencies(sum, pixelSize);
  				double cutOffFrequency = 1.0 / (2*sizeOfBead*pixelSize);
  				int cutOffIndex = 0;
  				for (int i = 0; i < measuredFrequencies.length; i++){
  					if (measuredFrequencies[i]> cutOffFrequency) {
  						cutOffIndex = i;
  						break;
  					}
  				}
  				double mtf [] = new double[cutOffIndex];
  				double xValues [] = new double[cutOffIndex];
  				double modelmtf [] = computeModelMTF(sum, range,sizeOfBead); 
  				for(int i=0; i< cutOffIndex;i++){
  					mtf[i] = FFTUtil.abs(i, sum)/ FFTUtil.abs(i, modelmtf);
  					xValues[i] = measuredFrequencies[i]; 
  				}
  				Plot plot = VisualizationUtil.createPlot(xValues, mtf, "2D Bead MTF of " + image.getTitle(), "Frequency", "Power");
  				try{
  					plot.show();
  				} catch (Exception e){
  
  				}
  			}
  		}
  		return null;
  	}
  
  	@Override
  	public void configure() throws Exception {
  		image = IJ.getImage();
  		roi = image.getRoi();
  		if (roi != null){
  			r = UserUtil.queryDouble("Radius in pixels: ", r);
  			sizeOfBead = UserUtil.queryInt("Size of Bead in [px]: ", sizeOfBead);
  			start = UserUtil.queryDouble("start angle (deg): ", start);
  			end = UserUtil.queryDouble("end angle (deg): ", end);
  			configured = true;
  		}
  	}
  
  	@Override
  	public String toString() {
  		return "Measure 2D Bead MTF in an angular interval";
  	}
  
  
  }
  
  /*
   * Copyright (C) 2010-2014 - Andreas Maier 
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */
  