In an attempt to feed my family more fresh vegetables, buy locally, and support farming in our area, I joined a CSA a few years ago. I was overcome with wonderful, organically grown fruits and vegetables, BUT I had no idea what half of the produce was. Then, I had to find recipes. This is one of my favorite recipes for June when garlic scapes come in my CSA. Another reason I love making this recipe is that it makes me feel like I am serving a gourmet dish-it looks like something I would see on the menu at local Italian restaurants. We look forward to having this every year.
Combine scapes and olive oil in food processor or mini chopper.
Hand blend in cheese.
Prepare angle hair as directed.
Toast pine nuts for a few minutes in the oven at 350 degrees.
Pour over angle hair.
Garnish with fresh tomatoes, toasted pine nuts, and olives.<filename>critpoint/java/detection/Analyzer.java
package detection;

import aux.Tools;

import java.util.ArrayList;
import java.util.Vector;

/**
 * Created with IntelliJ IDEA.
 * User: miroslav
 * Date: 7/8/13
 * Time: 6:33 PM
 */
public class Analyzer extends Thread  {

    private int begN, endN;

	// input
    public static ArrayList<ArrayList<float[]>> 	profiles;  	// nr. loc x nr.scales
	// aux
	public static ArrayList<double[]> 				startIdx; 	// nr. scales
	public static ArrayList<ArrayList<double[]>> 	finishIdx;  // nr. loc x nr.
    // output
    public static ArrayList<ArrayList<ArrayList<Float>>> peakIdx; // one detection will give ArrayList<Float>, different number of peaks can be detected

    public static int       nrPoints 	= 200;
    public static int       maxIter 	= 20;
    public static double    epsilon 	= 1e-8;
    public static int       h 			= 2;              						// in indexes
    public static double    minD 		= 0.5;     								// separation
    public static int       M = (int) Math.round(0.05*nrPoints);        		// 0.05 of the nrPoints

    public Analyzer (int n0, int n1)
	{
        this.begN = n0;
        this.endN = n1;
    }

    public static void loadProfiles(ArrayList<ArrayList<float[]>> profiles1)
	{

        /*
        profiles
        */
		profiles = new ArrayList<ArrayList<float[]>>(profiles1.size());
		for (int i=0; i<profiles1.size(); i++) {
            ArrayList<float[]> temp = new ArrayList<float[]>(profiles1.get(i).size());
            for (int j=0; j<profiles1.get(i).size(); j++) {

                float[] toAdd = new float[profiles1.get(i).get(j).length];

                for (int k=0; k<toAdd.length; k++ ) {
                    toAdd[k] = profiles1.get(i).get(j)[k];
                }

                temp.add(toAdd);

            }
            profiles.add(temp);
        }

		/*
		peakIdx
		*/
        peakIdx = new ArrayList<ArrayList<ArrayList<Float>>>(profiles.size());
        for (int i=0; i<profiles.size(); i++) {

            ArrayList<ArrayList<Float>> profilesAtLoc = new ArrayList<ArrayList<Float>>(2); // ring A & B, two profiles

            for (int j=0; j<profiles.get(0).size(); j++) {

                ArrayList<Float> peaksForOneProfile = new ArrayList<Float>(4); // max 4
                profilesAtLoc.add(peaksForOneProfile);

            }

            peakIdx.add(profilesAtLoc);

        }

		/*
		finishIdx
		*/
		finishIdx = new ArrayList<ArrayList<double[]>>(profiles.size());
        for (int i=0; i<profiles1.size(); i++) {
            ArrayList<double[]> temp = new ArrayList<double[]>(profiles1.get(i).size());
            for (int j=0; j<profiles1.get(i).size(); j++) {

				double[] toAdd = new double[nrPoints];
                temp.add(toAdd);

            }
			finishIdx.add(temp);
        }

		/*
		startIdx
		 */
		startIdx = new ArrayList<double[]>(profiles.get(0).size());
		for (int j=0; j<profiles.get(0).size(); j++) {

			int profileLength = profiles.get(0).get(j).length;
			double[] startToAdd = new double[nrPoints];

			for (int k=0; k<nrPoints; k++) {
				startToAdd[k] = ((float) k / nrPoints) * profileLength;
			}

			startIdx.add(startToAdd);

		}

    }

	public static float[] extractPeakIdxs(float[] profile1, double[] startPts, double[] finishPts)
	{

		int convPoints = startPts.length;
	    int profileLength = profile1.length;

		for (int k=0; k<convPoints; k++) {
			startPts[k] = ((float) k / convPoints) * profileLength;
		}

		//Tools.runMeanShift(startPts, profile1, maxIter, epsilon, h,	finishPts);
		Tools.runMaxShift(startPts, profile1, maxIter, epsilon, h, finishPts);

	    Vector<float[]> cls = Tools.extractClusters1(finishPts, minD, M, profileLength);

        if (cls.size()==0) return null;

        else if (cls.size()==1) return new float[]{cls.get(0)[0]};

        else if (cls.size()==2) return new float[]{cls.get(0)[0], cls.get(1)[0]};

        else if (cls.size()==3) return new float[]{cls.get(0)[0], cls.get(1)[0], cls.get(2)[0]};

        else if (cls.size()==4) return new float[]{cls.get(0)[0], cls.get(1)[0], cls.get(2)[0], cls.get(3)[0]};

        else return bestN(cls, 4);

	}

	public static ArrayList<Float> extractPeakIdxsList(float[] profile1, double[] start1, double[] finish1)
	{

//		, double[] start11, double[] finish11
//		double[] start11 	= new double[nrPoints];
//		double[] finish11 	= new double[nrPoints];

		int profileLength = profile1.length;

//		for (int k=0; k<nrPoints; k++) {
//			start11[k] = ((float) k / nrPoints) * profileLength;
//		}

		Tools.runMaxShift(start1, profile1, maxIter, epsilon, h, finish1);

		Vector<float[]> cls = Tools.extractClusters1(finish1, minD, M, profileLength);

		if (cls.size()==0) return new ArrayList<Float>();

		else if (cls.size()==1) {
			ArrayList<Float> out = new ArrayList<Float>(1);
			out.add(0, cls.get(0)[0]);
			return out;
		}

		else if (cls.size()==2) {
            ArrayList<Float> out = new ArrayList<Float>(2);
            out.add(0, cls.get(0)[0]);
            out.add(1, cls.get(1)[0]);
            return out;
        }

		else if (cls.size()==3) {
            ArrayList<Float> out = new ArrayList<Float>(3);
            out.add(0, cls.get(0)[0]);
            out.add(1, cls.get(1)[0]);
            out.add(2, cls.get(2)[0]);
            return out;
        }

		else if (cls.size()==4) {
            ArrayList<Float> out = new ArrayList<Float>(4);
            out.add(0, cls.get(0)[0]);
            out.add(1, cl