Index: /trunk/Ohana/src/opihi/cmd.astro/imfit-qrgauss.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.astro/imfit-qrgauss.c	(revision 4419)
+++ /trunk/Ohana/src/opihi/cmd.astro/imfit-qrgauss.c	(revision 4420)
@@ -44,4 +44,36 @@
 }
 
+float qrgaussTD (float x, float y, float *par, int Npar, float *dpar) {
+
+  float X, Y, px, py;
+  float z, r, q, f;
+
+  X = x - par[0];
+  Y = y - par[1];
+  
+  px = par[2]*X;
+  py = par[3]*Y;
+
+  z = 0.5*SQ(px) + 0.5*SQ(py) + par[4]*X*Y;
+
+  r = 1.0 / (1 + fpar[0]*z + pow(z,par[7]));
+  f = par[5]*r + par[6];
+  q = par[5]*SQ(r)*(fpar[0] + par[7]*pow(z,(par[7]-1)));
+
+  if (dpar != NULL) {
+    dpar[0] = q*(2*px*par[2] + par[4]*Y);
+    dpar[1] = q*(2*py*par[3] + par[4]*X);
+    dpar[2] = -2*q*px*X*2;
+    dpar[3] = -2*q*py*Y*2;
+    dpar[4] = -q*X*Y;
+    dpar[5] = +r;
+    dpar[6] = +1;
+    dpar[7] = -5*par[5]*SQ(r)*log(z)*pow(z,par[7]);
+  }
+  return (f);
+}
+
+
+# if (0)
 /* one component, two slopes: (1 + z^M + z^N)^(-1) -- x, y, sx, sy, sxy, I, sky, sr */
 float qrgaussTD (float x, float y, float *par, int Npar, float *dpar) {
@@ -76,3 +108,3 @@
   return (f);
 }
-
+# endif
Index: /trunk/Ohana/src/opihi/dvo/.dvo
===================================================================
--- /trunk/Ohana/src/opihi/dvo/.dvo	(revision 4419)
+++ /trunk/Ohana/src/opihi/dvo/.dvo	(revision 4420)
@@ -0,0 +1,1 @@
+avextract -phothelp
Index: /trunk/Ohana/src/opihi/dvo/avextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/avextract.c	(revision 4419)
+++ /trunk/Ohana/src/opihi/dvo/avextract.c	(revision 4420)
@@ -50,7 +50,5 @@
   if (param == AVE_ZERO) {
     if (!GetPhotcodeInfo (argv[2], &code, &mode)) {
-      GetAverageParam ("help");
-      fprintf (stderr, "value may also be a valid photcode\n");
-      fprintf (stderr, "photcodes or 'mag' may have optional magnitude mode: mag,[Mave, Mref]\n");
+      GetAverageParamHelp ();
       goto escape;
     }
Index: /trunk/Ohana/src/opihi/dvo/dmagaves.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dmagaves.c	(revision 4419)
+++ /trunk/Ohana/src/opihi/dvo/dmagaves.c	(revision 4420)
@@ -41,5 +41,8 @@
   if (!GetPhotcodeInfo (argv[1], &code[0], &mode[0])) return (FALSE);
   if (!GetPhotcodeInfo (argv[3], &code[1], &mode[1])) return (FALSE);
-  if ((param = GetAverageParam (argv[5])) == AVE_ZERO) return (FALSE);
+  if ((param = GetAverageParam (argv[5])) == AVE_ZERO) {
+    GetAverageParamHelp ();
+    return (FALSE);
+  }
   code[2] = GetPhotcodeEquivbyCode (code[0][0].code);
   mode[2] = mode[0];
Index: /trunk/Ohana/src/opihi/dvo/photometry.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/photometry.c	(revision 4419)
+++ /trunk/Ohana/src/opihi/dvo/photometry.c	(revision 4420)
@@ -48,4 +48,6 @@
 static double iMagMin;
 static int FlagSelect, FlagValue;
+static int TypefracSelect, TypefracType, TypefracSign;
+static double TypefracValue;
 
 /* applied to Average quantities */
@@ -237,11 +239,22 @@
   if (!strcasecmp (parname, "flag"))  param = AVE_FLAG;
   if (!strcasecmp (parname, "type"))  param = AVE_TYPE;
+  if (!strcasecmp (parname, "typefrac")) {
+    if (!TypefracType) {
+      fprintf (stderr, "typefrac needs to specify type to use\n");
+      return (param);
+    }
+    param = AVE_TYPEFRAC;
+  }
   if (!strcasecmp (parname, "Nphot")) param = AVE_NPHOT;
   if (!strcasecmp (parname, "Ncode")) param = AVE_NCODE;
-  if (!strcasecmp (parname, "help")) {
-    fprintf (stderr, "value may be one of the following:\n");
-    fprintf (stderr, " ra dec dmag Nmeas Nmiss Xm Xp Nphot Ncode flag type\n");
-  }
   return (param);
+}
+
+void GetAverageParamHelp () {
+  fprintf (stderr, "value may be one of the following:\n");
+  fprintf (stderr, " ra dec dmag Nmeas Nmiss Xm Xp Nphot Ncode flag type typefrac\n\n");
+  fprintf (stderr, "value may also be a valid photcode\n");
+  fprintf (stderr, "photcodes or 'mag' may have optional magnitude mode: mag,[Mave, Mref]\n");
+  return;
 }
 
