public void measureSetting1(MeasurementPlotter mPlot) {
    //        switch (layer) {
    //            case retarderA:
    //                targets = new double[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
    //                break;
    //            case retarderB:
    //                targets = new double[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
    //                break;
    //            case elliptical:
    //                targets = new double[]{0, 0, 0, 0, 0, 0, 0, 0};
    //                break;
    //            case circular:
    //                targets = new double[]{0, 0};
    //                break;
    //            }
    final MultiSectorMeasurer acquireImageAndMeasure = new MultiSectorMeasurer();
    System.out.println("measure setting 1");
    int step = (int) ((SLMModel.startMax - SLMModel.startMin) / SLMModel.numPoints);
    for (int s = 0; s < SLMModel.numPoints; s++) { // for each setting
      int setTo = (int) (SLMModel.startMin + s * step);
      for (int i = 0; i < numIDs; i++) { // for each sector
        settings[i] = setTo;
      }
      acquireImageAndMeasure.run();
      for (int i = 0; i < numIDs; i++) {
        mPlot.recordData(i, s, measurements[i]);
      }
    }

    //        TaskMeasureSetting1 task = new TaskMeasureSetting1(mPlot);
    //        task.execute();
  }
  // <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();
  }
    public void run() {
      try {
        System.out.println("acquireImageAndMeasure");
        for (int i = 0; i < numIDs; i++) {
          // for testing using MockRetarders
          switch (layer) {
            case retarderA:
              slmCtrl.setRetA(i, (int) settings[i]);
              break;
            case retarderB:
              slmCtrl.setRetB(i, (int) settings[i]);
              break;
            case elliptical:
              slmCtrl.setElliptical(i, (int) settings[i]);
              break;
            case circular:
              slmCtrl.setCircular(i, (int) settings[i]);
              break;
          }
        }

        if (!SLMModel.useMockRetarders) {
          Thread.currentThread().sleep(slmModel.getSettlingtime());
          // byte[] data = acqCtrl.acquireSampleImage();
          acqCtrl.acquireImage(data);
          // test
          //                    BufferedImage img =
          // ImageFactoryGrayScale.createImage(acqCtrl.getImageWidth(), acqCtrl.getImageHeight(), 8,
          // (byte[]) data);
          //                    edu.mbl.jif.gui.imaging.FrameImageDisplay id = new
          // edu.mbl.jif.gui.imaging.FrameImageDisplay(img, "Sample");
          //                    id.setVisible(true);

          // measure intensity at ROIs
          ImageStatistics[] iStats =
              measureROIsIn(data, acqCtrl.getImageWidth(), acqCtrl.getImageHeight(), rois);
          iteration++;
          for (int i = 0; i < numIDs; i++) {
            measurements[i] =
                Math.abs(iStats[i].meanInROI - slmModel.getZeroIntensity() - targets[i]);
            if (mPlot != null) {
              mPlot.recordData(i, iteration, measurements[i]);
            }
          }
        } else { // useMockRetarders
          for (int i = 0; i < numIDs; i++) {
            // for testing using MockRetarders
            switch (layer) {
              case retarderA:
                measurements[i] = mockRet[i].calcA(settings[i]);
                break;
              case retarderB:
                measurements[i] = mockRet[i].calcB(settings[i]);
                break;
              case elliptical:
                measurements[i] = mockRet[i].calc(settings[i]);
                break;
              case circular:
                measurements[i] = mockRet[i].calc(settings[i]);
                break;
            }
            if (mPlot != null) {
              mPlot.recordData(i, iteration, measurements[i]);
            }
          }
        }
      } catch (InterruptedException ex) {
        Logger.getLogger(SLM_Calibrator.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    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");
    }