Index: /branches/eam_branches/ipp-20140717/Ohana/src/libdvo/include/dvo.h
===================================================================
--- /branches/eam_branches/ipp-20140717/Ohana/src/libdvo/include/dvo.h	(revision 37092)
+++ /branches/eam_branches/ipp-20140717/Ohana/src/libdvo/include/dvo.h	(revision 37093)
@@ -710,9 +710,11 @@
 float PhotFluxInstErr (Measure *measure, dvoMagClassType class);
 float PhotFluxCatErr (Measure *measure, dvoMagClassType class);
+float PhotFluxAveErr (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source);
 
 float PhotXm (PhotCode *code, Average *average, SecFilt *secfilt);
 float PhotZeroPoint (Measure *measure, Average *average, SecFilt *secfilt);
 
-float PhotMstdev (PhotCode *code, Average *average, SecFilt *secfilt);
+int   PhotNphot (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source);
+float PhotMstdev (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source);
 float PhotMmin (PhotCode *code, Average *average, SecFilt *secfilt);
 float PhotMmax (PhotCode *code, Average *average, SecFilt *secfilt);
Index: /branches/eam_branches/ipp-20140717/Ohana/src/libdvo/src/dbExtractAverages.c
===================================================================
--- /branches/eam_branches/ipp-20140717/Ohana/src/libdvo/src/dbExtractAverages.c	(revision 37092)
+++ /branches/eam_branches/ipp-20140717/Ohana/src/libdvo/src/dbExtractAverages.c	(revision 37093)
@@ -200,4 +200,14 @@
       }
 