@@ -253,19 +266,19 @@
   
   switch (mode) {
-  case MEAS_XCCD:
-  case MEAS_YCCD:
-    break;
-  case MEAS_XMOSAIC: 
-  case MEAS_YMOSAIC:
-    /* mosaic defines a frame with 0,0 at the mosaic center, and 1 arcsec / pixel */
-    mosaic.crpix1 = mosaic.crpix2 = 0.0;
-    mosaic.cdelt1 = mosaic.cdelt2 = 1.0 / 3600;
-    mosaic.pc1_1  = mosaic.pc2_2  = 1.0;
-    mosaic.pc1_2  = mosaic.pc2_1  = 0.0;
-    mosaic.Npolyterms = 0;
-    strcpy (mosaic.ctype, "RA---SIN");
-    break;
-  default:
-    return (TRUE);
+    case MEAS_XCCD:
+    case MEAS_YCCD:
+      break;
+    case MEAS_XMOSAIC: 
+    case MEAS_YMOSAIC:
+      /* mosaic defines a frame with 0,0 at the mosaic center, and 1 arcsec / pixel */
+      mosaic.crpix1 = mosaic.crpix2 = 0.0;
+      mosaic.cdelt1 = mosaic.cdelt2 = 1.0 / 3600;
+      mosaic.pc1_1  = mosaic.pc2_2  = 1.0;
+      mosaic.pc1_2  = mosaic.pc2_1  = 0.0;
+      mosaic.Npolyterms = 0;
+      strcpy (mosaic.ctype, "RA---SIN");
+      break;
+    default:
+      return (TRUE);
   }
 
@@ -418,4 +431,26 @@
   }
 
+  /* select on measurement type: 1,2,3 (AVERAGE ONLY) */
+  TypefracType = 0;
+  if (N = get_argument (*argc, argv, "-usetype")) {
+    remove_argument (N, argc, argv);
+    TypefracType = atoi (argv[N]);
+    remove_argument (N, argc, argv);
+  }
+
+  /* select on measurement type: 1,2,3 (AVERAGE ONLY) */
+  TypefracSelect = FALSE;
+  if (N = get_argument (*argc, argv, "-typefrac")) {
+    remove_argument (N, argc, argv);
+    TypefracType  = atoi (argv[N]);
+    remove_argument (N, argc, argv);
+    TypefracValue = fabs (atof (argv[N]));
+    TypefracSign = 0;
+    if (argv[N][0] == '-') TypefracSign = -1;
+    if (argv[N][0] == '+') TypefracSign = +1;
+    remove_argument (N, argc, argv);
+    TypefracSelect = TRUE;
+  }
+
   /* select by number of measurements (AVERAGE ONLY) */
   NphotSelect = FALSE;
@@ -474,5 +509,5 @@
 
   /* chisq, fwhm, Nphot, Ncode */
-  if (!TestAverage (code, average, secfilt, measure)) return (list);
+  /* if (!TestAverage (code, average, secfilt, measure)) return (list); */
 
   /* look for measures */
