// <editor-fold defaultstate="collapsed" desc=">>>--- Minimizations... ---<<<" >
  public void minimizeToTargets(
      double[] startMin,
      double[] startMax,
      double tol,
      double[] targets,
      MeasurementPlotter mPlot) {
    // AcquireAndMeasure waits for all minimizers to send next setting,
    // using CyclicBarrier, then aquires an image, measures all the roi's,
    // then returns measurement to each minimizer.
    //
    // This is where the target retarder is indicated...
    // For balancing intensity (settings 2-4), pass in the setting1 intensities
    // in targets[]

    acqCtrl.start();

    MultiSectorMeasurer acquireImageAndMeasure = new MultiSectorMeasurer(mPlot);
    this.targets = targets;
    barrier = new CyclicBarrier(numIDs, acquireImageAndMeasure);

    final MinimizeFunction function = new MinimizeFunction();

    stopSignal = new CountDownLatch(numIDs);

    // create and launch minimizations
    minimizations = new BrentsMethod_IntDouble[numIDs];
    for (int i = 0; i < numIDs; i++) {
      minimizations[i] = new BrentsMethod_IntDouble(function, stopSignal);
    }

    for (int i = 0; i < numIDs; i++) {
      createMinimizationThread(i, startMin[i], startMax[i], tol);
    }
    // Await completion of all of the minimizations- CountDownLatch is released...
    System.out.println("* Waiting for stopSignal...");
    try {
      stopSignal.await();
    } catch (InterruptedException ex) {
      ex.printStackTrace();
    }

    System.out.println(">>>>> All minimizations done <<<<<");
    for (int i = 0; i < numIDs; i++) {
      // measurements[i] = minimizations[i].getMinX();
      System.out.println("    " + i + " setting: " + settings[i] + ", measure: " + measurements[i]);
    }

    mPlot.closeTextFile();
    acqCtrl.finish();
  }
    private void normalize(DataSet[] dataSets) {
      double[] max = new double[numIDs];

      // find max
      for (int i = 0; i < numIDs; i++) {
        for (int j = 0; j < SLMModel.numPoints; j++) {
          if (max[i] < dataSets[i].getMeasurement(j)) {
            max[i] = dataSets[i].getMeasurement(j);
          }
        }
      }
      // normalize
      for (int i = 0; i < numIDs; i++) {
        for (int j = 0; j < SLMModel.numPoints; j++) {
          dataSets[i].measurement[j] = dataSets[i].measurement[j] / max[i];
        }
      }
      // dumpDataSet();

      // Plot & record Normalized Intensity
      for (int i = 0; i < numIDs; i++) {
        System.out.println("\n" + ">>>>>>> ID: " + i);
        for (int j = 0; j < SLMModel.numPoints; j++) {
          System.out.println(dataSets[i].setting[j] + " => " + dataSets[i].measurement[j]);
          double s = dataSets[i].getSetting(j);
          double m = dataSets[i].getMeasurement(j);
          mNPlot.recordData(i, j, s, m);
        }
      }
      mNPlot.closeTextFile();
      writeOutMatrix(dataSets, "Normalized");

      // Plot & record RetardanceCurve
      for (int i = 0; i < numIDs; i++) {
        System.out.println("\n" + ">>>>>>> ID: " + i);
        double lastValue = 0;
        boolean inSection1 = true;
        boolean inSection2 = false;
        boolean inSection3 = false;
        for (int j = 0; j < SLMModel.numPoints; j++) {
          System.out.println(dataSets[i].setting[j] + " => " + dataSets[i].measurement[j]);
          double s = dataSets[i].getSetting(j);
          double m = dataSets[i].getMeasurement(j);
          if (inSection1 && (lastValue > m)) {
            inSection1 = false;
            inSection2 = true;
          }
          if (inSection2 && (lastValue < m)) {
            inSection2 = false;
            inSection3 = true;
          }
          lastValue = m;
          double ret = 0;
          if (inSection1) {
            ret = 3.0 * Math.PI - 2 * Math.asin(Math.sqrt(m));
          }
          if (inSection2) {
            ret = Math.PI + 2 * Math.asin(Math.sqrt(m));
          }
          if (inSection3) {
            ret = Math.PI - 2 * Math.asin(Math.sqrt(m));
          }

          mNPlot.recordData(i, j, s, ret);

          dataSets[i].measurement[j] = ret;
        }
      }
      mNPlot.closeTextFile();

      writeOutMatrix(dataSets, "Retardance");
    }