public CachedProbe(AffyProbe ap, Vector<AffyExperiment> expts) {
   probe = ap;
   min = max = 0.0;
   color = Color.lightGray;
   stroke = new BasicStroke((float) 2.0);
   values = new Vector<Double>();
   for (AffyExperiment e : expts) {
     AffyMeasurement am = e.getMeasurement(probe);
     if (am != null) {
       values.add(am.getValue());
       min = Math.min(am.getValue(), min);
       max = Math.max(am.getValue(), max);
     } else {
       values.add(null);
     }
   }
 }
  public void paintProbe(Graphics2D g2, int x1, int y1, int x2, int y2, double tmin, double tmax) {
    g2.setStroke(stroke);
    g2.setColor(color);

    int ppx = -1, ppy = -1;
    for (int i = 0; i < values.size(); i++) {
      Double v = values.get(i);
      if (v != null && tmax - tmin > 0.0) {
        double frac = (v - tmin) / (tmax - tmin);
        int pixY = y2 - (int) Math.round(frac * (y2 - y1));
        int pixX = x1 + (int) Math.floor((double) (i + 1) / (double) (values.size() + 2));

        if (ppx != -1) {
          g2.drawLine(ppx, ppy, pixX, pixY);
        }

        ppx = pixX;
        ppy = pixY;

      } else {
        ppx = ppy = -1;
      }
    }
  }
 public void addAffyProbe(AffyProbe ap) {
   if (!probes.contains(ap)) {
     probes.add(ap);
   }
 }