Index: /branches/eam_branches/ipp-20140610/Ohana/src/addstar/src/ReadStarsFITS.c
===================================================================
--- /branches/eam_branches/ipp-20140610/Ohana/src/addstar/src/ReadStarsFITS.c	(revision 36933)
+++ /branches/eam_branches/ipp-20140610/Ohana/src/addstar/src/ReadStarsFITS.c	(revision 36934)
@@ -1210,6 +1210,4 @@
   ZeroPt = GetZeroPoint();
 
-  fprintf (stderr, "WARNING: Convert_PS1_SV3 not yet updated to match real format\n");
-
   ALLOCATE (stars, Stars, Nstars);
   for (i = 0; i < Nstars; i++) {
@@ -1231,4 +1229,5 @@
     stars[i].measure.dMcal      = ps1data[i].dMcal;
     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
+    stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
                         
     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
@@ -1240,4 +1239,6 @@
     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
+    stars[i].measure.FluxAp     = ps1data[i].apFlux;
+    stars[i].measure.dFluxAp    = ps1data[i].apFluxErr;
 
     stars[i].measure.Sky        = ps1data[i].sky;
Index: /branches/eam_branches/ipp-20140610/Ohana/src/addstar/src/mkcmf.c
===================================================================
--- /branches/eam_branches/ipp-20140610/Ohana/src/addstar/src/mkcmf.c	(revision 36933)
+++ /branches/eam_branches/ipp-20140610/Ohana/src/addstar/src/mkcmf.c	(revision 36934)
@@ -21,4 +21,5 @@
 void writeStars_PS1_V2 (FTable *ftable, double *X, double *Y, double *M, unsigned int *Flag, int Nstars);
 void writeStars_PS1_V1 (FTable *ftable, double *X, double *Y, double *M, int Nstars);
+void writeStars_PS1_SV3 (FTable *ftable, double *X, double *Y, double *M, unsigned int *Flag, int Nstars);
 void writeStars_PS1_DEV_1 (FTable *ftable, double *X, double *Y, double *M, int Nstars);
 void writeStars_PS1_DEV_0 (FTable *ftable, double *X, double *Y, double *M, int Nstars);
@@ -339,4 +340,8 @@
   if (!strcmp(type, "PS1_V5_Lensing")) {
     writeStars_PS1_V5_Lensing (&ftable, X, Y, M, Flag, Nstars); 
+    found = TRUE;
+  }
+  if (!strcmp(type, "PS1_SV3")) {
+    writeStars_PS1_SV3 (&ftable, X, Y, M, Flag, Nstars); 
     found = TRUE;
   }
@@ -885,13 +890,13 @@
 }
 