@@ -490,85 +525,85 @@
     value = 0;
     switch (param) {
-    case MEAS_MAG: /* magnitudes are already determined above */
-      value = M;
-      break;
-    case MEAS_RA: /* OK */
-      value = average[0].R - measure[i].dR / 360000.0;
-      break;
-    case MEAS_DEC: /* OK */
-      value = average[0].D - measure[i].dD / 360000.0;
-      break;
-    case MEAS_dMAG: /* OK */
-      value = 0.001*measure[i].dM;
-      break;
-    case MEAS_AIRMASS: /* OK */
-      value = 0.001*measure[i].airmass;
-      break;
-    case MEAS_EXPTIME: /* OK */
-      value = pow (10.0, measure[i].dt * 0.0004);
-      break;
-    case MEAS_PHOTCODE: /* OK */
-      value = measure[i].source;
-      break;
-    case MEAS_TIME: /* OK */
-      value = TimeValue (measure[i].t, TimeReference, TimeFormat);
-      break;
-    case MEAS_dR: /* OK */
-      value = 0.01*measure[i].dR;
-      break;
-    case MEAS_dD: /* OK */
-      value = 0.01*measure[i].dD;
-      break;
-    case MEAS_FWHM: /* OK */
-      value = 0.01*measure[i].FWx;
-      break;
-    case MEAS_DOPHOT: /* OK */
-      value = measure[i].dophot;
-      break;
-    case MEAS_FLAGS: /* ? */
-      value = measure[i].flags;
-      break;
-    case MEAS_XCCD: /* OK */
-      ra  = average[0].R - measure[i].dR / 360000.0;
-      dec = average[0].D - measure[i].dD / 360000.0;
-      m = match_image_subset (image, subset, Nsubset, measure[i].t, measure[i].source);
-      if (m == -1) break;
-      if (!FindMosaicForImage (image, Nimage, m)) break;
-      RD_to_XY (&x, &y, ra, dec, &image[m].coords);
-      value = x;
-      break;
-    case MEAS_YCCD: /* OK */
-      ra  = average[0].R - measure[i].dR / 360000.0;
-      dec = average[0].D - measure[i].dD / 360000.0;
-      m = match_image_subset (image, subset, Nsubset, measure[i].t, measure[i].source);
-      if (m == -1) break;
-      if (!FindMosaicForImage (image, Nimage, m)) break;
-      RD_to_XY (&x, &y, ra, dec, &image[m].coords);
-      value = y;
-      break;
-    case MEAS_XMOSAIC: /* OK */
-      ra  = average[0].R - measure[i].dR / 360000.0;
-      dec = average[0].D - measure[i].dD / 360000.0;
-      m = match_image_subset (image, subset, Nsubset, measure[i].t, measure[i].source);
-      if (m == -1) break;
-      /* this should use the mosaic assoicated with the image */
-      /* the solution here depends on image.coords having crref1,2 set to match the boresite center */
-      /* XXX set the mosaic.coords to have a unity WRP transformation in which x,y = ra,dec */
-      mosaic.crval1 = image[m].coords.crval1;
-      mosaic.crval2 = image[m].coords.crval2;
-      RD_to_XY (&x, &y, ra, dec, &mosaic);
-      value = x;
-      break;
-    case MEAS_YMOSAIC: /* OK */
-      ra  = average[0].R - measure[i].dR / 360000.0;
-      dec = average[0].D - measure[i].dD / 360000.0;
-      m = match_image_subset (image, subset, Nsubset, measure[i].t, measure[i].source);
-      if (m == -1) break;
-      /* same comments as above */
-      mosaic.crval1 = image[m].coords.crval1;
-      mosaic.crval2 = image[m].coords.crval2;
-      RD_to_XY (&x, &y, ra, dec, &mosaic);
-      value = y;
-      break;
+      case MEAS_MAG: /* magnitudes are already determined above */
+	value = M;
+	break;
+      case MEAS_RA: /* OK */
+	value = average[0].R - measure[i].dR / 360000.0;
+	break;
+      case MEAS_DEC: /* OK */
+	value = average[0].D - measure[i].dD / 360000.0;
+	break;
+      case MEAS_dMAG: /* OK */
+	value = 0.001*measure[i].dM;
+	break;
+      case MEAS_AIRMASS: /* OK */
+	value = 0.001*measure[i].airmass;
+	break;
+      case MEAS_EXPTIME: /* OK */
+	value = pow (10.0, measure[i].dt * 0.0004);
+	break;
+      case MEAS_PHOTCODE: /* OK */
+	value = measure[i].source;
+	break;
+      case MEAS_TIME: /* OK */
+	value = TimeValue (measure[i].t, TimeReference, TimeFormat);
+	break;
+      case MEAS_dR: /* OK */
+	value = 0.01*measure[i].dR;
+	break;
+      case MEAS_dD: /* OK */
+	value = 0.01*measure[i].dD;
+	break;
+      case MEAS_FWHM: /* OK */
+	value = 0.01*measure[i].FWx;
+	break;
+      case MEAS_DOPHOT: /* OK */
+	value = measure[i].dophot;
+	break;
+      case MEAS_FLAGS: /* ? */
+	value = measure[i].flags;
+	break;
+      case MEAS_XCCD: /* OK */
+	ra  = average[0].R - measure[i].dR / 360000.0;
+	dec = average[0].D - measure[i].dD / 360000.0;
+	m = match_image_subset (image, subset, Nsubset, measure[i].t, measure[i].source);
+	if (m == -1) break;
+	if (!FindMosaicForImage (image, Nimage, m)) break;
+	RD_to_XY (&x, &y, ra, dec, &image[m].coords);
+	value = x;
+	break;
+      case MEAS_YCCD: /* OK */
+	ra  = average[0].R - measure[i].dR / 360000.0;
+	dec = average[0].D - measure[i].dD / 360000.0;
+	m = match_image_subset (image, subset, Nsubset, measure[i].t, measure[i].source);
+	if (m == -1) break;
+	if (!FindMosaicForImage (image, Nimage, m)) break;
+	RD_to_XY (&x, &y, ra, dec, &image[m].coords);
+	value = y;
+	break;
+      case MEAS_XMOSAIC: /* OK */
+	ra  = average[0].R - measure[i].dR / 360000.0;
+	dec = average[0].D - measure[i].dD / 360000.0;
+	m = match_image_subset (image, subset, Nsubset, measure[i].t, measure[i].source);
+	if (m == -1) break;
+	/* this should use the mosaic assoicated with the image */
+	/* the solution here depends on image.coords having crref1,2 set to match the boresite center */
+	/* XXX set the mosaic.coords to have a unity WRP transformation in which x,y = ra,dec */
+	mosaic.crval1 = image[m].coords.crval1;
+	mosaic.crval2 = image[m].coords.crval2;
+	RD_to_XY (&x, &y, ra, dec, &mosaic);
+	value = x;
+	break;
+      case MEAS_YMOSAIC: /* OK */
+	ra  = average[0].R - measure[i].dR / 360000.0;
+	dec = average[0].D - measure[i].dD / 360000.0;
+	m = match_image_subset (image, subset, Nsubset, measure[i].t, measure[i].source);
+	if (m == -1) break;
+	/* same comments as above */
+	mosaic.crval1 = image[m].coords.crval1;
+	mosaic.crval2 = image[m].coords.crval2;
+	RD_to_XY (&x, &y, ra, dec, &mosaic);
+	value = y;
+	break;
     }
     list[Nlist] = value;