+      /* in some cases below we need a measurement which matches the requested photcode.
+	 here is some sample code to find this.
+
+	  for (i = 0; i < average[0].Nmeasure; i++) {
+	    if (field->photcode->code != measure[i].photcode) continue;
+	    value.Flt = measure[i].M;
+	    break;
+	  }
+      */
+
       switch (field->magOption) {
 	case MAG_OPTION_MAG:
@@ -207,5 +217,5 @@
 	      break;
 	    case MAG_LEVEL_REF:
-	      // why is measure needed here?
+	      // which measure is needed here?
 	      // PhotRef  (field->photcode, average, secfilt, measure, field->magClass, field->magSource); 
 	      break;
@@ -242,5 +252,6 @@
 	      break;
 	    case MAG_LEVEL_REF:
-	      // value.Flt = PhotFluxRef  (equiv, average, secfilt, measure, field->magClass, field->magSource); 
+	      // XXX which measure is needed here?
+	      // value.Flt = PhotFluxRef  (field->photcode, average, secfilt, measure, field->magClass, field->magSource); 
 	      break;
 	    case MAG_LEVEL_INST:
@@ -258,5 +269,5 @@
 	    case MAG_LEVEL_AVE:
 	    case MAG_LEVEL_REF:
-	      // value.Flt = PhotFluxAveErr (equiv, average, secfilt, field->magClass, field->magSource);  
+	      value.Flt = PhotFluxAveErr (field->photcode, average, secfilt, field->magClass, field->magSource);  
 	      break;
 	    case MAG_LEVEL_INST:
@@ -271,7 +282,15 @@
 
 	case MAG_OPTION_STDEV:
+	  value.Flt = PhotMstdev (field->photcode, average, secfilt, field->magClass, field->magSource);
+	  break;
 	case MAG_OPTION_CHISQ:
+	  value.Flt = PhotXm (field->photcode, average, secfilt);
+	  break;
 	case MAG_OPTION_MIN:
+	  value.Flt = PhotMmin (field->photcode, average, secfilt);
+	  break;
 	case MAG_OPTION_MAX:
+	  value.Flt = PhotMmax (field->photcode, average, secfilt);
+	  break;
 	case MAG_OPTION_NCODE: {
 	  int Nsec = GetPhotcodeNsec (field->photcode->code);
@@ -281,10 +300,10 @@
 	}
 	case MAG_OPTION_NPHOT: {
-	  int Nsec = GetPhotcodeNsec (field->photcode->code);
-	  if (Nsec == -1) break;
-	  value.Int = secfilt[Nsec].Nused;
+	  value.Int = PhotNphot (field->photcode, average, secfilt, field->magClass, field->magSource);
 	  break;
 	}
 	case MAG_OPTION_UC_DIST:
+	  value.Flt = PhotUCdist (field->photcode, average, secfilt);
+	  break;
 	case MAG_OPTION_STACK_DET_ID:
 	  value.Int = PhotStackID (field->photcode, average, secfilt);
@@ -301,124 +320,4 @@
       break;
 
-# if (0)
-      switch (field->magMode) {
-	case MAG_AVE:
-	  value.Flt = PhotAve  (field->photcode, average, secfilt);
-	  break;
-	case MAG_REF:
-	  value.Flt = PhotRef  (field->photcode, average, secfilt, measure);
-	  break;
-	case MAG_INST:
-	case MAG_CAT:
-	case MAG_SYS:
-	case MAG_REL:
-	case MAG_CAL:
-	  // XXX need to code this correctly: this returns just the first matching value
-	  value.Flt = NAN;
-	  for (i = 0; i < average[0].Nmeasure; i++) {
-	    if (field->photcode->code != measure[i].photcode) continue;
-	    value.Flt = measure[i].M;
-	    break;
-	  }
-	  break;
-	case MAG_CHISQ:
-	  value.Flt = PhotXm (field->photcode, average, secfilt);
-	  break;
-	case MAG_ERR:
-	  if ((field->photcode->type == PHOT_REF) || (field->photcode->type == PHOT_DEP)) {
-	    for (i = 0; i < average[0].Nmeasure; i++) {
-	      if (field->photcode->code != measure[i].photcode) continue;
-	      value.Flt = measure[i].dM;
-	      break;
-	    }
-	  } else {
-	    value.Flt = PhotAveErr (field->photcode, average, secfilt);
-	  }
-	  break;
-	case MAG_STDEV:
-	  value.Flt = PhotMstdev (field->photcode, average, secfilt);
-	  break;
-	case MAG_PHOT_FLAGS:
-	  if ((field->photcode->type == PHOT_REF) || (field->photcode->type == PHOT_DEP)) {
-	    for (i = 0; i < average[0].Nmeasure; i++) {
-	      if (field->photcode->code != measure[i].photcode) continue;
-	      value.Int = measure[i].photFlags;
-	      break;
-	    }
-	  } else {
-	    int Nsec = GetPhotcodeNsec (field->photcode->code);
-	    if (Nsec == -1) break;
-	    value.Int = secfilt[Nsec].flags;
-	  }
-	  break;
-	case MAG_NCODE:
-	  // XXX push these into dvo_photcode_ops APIs
-	  // XXX do I need to allow for conversion to equiv?
-	  int Nsec = GetPhotcodeNsec (field->photcode->code);
-	  if (Nsec == -1) break;
-	  value.Int = secfilt[Nsec].Ncode;
-	  break;
-	case MAG_NPHOT:
-	  int Nsec = GetPhotcodeNsec (field->photcode->code);
-	  if (Nsec == -1) break;
-	  value.Int = secfilt[Nsec].Nused;
-	  break;
-
-	case MAG_APER:
-	case MAG_APER_AVE:
-	  value.Flt = PhotAperAve (field->photcode, average, secfilt);
-	  break;
-
-	case MAG_APER_REF:
-	  value.Flt = PhotAperRef (field->photcode, average, secfilt, measure);
-	  break;
-
-	case MAG_KRON:
-	case MAG_KRON_AVE:
-	  value.Flt = PhotKronAve (field->photcode, average, secfilt);
-	  break;
-
-	case MAG_KRON_REF:
-	  value.Flt = PhotKronRef (field->photcode, average, secfilt, measure);
-	  break;
-
-	case MAG_KRON_ERR:
-	  value.Flt = PhotKronAveErr (field->photcode, average, secfilt);
-	  break;
-
-	case MAG_MIN:
-	  value.Flt = PhotMmin (field->photcode, average, secfilt);
-	  break;
-	case MAG_MAX:
-	  value.Flt = PhotMmax (field->photcode, average, secfilt);
-	  break;
-	case MAG_UC_DIST:
-	  value.Flt = PhotUCdist (field->photcode, average, secfilt);
-	  break;
-	case MAG_STACK_DET_ID:
-	  value.Int = PhotStackID (field->photcode, average, secfilt);
-	  break;
-
-	case MAG_FLUX_PSF:
-	  value.Flt = PhotAveFluxPSF (field->photcode, average, secfilt);
-	  break;
-	case MAG_FLUX_PSF_ERR:
-	  value.Flt = PhotAvedFluxPSF (field->photcode, average, secfilt);
-	  break;
-	case MAG_FLUX_KRON:
-	  value.Flt = PhotAveFluxKron (field->photcode, average, secfilt);
-	  break;
-	case MAG_FLUX_KRON_ERR:
-	  value.Flt = PhotAvedFluxKron (field->photcode, average, secfilt);
-	  break;
-      }
-      break;
-    case AVE_dMAG:
-      value.Flt = PhotAveErr (field->photcode, average, secfilt);
-      break;
-    case AVE_Xm:
-      value.Flt = PhotXm (field->photcode, average, secfilt);
-      break;
-# endif
     case AVE_TYPE:
       break;
Index: /branches/eam_branches/ipp-20140717/Ohana/src/libdvo/src/dvo_photcode_ops.c
===================================================================
--- /branches/eam_branches/ipp-20140717/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 37092)
+++ /branches/eam_branches/ipp-20140717/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 37093)
@@ -687,14 +687,94 @@
 }
 