-void writeStars_PS1_V5_Lensing (FTable *ftable, double *X, double *Y, double *M, unsigned int *Flag, int Nstars) {
+void writeStars_PS1_SV3 (FTable *ftable, double *X, double *Y, double *M, unsigned int *Flag, int Nstars) {
 
   int i;
-  CMF_PS1_V5_Lensing *stars;
+  CMF_PS1_SV3 *stars;
   float flux, fSN;
 
   // XXX add gaussian-distributed noise based on counts
   // this needs to make different output 'stars' entries depending on the desired type
-  ALLOCATE (stars, CMF_PS1_V5_Lensing, Nstars);
+  ALLOCATE (stars, CMF_PS1_SV3, Nstars);
   for (i = 0; i < Nstars; i++) {
 
@@ -964,28 +969,4 @@
     stars[i].Mrh       = FX;
 
-    stars[i].X11_sm_obj = FX;
-    stars[i].X12_sm_obj = FX;
-    stars[i].X22_sm_obj = FY;
-    stars[i].E1_sm_obj  = FX;
-    stars[i].E2_sm_obj  = FX;
-
-    stars[i].X11_sh_obj = FX;
-    stars[i].X12_sh_obj = 0.2;
-    stars[i].X22_sh_obj = FY;
-    stars[i].E1_sh_obj  = FX*0.9;
-    stars[i].E2_sh_obj  = FX*0.8;
-
-    stars[i].X11_sm_psf = FX;
-    stars[i].X12_sm_psf = FX;
-    stars[i].X22_sm_psf = FX;
-    stars[i].E1_sm_psf  = FX;
-    stars[i].E2_sm_psf  = FX;
-
-    stars[i].X11_sh_psf = FX;
-    stars[i].X12_sh_psf = FX;
-    stars[i].X22_sh_psf = FX;
-    stars[i].E1_sh_psf  = FX;
-    stars[i].E2_sh_psf  = FX;
-
     stars[i].kronFlux  = flux * 1.25;
     stars[i].kronFluxErr = fSN * flux * 1.25;
@@ -994,7 +975,7 @@
     stars[i].kronOuter = fSN * flux * 1.5;
 
-    stars[i].skyLimitRad = 1;
-    stars[i].skyLimitFlux = 2;
-    stars[i].skyLimitSlope = 0.2;
+    // stars[i].skyLimitRad = 1;
+    // stars[i].skyLimitFlux = 2;
+    // stars[i].skyLimitSlope = 0.2;
 
     stars[i].flags     = Flag[i];
@@ -1014,4 +995,137 @@
   }
 
+  gfits_table_set_CMF_PS1_SV3 (ftable, stars, Nstars);
+  gfits_modify (ftable->header, "EXTTYPE",   "%s", 1, "PS1_SV3");
+}
+
+void writeStars_PS1_V5_Lensing (FTable *ftable, double *X, double *Y, double *M, unsigned int *Flag, int Nstars) {
+
+  int i;
+  CMF_PS1_V5_Lensing *stars;
+  float flux, fSN;
+
+  // XXX add gaussian-distributed noise based on counts
+  // this needs to make different output 'stars' entries depending on the desired type
+  ALLOCATE (stars, CMF_PS1_V5_Lensing, Nstars);
+  for (i = 0; i < Nstars; i++) {
+
+    flux = pow (10.0, -0.4*M[i]);
+    fSN = 1.0 / sqrt(flux);
+
+    stars[i].detID = i;
+    stars[i].X = X[i];
+    stars[i].Y = Y[i];
+    stars[i].dX = FX * fSN;
+    stars[i].dY = FY * fSN;
+
+    stars[i].posangle = 10.0;
+    stars[i].pltscale = 0.25;
+
+    stars[i].M = M[i];
+    stars[i].dM = fSN;
+
+    stars[i].Flux = flux;
+    stars[i].dFlux = flux * fSN;
+
+    stars[i].Map = M[i] - 0.05;
+    stars[i].MapRaw = M[i] - 0.10;
+
+    stars[i].apRadius = 8.0;
+
+    stars[i].apFlux = pow(10.0, -0.4*stars[i].Map);
+    stars[i].apFluxErr = stars[i].apFlux * fSN;
+
+    stars[i].Mcalib = M[i] + ZERO_POINT + 2.5*log10(exptime);
+    stars[i].dMcal = 0.05;
+
+    XY_to_RD (&stars[i].RA, &stars[i].DEC, X[i], Y[i], &coords);
+    stars[i].apNpix = 3.14*8.0*8.0;
+
+    stars[i].Mpeak     = M[i] + 1.0;
+    stars[i].sky       = SKY;
+    stars[i].dSky      = DSKY;
+    stars[i].psfChisq  = PSFCHI;
+    stars[i].crNsigma  = CRN;
+    stars[i].extNsigma = EXTN;
+    stars[i].fx        = FX;
+    stars[i].fy        = FY;
+    stars[i].df        = DF;
+
+    stars[i].k         = 1.0;
+    stars[i].fwhmMaj   = FX*2.8;
+    stars[i].fwhmMin   = FY*2.8;
+
+    // randomly give poor PSFQF values
+    if ((BAD_PSFQF_FRAC > 0.0) && (drand48() < BAD_PSFQF_FRAC)) {
+      stars[i].psfQF     = 0.25;
+      stars[i].psfQFperf = 0.24;
+    } else {
+      stars[i].psfQF     = PSFQUAL;
+      stars[i].psfQFperf = MAX(PSFQUAL - 0.01, 0.0);
+    }
+
+    stars[i].psfNdof   = 1;
+    stars[i].psfNpix   = 2;
+
+    stars[i].Mxx       = FX;
+    stars[i].Mxy       = 0.01;
+    stars[i].Myy       = FX;
+    stars[i].M3c       = FX;
+    stars[i].M3s       = FX;
+    stars[i].M4c       = FX;
+    stars[i].M4s       = FX;
+    stars[i].Mr1       = FX;
+    stars[i].Mrh       = FX;
+
+    stars[i].X11_sm_obj = FX;
+    stars[i].X12_sm_obj = FX;
+    stars[i].X22_sm_obj = FY;
+    stars[i].E1_sm_obj  = FX;
+    stars[i].E2_sm_obj  = FX;
+
+    stars[i].X11_sh_obj = FX;
+    stars[i].X12_sh_obj = 0.2;
+    stars[i].X22_sh_obj = FY;
+    stars[i].E1_sh_obj  = FX*0.9;
+    stars[i].E2_sh_obj  = FX*0.8;
+
+    stars[i].X11_sm_psf = FX;
+    stars[i].X12_sm_psf = FX;
+    stars[i].X22_sm_psf = FX;
+    stars[i].E1_sm_psf  = FX;
+    stars[i].E2_sm_psf  = FX;
+
+    stars[i].X11_sh_psf = FX;
+    stars[i].X12_sh_psf = FX;
+    stars[i].X22_sh_psf = FX;
+    stars[i].E1_sh_psf  = FX;
+    stars[i].E2_sh_psf  = FX;
+
+    stars[i].kronFlux  = flux * 1.25;
+    stars[i].kronFluxErr = fSN * flux * 1.25;
+
+    stars[i].kronInner = fSN * flux * 0.9;
+    stars[i].kronOuter = fSN * flux * 1.5;
+
+    stars[i].skyLimitRad = 1;
+    stars[i].skyLimitFlux = 2;
+    stars[i].skyLimitSlope = 0.2;
+
+    stars[i].flags     = Flag[i];
+    stars[i].flags2    = 0x80;
+
+    stars[i].nFrames   = 1;
+
+    if (ADDNOISE) {
+      stars[i].X += FX * fSN * rnd_gauss(0.0, 1.0);
+      stars[i].Y += FY * fSN * rnd_gauss(0.0, 1.0);
+      float Moff = fSN*rnd_gauss(0.0, 1.0);
+      stars[i].M += Moff;
+      stars[i].Map += Moff;
+      stars[i].MapRaw += Moff;
+      stars[i].Mcalib += Moff;
+    }
+  }
+
   gfits_table_set_CMF_PS1_V5_Lensing (ftable, stars, Nstars);
   gfits_modify (ftable->header, "EXTTYPE",   "%s", 1, "PS1_V5");
Index: /branches/eam_branches/ipp-20140610/Ohana/src/addstar/test/simple.dvo
===================================================================
--- /branches/eam_branches/ipp-20140610/Ohana/src/addstar/test/simple.dvo	(revision 36933)
+++ /branches/eam_branches/ipp-20140610/Ohana/src/addstar/test/simple.dvo	(revision 36934)
@@ -399,2 +399,59 @@
   N_FRAMES          : SKIP # not ingested into DVO		      
 end								      
+
+# this list is good for PS1_SV3
+list testfields_PS1_SV3
+  IPP_IDET          : detid     
+  X_PSF             : xccd      
+  Y_PSF             : yccd      
+  X_PSF_SIG         : xccd:err
+  Y_PSF_SIG         : yccd:err
+  POSANGLE          : posangle
+  PLTSCALE          : platescale
+  PSF_INST_MAG      : mag:inst  
+  PSF_INST_MAG_SIG  : mag:err   
+  PSF_INST_FLUX     : flux:inst
+  PSF_INST_FLUX_SIG : flux:inst:err
+  AP_MAG            : mag:aper:inst
+  AP_MAG_RAW        : SKIP # not ingested into DVO
+  AP_MAG_RADIUS     : SKIP # not ingested into DVO
+  AP_FLUX           : flux:aper:inst  
+  AP_FLUX_SIG       : flux:aper:inst:err
+  CAL_PSF_MAG       : mag:cal
+  CAL_PSF_MAG_SIG   : mag:cal:err
+  RA_PSF            : ra
+  DEC_PSF           : dec
+  AP_NPIX           : SKIP # not ingested into DVO		      
+  PEAK_FLUX_AS_MAG  : SKIP # not ingested into DVO		      
+  SKY               : sky       				      
+  SKY_SIGMA         : sky_err   				      
+  PSF_CHISQ         : psf_chisq 				      
+  CR_NSIGMA         : cr_nsigma 				      
+  EXT_NSIGMA        : ext_nsigma				      
+  PSF_MAJOR         : fwhm_maj # XXX technically, this is not FWHM but Sigma
+  PSF_MINOR         : fwhm_min # XXX technically, this is not FWHM but Sigma
+  PSF_THETA         : theta # FAIL				      
+  PSF_CORE          : SKIP # not ingested into DVO 
+  PSF_FWHM_MAJ      : SKIP # not ingested into DVO 
+  PSF_FWHM_MIN      : SKIP # not ingested into DVO 
+  PSF_QF            : psf_qf    				      
+  PSF_QF_PERFECT    : SKIP # not ingested into DVO		      
+  PSF_NDOF          : psf_ndof				      
+  PSF_NPIX          : psf_npix				      
+  MOMENTS_XX        : Mxx					      
+  MOMENTS_XY        : Mxy					      
+  MOMENTS_YY        : Myy					      
+  MOMENTS_M3C       : SKIP # not ingested into DVO		      
+  MOMENTS_M3S       : SKIP # not ingested into DVO		      
+  MOMENTS_M4C       : SKIP # not ingested into DVO		      
+  MOMENTS_M4S       : SKIP # not ingested into DVO		      
+  MOMENTS_R1        : SKIP # not ingested into DVO		      
+  MOMENTS_RH        : SKIP # not ingested into DVO		      
+  KRON_FLUX         : flux:kron:inst				      
+  KRON_FLUX_ERR     : flux:kron:inst:err				      
+  KRON_FLUX_INNER   : SKIP # not ingested into DVO		          
+  KRON_FLUX_OUTER   : SKIP # not ingested into DVO		      
+  FLAGS             : phot_flags				      
+  FLAGS2            : SKIP # not ingested into DVO		          
+  N_FRAMES          : SKIP # not ingested into DVO		      
+end								      