@@ -582,6 +617,6 @@
 double ExtractAverages (PhotCode *code, int mode, Average *average, SecFilt *secfilt, Measure *measure, int param) {
 
-  int i, k, Nm, Type;
-  double fwhm, value, dM;
+  int i, k, Nm;
+  double value;
 
   value = NO_MAG;
@@ -589,14 +624,14 @@
   /* need valid code if param is: */
   switch (param) {
-  case AVE_MAG:
-  case AVE_dMAG:
-  case AVE_Xm:
-  case AVE_TYPE:
-  case AVE_NCODE:
-  case AVE_NPHOT: 
-    if (code == NULL) return (NO_MAG);
-    break;
-  default:
-    break;
+    case AVE_MAG:
+    case AVE_dMAG:
+    case AVE_Xm:
+    case AVE_TYPE:
+    case AVE_NCODE:
+    case AVE_NPHOT: 
+      if (code == NULL) return (NO_MAG);
+      break;
+    default:
+      break;
   }
 
@@ -604,84 +639,92 @@
   if (!TestAverage (code, average, secfilt, measure)) return (NO_MAG);
 
-  /* for ErrSelect, check average errors */
-  if (ErrSelect) {
-    dM = iPhotdM (code, average, secfilt);
-    if (dM > ErrValue) return (NO_MAG);
-  }
-  
-  /* for TypeSelect, check on TypeCode for this object */
-  if (TypeSelect) {
-    Type = DetermineTypeCode (average, measure, code[0].code);
-    if (Type != TypeValue) return (NO_MAG);
-  }
-
   /* assign vector values */
   switch (param) {
-  case AVE_RA:
-    value = average[0].R;
-    break;
-  case AVE_DEC:
-    value = average[0].D;
-    break;
-  case AVE_NMEAS:
-    value = average[0].Nm;
-    break;
-  case AVE_NMISS:
-    value = average[0].Nn;
-    break;
-  case AVE_Xp:
-    value = 0.01*average[0].Xp;
-    break;
-  case AVE_FLAG:
-    value = average[0].code;
-    break;
-  case AVE_MAG:
-    switch (mode) {
-    case MAG_AVE:
-      value = PhotAve  (code, average, secfilt);
-      break;
-    case MAG_REF:
-      value = PhotRef  (code, average, secfilt, measure);
-      break;
-    }
-    break;
-  case AVE_dMAG:
-    value = PhotdM (code, average, secfilt);
-    break;
-  case AVE_Xm:
-    value = PhotXm (code, average, secfilt);
-    break;
-  case AVE_TYPE:
-    value = DetermineTypeCode (average, measure, code[0].code);
-    break;
-  case AVE_NCODE:
-    value = 0;
-    for (i = 0; i < average[0].Nm; i++) {
-      if (code[0].code != GetPhotcodeEquivCodebyCode (measure[i].source)) continue;
-      value ++;
-    }
-    break;
-  case AVE_NPHOT:
-    value = 0;
-    for (i = 0; i < average[0].Nm; i++) {
-      if (code[0].code != GetPhotcodeEquivCodebyCode (measure[i].source)) continue;
-      if (measure[i].flags & (ID_MEAS_POOR | ID_MEAS_SKIP)) continue;
-      value ++;
-    }
-    break;
-  case AVE_NCRIT:
-    value = 0;
-    for (i = 0; i < average[0].Nm; i++) {
-      if (code[0].code != GetPhotcodeEquivCodebyCode (measure[i].source)) continue;
-      if (ErrSelect && (measure[i].dM > ErrValue)) continue;
-      if (FlagSelect && (measure[i].flags != FlagValue)) continue;
-      if (TypeSelect && (TypeValue != GetMeasureTypeCode (&measure[i]))) continue;
-      if (iMagSelect && (PhotInst (&measure[i]) < iMagMin)) continue;
-      value ++;
-    }
-    break;
+    case AVE_RA:
+      value = average[0].R;
+      break;
+    case AVE_DEC:
+      value = average[0].D;
+      break;
+    case AVE_NMEAS:
+      value = average[0].Nm;
+      break;
+    case AVE_NMISS:
+      value = average[0].Nn;
+      break;
+    case AVE_Xp:
+      value = 0.01*average[0].Xp;
+      break;
+    case AVE_FLAG:
+      value = average[0].code;
+      break;
+    case AVE_MAG:
+      switch (mode) {
+	case MAG_AVE:
+	  value = PhotAve  (code, average, secfilt);
+	  break;
+	case MAG_REF:
+	  value = PhotRef  (code, average, secfilt, measure);
+	  break;
+      }
+      break;
+    case AVE_dMAG:
+      value = PhotdM (code, average, secfilt);
+      break;
+    case AVE_Xm:
+      value = PhotXm (code, average, secfilt);
+      break;
+    case AVE_TYPE:
+      value = DetermineTypeCode (average, measure, code[0].code);
+      break;
+    case AVE_TYPEFRAC:
+      value = DetermineTypefrac (average, measure, code);
+      break;
+    case AVE_NCODE:
+      value = 0;
+      for (i = 0; i < average[0].Nm; i++) {
+	if (code[0].code != GetPhotcodeEquivCodebyCode (measure[i].source)) continue;
+	value ++;
+      }
+      break;
+    case AVE_NPHOT:
+      value = 0;
+      for (i = 0; i < average[0].Nm; i++) {
+	if (code[0].code != GetPhotcodeEquivCodebyCode (measure[i].source)) continue;
+	if (measure[i].flags & (ID_MEAS_POOR | ID_MEAS_SKIP)) continue;
+	value ++;
+      }
+      break;
+    case AVE_NCRIT:
+      value = 0;
+      for (i = 0; i < average[0].Nm; i++) {
+	if (code[0].code != GetPhotcodeEquivCodebyCode (measure[i].source)) continue;
+	if (ErrSelect && (measure[i].dM > ErrValue)) continue;
+	if (FlagSelect && (measure[i].flags != FlagValue)) continue;
+	if (TypeSelect && (TypeValue != GetMeasureTypeCode (&measure[i]))) continue;
+	if (iMagSelect && (PhotInst (&measure[i]) < iMagMin)) continue;
+	value ++;
+      }
+      break;
   }
   return (value);
 }  