-float PhotMstdev (PhotCode *code, Average *average, SecFilt *secfilt) {
-
-  int Ns;
-  float Mstdev;
-
-  if (code == NULL) return NAN;
-
-  Ns = photcodes[0].hashNsec[code[0].code];
-  Mstdev  = (Ns == -1) ? NAN : 0.001*secfilt[Ns].Mstdev;
+float PhotMstdev (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source) {
+
+  if (code == NULL) return NAN;
+
+  int Ns = photcodes[0].hashNsec[code[0].code];
+  if (Ns == -1) return (NAN);
+
+  float Mstdev = NAN;
+  switch (source) {
+    case MAG_SRC_CHP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  Mstdev = secfilt[Ns].Mstdev;
+	  break;
+	case MAG_CLASS_KRON:
+	  Mstdev = secfilt[Ns].sMkron;
+	  break;
+	case MAG_CLASS_APER:
+	  Mstdev = secfilt[Ns].sMap;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_WRP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  Mstdev = secfilt[Ns].sFpsfWrp;
+	  break;
+	case MAG_CLASS_KRON:
+	  Mstdev = secfilt[Ns].sFkronWrp;
+	  break;
+	case MAG_CLASS_APER:
+	  Mstdev = secfilt[Ns].sFapWrp;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_STK:
+    default:
+      break;
+  }
   return (Mstdev);
+}
+
+int PhotNphot (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source) {
+
+  if (code == NULL) return 0;
+
+  int Ns = photcodes[0].hashNsec[code[0].code];
+  if (Ns == -1) return 0;
+
+  int Nphot = 0;
+  switch (source) {
+    case MAG_SRC_CHP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  Nphot = secfilt[Ns].Nused;
+	  break;
+	case MAG_CLASS_KRON:
+	  Nphot = secfilt[Ns].NusedKron;
+	  break;
+	case MAG_CLASS_APER:
+	  Nphot = secfilt[Ns].NusedAp;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_WRP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  Nphot = secfilt[Ns].NusedWrp;
+	  break;
+	case MAG_CLASS_KRON:
+	  Nphot = secfilt[Ns].NusedKronWrp;
+	  break;
+	case MAG_CLASS_APER:
+	  Nphot = secfilt[Ns].NusedApWrp;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_STK:
+    default:
+      break;
+  }
+  return (Nphot);
 }
 
@@ -1112,4 +1192,64 @@
   }
   return (Fave);
+}
+
+float PhotFluxAveErr (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source) {
+
+  if (code == NULL) return NAN;
+
+  int Ns = photcodes[0].hashNsec[code[0].code];
+  if (Ns == -1) return (NAN);
+
+  float dFave = NAN;
+  switch (source) {
+    case MAG_SRC_CHP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  dFave = secfilt[Ns].dM * MagToFlux(secfilt[Ns].M);
+	  break;
+	case MAG_CLASS_KRON:
+	  dFave = secfilt[Ns].dMkron * MagToFlux(secfilt[Ns].Mkron);
+	  break;
+	case MAG_CLASS_APER:
+	  dFave = secfilt[Ns].dMap * MagToFlux(secfilt[Ns].Map);
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_WRP:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  dFave = secfilt[Ns].dFpsfWrp;
+	  break;
+	case MAG_CLASS_KRON:
+	  dFave = secfilt[Ns].dFkronWrp;
+	  break;
+	case MAG_CLASS_APER:
+	  dFave = secfilt[Ns].dFapWrp;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    case MAG_SRC_STK:
+      switch (class) {
+	case MAG_CLASS_PSF:
+	  dFave = secfilt[Ns].dFpsfStk;
+	  break;
+	case MAG_CLASS_KRON:
+	  dFave = secfilt[Ns].dFkronStk;
+	  break;
+	case MAG_CLASS_APER:
+	  dFave = secfilt[Ns].dFapStk;
+	  break;
+	default:
+	  break;
+      }
+      break;
+    default:
+      break;
+  }
+  return (dFave);
 }
 