+
+/* return fraction of measures (matching code) which have requested type */
+double DetermineTypefrac (Average *average, Measure *measure, PhotCode *code) {
+
+  double frac;
+  int k, Nc, Nt;
+  
+  Nt = Nc = 0;
+  for (k = 0; k < average[0].Nm; k++) {
+    if ((code != NULL) && (code[0].code != GetPhotcodeEquivCodebyCode (measure[k].source))) continue;
+    Nc ++;
+    if (measure[k].dophot != TypefracType) continue;
+    Nt ++;
+  }
+  frac = (double) Nt / (double) Nc;
+  return (frac);
+}
 
 /* determine the representative dophot type for this photcode */
@@ -704,19 +747,19 @@
 int GetMeasureTypeCode (Measure *measure) {
   switch (measure[0].dophot) {
-  case 0:
-  case 1:
-  case 2:
-    return (0);
-    break;
-  case 3:
-  case 4:
-  case 5:
-  case 7:
-  case 9:
-    return (1);
-    break;
-  case 10:
-  default:
-    return (2);
+    case 0:
+    case 1:
+    case 2:
+      return (0);
+      break;
+    case 3:
+    case 4:
+    case 5:
+    case 7:
+    case 9:
+      return (1);
+      break;
+    case 10:
+    default:
+      return (2);
   }
   return (2);
@@ -744,6 +787,6 @@
 int TestAverage (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure) {
 
-  int i, Nm;
-  double value, fwhm;
+  int i, Nm, Type;
+  double fwhm, typefrac, dM, Xm;
 
   /* exclusions based on average.params  */
@@ -751,7 +794,14 @@
     /* some average.params need a valid photcode for reference */
     if (code == NULL) return (FALSE);
-    value = PhotXm (code, average, secfilt);
-    if (value == -1) return (FALSE);
-    if (value > ChiLimit) return (FALSE);
+    Xm = PhotXm (code, average, secfilt);
+    if (Xm == -1) return (FALSE);
+    if (Xm > ChiLimit) return (FALSE);
+  }
+  
+  /* for ErrSelect, check average errors */
+  if (ErrSelect) {
+    if (code == NULL) return (FALSE);  /* need a valid code */
+    dM = iPhotdM (code, average, secfilt);
+    if (dM > ErrValue) return (NO_MAG);
   }
   
@@ -762,13 +812,13 @@
       fwhm = measure[i].FWx / 100.0;
       switch (FWHMsign) {
-      case 0:
-	if (fwhm == FWHMvalue) break;
-	continue;
-      case +1:
-	if (fwhm >= FWHMvalue) break;
-	continue;
-      case -1:
-	if (fwhm <= FWHMvalue) break;
-	continue;
+	case 0:
+	  if (fwhm == FWHMvalue) break;
+	  continue;
+	case +1:
+	  if (fwhm >= FWHMvalue) break;
+	  continue;
+	case -1:
+	  if (fwhm <= FWHMvalue) break;
+	  continue;
       }
       Nm++;
@@ -785,15 +835,15 @@
     }
     switch (NcodeSign) {
-    case 0:
-      if (Nm == NcodeValue) break;
-      return (FALSE);
-    case 1:
-      if (Nm >= NcodeValue) break;
-      return (FALSE);
-    case -1:
-      if (Nm <= NcodeValue) break;
-      return (FALSE);
-    default:
-      return (FALSE);
+      case 0:
+	if (Nm == NcodeValue) break;
+	return (FALSE);
+      case 1:
+	if (Nm >= NcodeValue) break;
+	return (FALSE);
+      case -1:
+	if (Nm <= NcodeValue) break;
+	return (FALSE);
+      default:
+	return (FALSE);
     }
   }
@@ -808,17 +858,42 @@
     }
     switch (NphotSign) {
-    case 0:
-      if (Nm == NphotValue) break;
-      return (FALSE);
-    case 1:
-      if (Nm >= NphotValue) break;
-      return (FALSE);
-    case -1:
-      if (Nm <= NphotValue) break;
-      return (FALSE);
-    default:
-      return (FALSE);
-    }
-  }
+      case 0:
+	if (Nm == NphotValue) break;
+	return (FALSE);
+      case 1:
+	if (Nm >= NphotValue) break;
+	return (FALSE);
+      case -1:
+	if (Nm <= NphotValue) break;
+	return (FALSE);
+      default:
+	return (FALSE);
+    }
+  }
+
+  /* for TypeSelect, check on TypeCode for this object */
+  if (TypeSelect) {
+    Type = DetermineTypeCode (average, measure, code[0].code);
+    if (Type != TypeValue) return (FALSE);
+  }
+
+  /* for TypeSelect, check on TypeCode for this object */
+  if (TypefracSelect) {
+    typefrac = DetermineTypefrac (average, measure, code);
+    switch (TypefracSign) {
+      case 0:
+	if (typefrac == TypefracValue) break;
+	return (FALSE);	
+      case +1:
+	if (typefrac >= TypefracValue) break;
+	return (FALSE);	
+      case -1:
+	if (typefrac <= TypefracValue) break;
+	return (FALSE);	
+      default:
+	return (FALSE);
+    }
+  }
+
   return (TRUE);
 }
@@ -1009,81 +1084,81 @@
       value = 0;
       switch (param) {
-      case MEAS_MAG: /* magnitudes are already determined above */
-	value = use_first ? M1 : M2;
-	break;
-      case MEAS_RA: /* OK */
-	value = average[0].R - measure[n].dR / 360000.0;
-	break;
-      case MEAS_DEC: /* OK */
-	value = average[0].D - measure[n].dD / 360000.0;
-	break;
-      case MEAS_dMAG: /* OK */
-	value = 0.001*measure[n].dM;
-	break;
-      case MEAS_AIRMASS: /* OK */
-	value = 0.001*measure[n].airmass;
-	break;
-      case MEAS_EXPTIME: /* OK */
-	value = pow (10.0, measure[n].dt * 0.0004);
-	break;
-      case MEAS_PHOTCODE: /* OK */
-	value = measure[n].source;
-	break;
-      case MEAS_TIME: /* OK */
-	value = TimeValue (measure[n].t, TimeReference, TimeFormat);
-	break;
-      case MEAS_dR: /* OK */
-	value = 0.01*measure[n].dR;
-	break;
-      case MEAS_dD: /* OK */
-	value = 0.01*measure[n].dD;
-	break;
-      case MEAS_FWHM: /* OK */
-	value = 0.01*measure[n].FWx;
-	break;
-      case MEAS_DOPHOT: /* OK */
-	value = measure[n].dophot;
-	break;
-      case MEAS_FLAGS: /* ? */
-	value = measure[n].flags;
-	break;
-    case MEAS_XCCD: /* OK */
-      ra  = average[0].R - measure[n].dR / 360000.0;
-      dec = average[0].D - measure[n].dD / 360000.0;
-      m = match_image_subset (image, subset, Nsubset, measure[n].t, measure[n].source);
-      if (m == -1) break;
-      if (!FindMosaicForImage (image, Nimage, m)) break;
-      RD_to_XY (&x, &y, ra, dec, &image[m].coords);
-      value = x;
-      break;
-    case MEAS_YCCD: /* OK */
-      ra  = average[0].R - measure[n].dR / 360000.0;
-      dec = average[0].D - measure[n].dD / 360000.0;
-      m = match_image_subset (image, subset, Nsubset, measure[n].t, measure[n].source);
-      if (m == -1) break;
-      if (!FindMosaicForImage (image, Nimage, m)) break;
-      RD_to_XY (&x, &y, ra, dec, &image[m].coords);
-      value = y;
-      break;
-    case MEAS_XMOSAIC: /* OK */
-      ra  = average[0].R - measure[n].dR / 360000.0;
-      dec = average[0].D - measure[n].dD / 360000.0;
-      m = match_image_subset (image, subset, Nsubset, measure[n].t, measure[n].source);
-      if (m == -1) break;
-      mosaic.crval1 = image[m].coords.crval1;
-      mosaic.crval2 = image[m].coords.crval2;
-      RD_to_XY (&x, &y, ra, dec, &mosaic);
-      value = x;
-      break;
-    case MEAS_YMOSAIC: /* OK */
-      ra  = average[0].R - measure[n].dR / 360000.0;
-      dec = average[0].D - measure[n].dD / 360000.0;
-      m = match_image_subset (image, subset, Nsubset, measure[n].t, measure[n].source);
-      if (m == -1) break;
-      mosaic.crval1 = image[m].coords.crval1;
-      mosaic.crval2 = image[m].coords.crval2;
-      RD_to_XY (&x, &y, ra, dec, &mosaic);
-      value = y;
-      break;
+	case MEAS_MAG: /* magnitudes are already determined above */
+	  value = use_first ? M1 : M2;
+	  break;
+	case MEAS_RA: /* OK */
+	  value = average[0].R - measure[n].dR / 360000.0;
+	  break;
+	case MEAS_DEC: /* OK */
+	  value = average[0].D - measure[n].dD / 360000.0;
+	  break;
+	case MEAS_dMAG: /* OK */
+	  value = 0.001*measure[n].dM;
+	  break;
+	case MEAS_AIRMASS: /* OK */
+	  value = 0.001*measure[n].airmass;
+	  break;
+	case MEAS_EXPTIME: /* OK */
+	  value = pow (10.0, measure[n].dt * 0.0004);
+	  break;
+	case MEAS_PHOTCODE: /* OK */
+	  value = measure[n].source;
+	  break;
+	case MEAS_TIME: /* OK */
+	  value = TimeValue (measure[n].t, TimeReference, TimeFormat);
+	  break;
+	case MEAS_dR: /* OK */
+	  value = 0.01*measure[n].dR;
+	  break;
+	case MEAS_dD: /* OK */
+	  value = 0.01*measure[n].dD;
+	  break;
+	case MEAS_FWHM: /* OK */
+	  value = 0.01*measure[n].FWx;
+	  break;
+	case MEAS_DOPHOT: /* OK */
+	  value = measure[n].dophot;
+	  break;
+	case MEAS_FLAGS: /* ? */
+	  value = measure[n].flags;
+	  break;
+	case MEAS_XCCD: /* OK */
+	  ra  = average[0].R - measure[n].dR / 360000.0;
+	  dec = average[0].D - measure[n].dD / 360000.0;
+	  m = match_image_subset (image, subset, Nsubset, measure[n].t, measure[n].source);
+	  if (m == -1) break;
+	  if (!FindMosaicForImage (image, Nimage, m)) break;
+	  RD_to_XY (&x, &y, ra, dec, &image[m].coords);
+	  value = x;
+	  break;
+	case MEAS_YCCD: /* OK */
+	  ra  = average[0].R - measure[n].dR / 360000.0;
+	  dec = average[0].D - measure[n].dD / 360000.0;
+	  m = match_image_subset (image, subset, Nsubset, measure[n].t, measure[n].source);
+	  if (m == -1) break;
+	  if (!FindMosaicForImage (image, Nimage, m)) break;
+	  RD_to_XY (&x, &y, ra, dec, &image[m].coords);
+	  value = y;
+	  break;
+	case MEAS_XMOSAIC: /* OK */
+	  ra  = average[0].R - measure[n].dR / 360000.0;
+	  dec = average[0].D - measure[n].dD / 360000.0;
+	  m = match_image_subset (image, subset, Nsubset, measure[n].t, measure[n].source);
+	  if (m == -1) break;
+	  mosaic.crval1 = image[m].coords.crval1;
+	  mosaic.crval2 = image[m].coords.crval2;
+	  RD_to_XY (&x, &y, ra, dec, &mosaic);
+	  value = x;
+	  break;
+	case MEAS_YMOSAIC: /* OK */
+	  ra  = average[0].R - measure[n].dR / 360000.0;
+	  dec = average[0].D - measure[n].dD / 360000.0;
+	  m = match_image_subset (image, subset, Nsubset, measure[n].t, measure[n].source);
+	  if (m == -1) break;
+	  mosaic.crval1 = image[m].coords.crval1;
+	  mosaic.crval2 = image[m].coords.crval2;
+	  RD_to_XY (&x, &y, ra, dec, &mosaic);
+	  value = y;
+	  break;
       }
       list[Nlist] = value;
Index: /trunk/Ohana/src/opihi/include/dvo1.h
===================================================================
--- /trunk/Ohana/src/opihi/include/dvo1.h	(revision 4419)
+++ /trunk/Ohana/src/opihi/include/dvo1.h	(revision 4420)
@@ -19,5 +19,5 @@
 /* average params */
 enum {AVE_ZERO, AVE_RA, AVE_DEC, AVE_MAG, AVE_REF, AVE_dMAG, AVE_Xm, AVE_Xp, AVE_NMEAS, 
-      AVE_NMISS, AVE_TYPE, AVE_NPHOT, AVE_NCODE, AVE_NCRIT, AVE_FLAG};
+      AVE_NMISS, AVE_TYPE, AVE_NPHOT, AVE_NCODE, AVE_NCRIT, AVE_FLAG, AVE_TYPEFRAC};
 
 typedef struct {
@@ -60,4 +60,7 @@
 double       *ExtractMeasuresDMag   PROTO((PhotCode **code, int *mode, Average *average, SecFilt *secfilt, Measure *measure, int *nlist));
 double       *ExtractMeasuresByDMag PROTO((PhotCode **code, int *mode, int use_first, Average *average, SecFilt *secfilt, Measure *measure, int *nlist, int param));
+double        DetermineTypefrac     PROTO((Average *average, Measure *measure, PhotCode *code));
+void          GetAverageParamHelp   PROTO(());
+
 
 # endif
