Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/Makefile
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/Makefile	(revision 42816)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/Makefile	(revision 42817)
@@ -54,4 +54,5 @@
 $(DESTINC)/ps1_ref_defs.h \
 $(DESTINC)/ps1_ref_v2_defs.h \
+$(DESTINC)/ps1_ref_v3_defs.h \
 $(DESTINC)/ps1_sim_defs.h \
 $(DESTINC)/cmf-ps1-dv3.h \
@@ -107,4 +108,5 @@
 $(SRC)/dvo_convert_PS1_REF.$(ARCH).o \
 $(SRC)/dvo_convert_PS1_REF_V2.$(ARCH).o \
+$(SRC)/dvo_convert_PS1_REF_V3.$(ARCH).o \
 $(SRC)/dvo_convert_PS1_SIM.$(ARCH).o \
 $(SRC)/flatcorr_io.$(ARCH).o    \
Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/include/dvo.h
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/include/dvo.h	(revision 42816)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/include/dvo.h	(revision 42817)
@@ -28,4 +28,5 @@
   DVO_FORMAT_PS1_REF,
   DVO_FORMAT_PS1_REF_V2,
+  DVO_FORMAT_PS1_REF_V3,
   DVO_FORMAT_PS1_SIM,
   DVO_FORMAT_PS1_V1,
@@ -252,4 +253,9 @@
 
   ID_SECF_OBJ_EXT       	 = 0x01000000, // extended in this band
+
+  //ID_SECF_PHO_SYNTH            = 0x00000001, // this photcode has SYNTH photometry, turn on only for reference catalog
+  //ID_SECF_PHO_ATLAS            = 0x00000002, // this photcode has ATLAS photometry, turn on only for reference catalog
+  //ID_SECF_PHO_PV3              = 0x00000004, // this photcode has PV3   photometry, turn on only for reference catalog
+  //ID_SECF_PHO_SOUTH            = 0x00000008, // this photcode has SOUTH photometry, turn on only for reference catalog
 
   ID_SECF_CHIP_FLAGS    	 = 0x01003f1f, // all chip-related bits (used to reset the correct bits only)
@@ -1089,4 +1095,5 @@
 # include "ps1_ref_defs.h"
 # include "ps1_ref_v2_defs.h"
+# include "ps1_ref_v3_defs.h"
 # include "ps1_sim_defs.h"
 
Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/include/ps1_ref_v3_defs.h
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/include/ps1_ref_v3_defs.h	(revision 42817)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/include/ps1_ref_v3_defs.h	(revision 42817)
@@ -0,0 +1,11 @@
+Image 		       	*Image_PS1_REF_V3_ToInternal (Image_PS1_REF_V3 *in, off_t Nvalues, off_t Nalloc);
+Image_PS1_REF_V3    	*ImageInternalTo_PS1_REF_V3 (Image *in, off_t Nvalues);
+Average 	       	*Average_PS1_REF_V3_ToInternal (Average_PS1_REF_V3 *in, off_t Nvalues, SecFilt **primary);
+Average_PS1_REF_V3      *AverageInternalTo_PS1_REF_V3 (Average *in, off_t Nvalues, SecFilt *primary);
+Measure 	       	*Measure_PS1_REF_V3_ToInternal (Average *ave, Measure_PS1_REF_V3 *in, off_t Nvalues);
+Measure_PS1_REF_V3      *MeasureInternalTo_PS1_REF_V3 (Average *ave, Measure *in, off_t Nvalues);
+SecFilt 	       	*SecFilt_PS1_REF_V3_ToInternal (SecFilt_PS1_REF_V3 *in, off_t Nvalues);
+SecFilt_PS1_REF_V3      *SecFiltInternalTo_PS1_REF_V3 (SecFilt *in, off_t Nvalues);
+
+PhotCode                *PhotCode_PS1_REF_V3_To_Internal (PhotCode_PS1_REF_V3 *in, off_t Nvalues);
+PhotCode_PS1_REF_V3     *PhotCode_Internal_To_PS1_REF_V3 (PhotCode *in, off_t Nvalues);
Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/LoadPhotcodesFITS.c
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/LoadPhotcodesFITS.c	(revision 42816)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/LoadPhotcodesFITS.c	(revision 42817)
@@ -60,4 +60,5 @@
   CONVERT_FORMAT("DVO_PHOTCODE_PS1_REF",     PS1_REF);
   CONVERT_FORMAT("DVO_PHOTCODE_PS1_REF_V2",  PS1_REF_V2);
+  CONVERT_FORMAT("DVO_PHOTCODE_PS1_REF_V3",  PS1_REF_V3);
   CONVERT_FORMAT("DVO_PHOTCODE_PS1_V1",      PS1_V1);
   CONVERT_FORMAT("DVO_PHOTCODE_PS1_V2",      PS1_V2);
Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_catalog.c
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_catalog.c	(revision 42816)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_catalog.c	(revision 42817)
@@ -61,4 +61,5 @@
   if (!strcasecmp (catformat, "PS1_REF"))         return (DVO_FORMAT_PS1_REF);
   if (!strcasecmp (catformat, "PS1_REF_V2"))      return (DVO_FORMAT_PS1_REF_V2);
+  if (!strcasecmp (catformat, "PS1_REF_V3"))      return (DVO_FORMAT_PS1_REF_V3);
   if (!strcasecmp (catformat, "PS1_SIM"))         return (DVO_FORMAT_PS1_SIM);
   return (DVO_FORMAT_UNDEF);
Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_catalog_raw.c
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_catalog_raw.c	(revision 42816)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_catalog_raw.c	(revision 42817)
@@ -95,4 +95,5 @@
       FORMAT_CASE (PS1_REF,     PS1_REF);
       FORMAT_CASE (PS1_REF_V2,  PS1_REF_V2);
+      FORMAT_CASE (PS1_REF_V3,  PS1_REF_V3);
       FORMAT_CASE (PS1_SIM,     PS1_SIM);
 
@@ -294,4 +295,5 @@
   if (catalog[0].catformat == DVO_FORMAT_PS1_REF)         gfits_modify (&catalog[0].header, "FORMAT", "%s", 1, "PS1_REF");
   if (catalog[0].catformat == DVO_FORMAT_PS1_REF_V2)      gfits_modify (&catalog[0].header, "FORMAT", "%s", 1, "PS1_REF_V2");
+  if (catalog[0].catformat == DVO_FORMAT_PS1_REF_V3)      gfits_modify (&catalog[0].header, "FORMAT", "%s", 1, "PS1_REF_V3");
   if (catalog[0].catformat == DVO_FORMAT_PS1_SIM)         gfits_modify (&catalog[0].header, "FORMAT", "%s", 1, "PS1_SIM");
 
@@ -402,4 +404,5 @@
       FORMAT_CASE (PS1_REF,     PS1_REF);
       FORMAT_CASE (PS1_REF_V2,  PS1_REF_V2);
+      FORMAT_CASE (PS1_REF_V3,  PS1_REF_V3);
       FORMAT_CASE (PS1_SIM,     PS1_SIM);
 
@@ -458,4 +461,5 @@
       FORMAT_CASE (PS1_REF,     PS1_REF);
       FORMAT_CASE (PS1_REF_V2,  PS1_REF_V2);
+      FORMAT_CASE (PS1_REF_V3,  PS1_REF_V3);
       FORMAT_CASE (PS1_SIM,     PS1_SIM);
 
@@ -517,4 +521,5 @@
       FORMAT_CASE (PS1_REF,     PS1_REF);
       FORMAT_CASE (PS1_REF_V2,  PS1_REF_V2);
+      FORMAT_CASE (PS1_REF_V3,  PS1_REF_V3);
       FORMAT_CASE (PS1_SIM,     PS1_SIM);
 
@@ -573,4 +578,5 @@
       FORMAT_CASE (PS1_REF,     PS1_REF);
       FORMAT_CASE (PS1_REF_V2,  PS1_REF_V2);
+      FORMAT_CASE (PS1_REF_V3,  PS1_REF_V3);
       FORMAT_CASE (PS1_SIM,     PS1_SIM);
 
@@ -633,4 +639,5 @@
       FORMAT_CASE (PS1_REF,     PS1_REF);
       FORMAT_CASE (PS1_REF_V2,  PS1_REF_V2);
+      FORMAT_CASE (PS1_REF_V3,  PS1_REF_V3);
       FORMAT_CASE (PS1_SIM,     PS1_SIM);
 
@@ -689,4 +696,5 @@
       FORMAT_CASE (PS1_REF,     PS1_REF);
       FORMAT_CASE (PS1_REF_V2,  PS1_REF_V2);
+      FORMAT_CASE (PS1_REF_V3,  PS1_REF_V3);
       FORMAT_CASE (PS1_SIM,     PS1_SIM);
 
Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_convert.c
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_convert.c	(revision 42816)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_convert.c	(revision 42817)
@@ -46,4 +46,5 @@
   CONVERT_FORMAT ("DVO_AVERAGE_PS1_REF",         PS1_REF);
   CONVERT_FORMAT ("DVO_AVERAGE_PS1_REF_V2",      PS1_REF_V2);
+  CONVERT_FORMAT ("DVO_AVERAGE_PS1_REF_V3",      PS1_REF_V3);
   CONVERT_FORMAT ("DVO_AVERAGE_PS1_SIM",         PS1_SIM);
 # undef CONVERT_FORMAT
@@ -139,4 +140,5 @@
   CONVERT_FORMAT ("DVO_AVERAGE_PS1_REF",         PS1_REF,         PS1_REF);
   CONVERT_FORMAT ("DVO_AVERAGE_PS1_REF_V2",      PS1_REF_V2,      PS1_REF_V2);
+  CONVERT_FORMAT ("DVO_AVERAGE_PS1_REF_V3",      PS1_REF_V3,      PS1_REF_V3);
   CONVERT_FORMAT ("DVO_AVERAGE_PS1_SIM",         PS1_SIM,         PS1_SIM);
 # undef CONVERT_FORMAT
@@ -179,4 +181,5 @@
       FORMAT_CASE (PS1_REF,         PS1_REF);
       FORMAT_CASE (PS1_REF_V2,      PS1_REF_V2);
+      FORMAT_CASE (PS1_REF_V3,      PS1_REF_V3);
       FORMAT_CASE (PS1_SIM,         PS1_SIM);
 # undef FORMAT_CASE
@@ -280,4 +283,5 @@
   CONVERT_FORMAT ("DVO_MEASURE_PS1_REF",         PS1_REF,         PS1_REF,         FALSE);
   CONVERT_FORMAT ("DVO_MEASURE_PS1_REF_V2",      PS1_REF_V2,      PS1_REF_V2,      FALSE);
+  CONVERT_FORMAT ("DVO_MEASURE_PS1_REF_V3",      PS1_REF_V3,      PS1_REF_V3,      FALSE);
   CONVERT_FORMAT ("DVO_MEASURE_PS1_SIM",         PS1_SIM,         PS1_SIM,         TRUE);
 # undef CONVERT_FORMAT
@@ -322,4 +326,5 @@
       FORMAT_CASE (PS1_REF,         PS1_REF,         FALSE);
       FORMAT_CASE (PS1_REF_V2,      PS1_REF_V2,      FALSE);
+      FORMAT_CASE (PS1_REF_V3,      PS1_REF_V3,      FALSE);
       FORMAT_CASE (PS1_SIM,         PS1_SIM,         TRUE);
 # undef FORMAT_CASE
@@ -391,4 +396,5 @@
   SKIPPING_FORMAT ("DVO_MISSING_PS1_REF",         PS1_REF,         PS1_REF);
   SKIPPING_FORMAT ("DVO_MISSING_PS1_REF_V2",      PS1_REF_V2,      PS1_REF_V2);
+  SKIPPING_FORMAT ("DVO_MISSING_PS1_REF_V3",      PS1_REF_V3,      PS1_REF_V3);
   SKIPPING_FORMAT ("DVO_MISSING_ELIXIR", 	  ELIXIR,  	   Elixir);
   SKIPPING_FORMAT ("DVO_MISSING_LONEOS", 	  LONEOS,          Loneos);
@@ -482,4 +488,5 @@
   CONVERT_FORMAT ("DVO_SECFILT_PS1_REF",         PS1_REF,         PS1_REF);
   CONVERT_FORMAT ("DVO_SECFILT_PS1_REF_V2",      PS1_REF_V2,      PS1_REF_V2);
+  CONVERT_FORMAT ("DVO_SECFILT_PS1_REF_V3",      PS1_REF_V3,      PS1_REF_V3);
   CONVERT_FORMAT ("DVO_SECFILT_PS1_SIM",         PS1_SIM,         PS1_SIM);
 # undef CONVERT_FORMAT
@@ -522,4 +529,5 @@
       FORMAT_CASE (PS1_REF,         PS1_REF);
       FORMAT_CASE (PS1_REF_V2,      PS1_REF_V2);
+      FORMAT_CASE (PS1_REF_V3,      PS1_REF_V3);
       FORMAT_CASE (PS1_SIM,         PS1_SIM);
 # undef FORMAT_CASE
@@ -618,4 +626,5 @@
   SKIPPING_FORMAT ("DVO_LENSING_PS1_REF",         PS1_REF,         PS1_REF);
   SKIPPING_FORMAT ("DVO_LENSING_PS1_REF_V2",      PS1_REF_V2,      PS1_REF_V2);
+  SKIPPING_FORMAT ("DVO_LENSING_PS1_REF_V3",      PS1_REF_V3,      PS1_REF_V3);
   SKIPPING_FORMAT ("DVO_LENSING_ELIXIR", 	  ELIXIR,  	   Elixir);
   SKIPPING_FORMAT ("DVO_LENSING_LONEOS", 	  LONEOS,          Loneos);
@@ -660,4 +669,5 @@
 //    FORMAT_CASE (PS1_REF,         PS1_REF);
 //    FORMAT_CASE (PS1_REF_V2,      PS1_REF_V2);
+//    FORMAT_CASE (PS1_REF_V3,      PS1_REF_V3);
 //    FORMAT_CASE (ELIXIR, 	    Elixir);
 //    FORMAT_CASE (LONEOS, 	    Loneos);
@@ -742,4 +752,5 @@
   SKIPPING_FORMAT ("DVO_LENSOBJ_PS1_REF",         PS1_REF,         PS1_REF);
   SKIPPING_FORMAT ("DVO_LENSOBJ_PS1_REF_V2",      PS1_REF_V2,      PS1_REF_V2);
+  SKIPPING_FORMAT ("DVO_LENSOBJ_PS1_REF_V3",      PS1_REF_V3,      PS1_REF_V3);
   SKIPPING_FORMAT ("DVO_LENSOBJ_ELIXIR", 	  ELIXIR,  	   Elixir);
   SKIPPING_FORMAT ("DVO_LENSOBJ_LONEOS", 	  LONEOS,          Loneos);
@@ -784,4 +795,5 @@
 //    FORMAT_CASE (PS1_REF,         PS1_REF);
 //    FORMAT_CASE (PS1_REF_V2,      PS1_REF_V2);
+//    FORMAT_CASE (PS1_REF_V3,      PS1_REF_V3);
 //    FORMAT_CASE (ELIXIR, 	    Elixir);
 //    FORMAT_CASE (LONEOS, 	    Loneos);
@@ -854,4 +866,5 @@
   SKIPPING_FORMAT ("DVO_STARPAR_PS1_REF",         PS1_REF,         PS1_REF);
   SKIPPING_FORMAT ("DVO_STARPAR_PS1_REF_V2",      PS1_REF_V2,      PS1_REF_V2);
+  SKIPPING_FORMAT ("DVO_STARPAR_PS1_REF_V3",      PS1_REF_V3,      PS1_REF_V3);
   SKIPPING_FORMAT ("DVO_STARPAR_ELIXIR", 	  ELIXIR,  	   Elixir);
   SKIPPING_FORMAT ("DVO_STARPAR_LONEOS", 	  LONEOS,          Loneos);
@@ -896,4 +909,5 @@
 //    FORMAT_CASE (PS1_REF,         PS1_REF);
 //    FORMAT_CASE (PS1_REF_V2,      PS1_REF_V2);
+//    FORMAT_CASE (PS1_REF_V3,      PS1_REF_V3);
 //    FORMAT_CASE (ELIXIR, 	    Elixir);
 //    FORMAT_CASE (LONEOS, 	    Loneos);
@@ -979,4 +993,5 @@
   SKIPPING_FORMAT ("DVO_GALPHOT_PS1_REF",         PS1_REF,         PS1_REF);
   SKIPPING_FORMAT ("DVO_GALPHOT_PS1_REF_V2",      PS1_REF_V2,      PS1_REF_V2);
+  SKIPPING_FORMAT ("DVO_GALPHOT_PS1_REF_V3",      PS1_REF_V3,      PS1_REF_V3);
   SKIPPING_FORMAT ("DVO_GALPHOT_ELIXIR", 	  ELIXIR,  	   Elixir);
   SKIPPING_FORMAT ("DVO_GALPHOT_LONEOS", 	  LONEOS,          Loneos);
@@ -1021,4 +1036,5 @@
 //    FORMAT_CASE (PS1_REF,         PS1_REF);
 //    FORMAT_CASE (PS1_REF_V2,      PS1_REF_V2);
+//    FORMAT_CASE (PS1_REF_V3,      PS1_REF_V3);
 //    FORMAT_CASE (ELIXIR, 	    Elixir);
 //    FORMAT_CASE (LONEOS, 	    Loneos);
@@ -1111,4 +1127,5 @@
   CONVERT_FORMAT ("DVO_IMAGE_PS1_REF",         PS1_REF,         PS1_REF);
   CONVERT_FORMAT ("DVO_IMAGE_PS1_REF_V2",      PS1_REF_V2,      PS1_REF_V2);
+  CONVERT_FORMAT ("DVO_IMAGE_PS1_REF_V3",      PS1_REF_V3,      PS1_REF_V3);
   CONVERT_FORMAT ("DVO_IMAGE_PS1_SIM",         PS1_SIM,         PS1_SIM);
 
@@ -1153,4 +1170,5 @@
     FORMAT_CASE (PS1_REF,         PS1_REF);
     FORMAT_CASE (PS1_REF_V2,      PS1_REF_V2);
+    FORMAT_CASE (PS1_REF_V3,      PS1_REF_V3);
     FORMAT_CASE (PS1_SIM,         PS1_SIM);
 
@@ -1207,4 +1225,5 @@
     FORMAT_CASE (PS1_REF,         PS1_REF);
     FORMAT_CASE (PS1_REF_V2,      PS1_REF_V2);
+    FORMAT_CASE (PS1_REF_V3,      PS1_REF_V3);
     FORMAT_CASE (PS1_SIM,         PS1_SIM);
 
Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_convert_PS1_REF_V3.c
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_convert_PS1_REF_V3.c	(revision 42817)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_convert_PS1_REF_V3.c	(revision 42817)
@@ -0,0 +1,364 @@
+# include <dvo.h>
+
+/* convert PS1_REF_V3 formats to internal formats */
+
+Measure *Measure_PS1_REF_V3_ToInternal (Average *ave, Measure_PS1_REF_V3 *in, off_t Nvalues) {
+
+  off_t i;
+  Measure *out;
+
+  ALLOCATE_ZERO (out, Measure, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    dvo_measure_init (&out[i]);
+
+    int averef = in[i].averef;
+    out[i].R          = ave[averef].R - in[i].dR / 3600.0;
+    out[i].D          = ave[averef].D - in[i].dD / 3600.0;
+    out[i].M          = in[i].M;
+    out[i].dM         = in[i].dM;
+    out[i].dt         = in[i].dt;
+    out[i].t          = in[i].t;
+    out[i].McalPSF    = in[i].Mcal;
+    out[i].McalAPER   = in[i].Mcal;
+    out[i].dMcal      = in[i].dMcal;
+    out[i].averef     = in[i].averef;
+    out[i].objID      = in[i].objID;
+    out[i].catID      = in[i].catID;
+    out[i].psfQF      = 1.0; // we do not save a value, but some operations (relphot/average) filter on this value..
+    out[i].photcode   = in[i].photcode;
+    out[i].dbFlags    = in[i].dbFlags;
+    out[i].photFlags  = in[i].photFlags;
+  }
+  return (out);
+}
+
+Measure_PS1_REF_V3 *MeasureInternalTo_PS1_REF_V3 (Average *ave, Measure *in, off_t Nvalues) {
+
+  off_t i;
+  Measure_PS1_REF_V3 *out;
+
+  ALLOCATE_ZERO (out, Measure_PS1_REF_V3, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    int averef = in[i].averef;
+
+    out[i].dR         = 3600.0*(ave[averef].R - in[i].R);
+    out[i].dD         = 3600.0*(ave[averef].D - in[i].D);
+    out[i].M          = in[i].M;
+    out[i].dM         = in[i].dM;
+    out[i].dt         = in[i].dt;
+    out[i].t          = in[i].t;
+    out[i].Mcal       = in[i].McalPSF;
+    out[i].dMcal      = in[i].dMcal;
+    out[i].averef     = in[i].averef;
+    out[i].objID      = in[i].objID;
+    out[i].catID      = in[i].catID;
+    out[i].photcode   = in[i].photcode;
+    out[i].dbFlags    = in[i].dbFlags;
+    out[i].photFlags  = in[i].photFlags;
+  }
+  return (out);
+}
+
+// 'primary' is needed to conform with the API for Loneos and Elixir, but is not used
+Average *Average_PS1_REF_V3_ToInternal (Average_PS1_REF_V3 *in, off_t Nvalues, SecFilt **primary) {
+  OHANA_UNUSED_PARAM(primary);
+
+  off_t i;
+  Average *out;
+
+  ALLOCATE_ZERO (out, Average, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    dvo_average_init (&out[i]);
+
+    out[i].R        	 = in[i].R;      
+    out[i].D        	 = in[i].D;      
+    out[i].dR       	 = in[i].dR;
+    out[i].dD       	 = in[i].dD;
+    out[i].uR       	  = in[i].uR;
+    out[i].uD       	  = in[i].uD;
+    out[i].duR      	  = in[i].duR;
+    out[i].duD      	  = in[i].duD;
+    out[i].P        	  = in[i].P;
+    out[i].dP       	  = in[i].dP;
+    out[i].Nmeasure      = in[i].Nmeasure;     
+    out[i].Nmissing      = in[i].Nmissing;     
+    out[i].measureOffset = in[i].measureOffset; 
+    out[i].missingOffset = in[i].missingOffset;
+    out[i].objID 	 = in[i].objID;
+    out[i].catID 	 = in[i].catID;
+  }
+  return (out);
+}
+
+// 'primary' is needed to conform with the API for Loneos and Elixir, but is not used
+Average_PS1_REF_V3 *AverageInternalTo_PS1_REF_V3 (Average *in, off_t Nvalues, SecFilt *primary) {
+  OHANA_UNUSED_PARAM(primary);
+
+  off_t i;
+  Average_PS1_REF_V3 *out;
+
+  ALLOCATE_ZERO (out, Average_PS1_REF_V3, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    out[i].R        	 = in[i].R;      
+    out[i].D        	 = in[i].D;      
+    out[i].dR       	 = in[i].dR;
+    out[i].dD       	 = in[i].dD;
+    out[i].uR       	 = in[i].uR;
+    out[i].uD       	 = in[i].uD;
+    out[i].duR      	 = in[i].duR;
+    out[i].duD      	 = in[i].duD;
+    out[i].P        	 = in[i].P;
+    out[i].dP       	 = in[i].dP;
+    out[i].Nmeasure      = in[i].Nmeasure;     
+    out[i].Nmissing      = in[i].Nmissing;     
+    out[i].measureOffset = in[i].measureOffset; 
+    out[i].missingOffset = in[i].missingOffset;
+    out[i].objID 	 = in[i].objID;
+    out[i].catID 	 = in[i].catID;
+    memset(out[i].pad, 0, sizeof(out[i].pad));
+  }
+  return (out);
+}
+
+SecFilt *SecFilt_PS1_REF_V3_ToInternal (SecFilt_PS1_REF_V3 *in, off_t Nvalues) {
+
+  off_t i;
+  SecFilt *out;
+
+  ALLOCATE_ZERO (out, SecFilt, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    dvo_secfilt_init (&out[i], SECFILT_RESET_ALL);
+
+    out[i].MpsfChp     = in[i].M;      
+    out[i].dMpsfChp    = in[i].dM;      
+    out[i].flags         = in[i].flags;     
+ }
+  return (out);
+}
+
+SecFilt_PS1_REF_V3 *SecFiltInternalTo_PS1_REF_V3 (SecFilt *in, off_t Nvalues) {
+
+  off_t i;
+  SecFilt_PS1_REF_V3 *out;
+
+  ALLOCATE_ZERO (out, SecFilt_PS1_REF_V3, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    out[i].M             = in[i].MpsfChp;      
+    out[i].dM            = in[i].dMpsfChp;      
+    out[i].flags         = in[i].flags;     
+  }
+  return (out);
+}
+
+# define RAW_IMAGE_NAME_LEN 121
+
+Image *Image_PS1_REF_V3_ToInternal (Image_PS1_REF_V3 *in, off_t Nvalues, off_t Nalloc) {
+
+  off_t i;
+  Image *out;
+
+  char *buffer;
+  ALLOCATE_ZERO (buffer, char, Nalloc);
+  out = (Image *) buffer;
+  // ALLOCATE_ZERO (out, Image, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    // this is only safe because the initial 120 bytes in Coords match CoordsDisk
+    memcpy (&out[i].coords, &in[i].coords, sizeof(CoordsDisk));
+    out[i].coords.mosaic   = NULL;
+    out[i].coords.offsetMap = NULL;
+
+    // RAW_IMAGE_NAME_LEN > DVO_IMAGE_NAME_LEN
+    strncpy (out[i].name, in[i].name, DVO_IMAGE_NAME_LEN - 1);
+    out[i].name[DVO_IMAGE_NAME_LEN - 1] = 0; // force termination
+
+    out[i].tzero    	    = in[i].tzero;
+    out[i].nstar    	    = in[i].nstar;
+    out[i].secz	    	    = in[i].secz;
+    out[i].NX	    	    = in[i].NX;
+    out[i].NY	    	    = in[i].NY;
+    out[i].apmifit  	    = in[i].apmifit;
+    out[i].dapmifit 	    = in[i].dapmifit;
+
+    out[i].McalPSF    	    = in[i].Mcal;
+    out[i].McalAPER    	    = in[i].Mcal;
+    out[i].dMcal    	    = in[i].dMcal;
+    out[i].McalChiSq  	    = pow(10.0, 0.01*in[i].Xm);
+
+    out[i].photcode   	    = in[i].photcode;
+    out[i].exptime  	    = in[i].exptime;
+    out[i].sidtime  	    = in[i].sidtime;
+    out[i].latitude  	    = in[i].latitude;
+    out[i].detection_limit  = in[i].detection_limit;
+    out[i].saturation_limit = in[i].saturation_limit;
+    out[i].cerror	    = in[i].cerror;
+    out[i].fwhm_x	    = in[i].fwhm_x;
+    out[i].fwhm_y	    = in[i].fwhm_y;
+    out[i].trate	    = in[i].trate;
+    out[i].ccdnum	    = in[i].ccdnum;
+    out[i].flags	    = in[i].flags;
+    out[i].imageID	    = in[i].imageID;
+    out[i].parentID	    = in[i].parentID;
+    out[i].externID	    = in[i].externID;
+    out[i].sourceID	    = in[i].sourceID;
+
+    // as of 2011.02.03, the old Mx,My,..., Mxxxx,Myyyy have been deprecated and replaced
+    // with the following.  (no real databases used those values -- see
+    // libdvo/doc/dvo-images.txt)
+    out[i].nLinkAstrom	    = in[i].nLinkAstrom;
+    out[i].nLinkPhotom	    = in[i].nLinkPhotom;
+    out[i].ubercalDist	    = in[i].dummy3; // new name PS1_V3
+    out[i].dXpixSys	    = in[i].dXpixSys;
+    out[i].dYpixSys	    = in[i].dYpixSys;
+    out[i].dMagSys	    = in[i].dMagSys;
+    out[i].nFitAstrom       = in[i].nFitAstrom;
+    out[i].nFitPhotom       = in[i].nFitPhotom;
+    out[i].photom_map_id    = in[i].photom_map_id;
+    out[i].astrom_map_id    = in[i].astrom_map_id;
+
+    // changed or added for PS1_V2
+    out[i].RAo  	    = NAN;
+    out[i].DECo  	    = NAN;
+    out[i].Radius  	    = NAN;
+  }
+  return (out);
+}
+
+Image_PS1_REF_V3 *ImageInternalTo_PS1_REF_V3 (Image *in, off_t Nvalues) {
+
+  off_t i;
+  Image_PS1_REF_V3 *out;
+
+  ALLOCATE_ZERO (out, Image_PS1_REF_V3, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    // this is only safe because the initial 120 bytes in Coords match CoordsDisk
+    memcpy (&out[i].coords, &in[i].coords, sizeof(CoordsDisk));
+
+    // RAW_IMAGE_NAME_LEN > DVO_IMAGE_NAME_LEN
+    strncpy (out[i].name, in[i].name, DVO_IMAGE_NAME_LEN - 1);
+    out[i].name[DVO_IMAGE_NAME_LEN - 1] = 0; // force termination
+
+    out[i].tzero    	    = in[i].tzero;
+    out[i].nstar    	    = in[i].nstar;
+    out[i].secz	    	    = in[i].secz;
+    out[i].NX	    	    = in[i].NX;
+    out[i].NY	    	    = in[i].NY;
+    out[i].apmifit  	    = in[i].apmifit;
+    out[i].dapmifit 	    = in[i].dapmifit;
+
+    out[i].Mcal	    	    = in[i].McalPSF;
+    out[i].dMcal    	    = in[i].dMcal;
+    out[i].Xm	    	    = 100.0*log10(in[i].McalChiSq);
+
+    out[i].photcode   	    = in[i].photcode;
+    out[i].exptime  	    = in[i].exptime;
+    out[i].sidtime  	    = in[i].sidtime;
+    out[i].latitude  	    = in[i].latitude;
+    out[i].detection_limit  = in[i].detection_limit;
+    out[i].saturation_limit = in[i].saturation_limit;
+    out[i].cerror	    = in[i].cerror;
+    out[i].fwhm_x	    = in[i].fwhm_x;
+    out[i].fwhm_y	    = in[i].fwhm_y;
+    out[i].trate	    = in[i].trate;
+    out[i].ccdnum	    = in[i].ccdnum;
+    out[i].flags	    = in[i].flags;
+    out[i].imageID	    = in[i].imageID;
+    out[i].parentID	    = in[i].parentID;
+    out[i].externID	    = in[i].externID;
+    out[i].sourceID	    = in[i].sourceID;
+
+    // as of 2011.02.03, the old Mx,My,..., Mxxxx,Myyyy have been deprecated and replaced
+    // with the following.  (no real databases used those values -- see
+    // libdvo/doc/dvo-images.txt)
+    out[i].nLinkAstrom	    = in[i].nLinkAstrom;
+    out[i].nLinkPhotom	    = in[i].nLinkPhotom;
+    out[i].dummy3	    = in[i].ubercalDist; // new name PS1_V3
+    out[i].dXpixSys	    = in[i].dXpixSys;
+    out[i].dYpixSys	    = in[i].dYpixSys;
+    out[i].dMagSys	    = in[i].dMagSys;
+    out[i].nFitAstrom       = in[i].nFitAstrom;
+    out[i].nFitPhotom       = in[i].nFitPhotom;
+    out[i].photom_map_id    = in[i].photom_map_id;
+    out[i].astrom_map_id    = in[i].astrom_map_id;
+  }
+  return (out);
+}
+
+PhotCode *PhotCode_PS1_REF_V3_To_Internal (PhotCode_PS1_REF_V3 *in, off_t Nvalues) {
+
+  off_t i;
+  PhotCode *out;
+
+  ALLOCATE_ZERO (out, PhotCode, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    strncpy (out[i].name, in[i].name, 31); // out[32], in[32]
+    out[i].name[31] = 0; // force termination
+
+    out[i].code  = in[i].code;         
+    out[i].type  = in[i].type;         
+    out[i].C     = in[i].C;            
+    out[i].dC 	 = in[i].dC;           
+    out[i].dX 	 = in[i].dX;           
+    out[i].K  	 = in[i].K;            
+    out[i].c1 	 = in[i].c1;           
+    out[i].c2 	 = in[i].c2;           
+    out[i].equiv = in[i].equiv;        
+    out[i].Nc    = in[i].Nc;           
+    memcpy (out[i].X, in[i].X, 4*sizeof(float));            
+
+    out[i].astromErrSys      = in[i].astromErrSys;
+    out[i].astromErrScale    = in[i].astromErrScale;
+    out[i].astromErrMagScale = in[i].astromErrMagScale;
+    out[i].photomErrSys      = in[i].photomErrSys;
+
+    out[i].photomPoorMask      = in[i].photomPoorMask;
+    out[i].photomBadMask       = in[i].photomBadMask;
+    out[i].astromPoorMask      = in[i].astromPoorMask;
+    out[i].astromBadMask       = in[i].astromBadMask;
+  }
+  return (out);
+}
+
+PhotCode_PS1_REF_V3 *PhotCode_Internal_To_PS1_REF_V3 (PhotCode *in, off_t Nvalues) {
+
+  off_t i;
+  PhotCode_PS1_REF_V3 *out;
+
+  ALLOCATE_ZERO (out, PhotCode_PS1_REF_V3, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    strncpy (out[i].name, in[i].name, 31); // out[32], in[32]
+    out[i].name[31] = 0; // force termination
+
+    out[i].code  = in[i].code;         
+    out[i].type  = in[i].type;         
+    out[i].C     = in[i].C;            
+    out[i].dC 	 = in[i].dC;           
+    out[i].dX 	 = in[i].dX;           
+    out[i].K  	 = in[i].K;            
+    out[i].c1 	 = in[i].c1;           
+    out[i].c2 	 = in[i].c2;           
+    out[i].equiv = in[i].equiv;        
+    out[i].Nc    = in[i].Nc;           
+    memcpy (out[i].X, in[i].X, 4*sizeof(float));            
+
+    out[i].astromErrSys      = in[i].astromErrSys;
+    out[i].astromErrScale    = in[i].astromErrScale;
+    out[i].astromErrMagScale = in[i].astromErrMagScale;
+    out[i].photomErrSys      = in[i].photomErrSys;
+
+    out[i].photomPoorMask      = in[i].photomPoorMask;
+    out[i].photomBadMask       = in[i].photomBadMask;
+    out[i].astromPoorMask      = in[i].astromPoorMask;
+    out[i].astromBadMask       = in[i].astromBadMask;
+  }
+  return (out);
+}
Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_image.c
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_image.c	(revision 42816)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_image.c	(revision 42817)
@@ -227,4 +227,5 @@
   if (db[0].format == DVO_FORMAT_PS1_REF)         gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PS1_REF");
   if (db[0].format == DVO_FORMAT_PS1_REF_V2)      gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PS1_REF_V2");
+  if (db[0].format == DVO_FORMAT_PS1_REF_V3)      gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PS1_REF_V3");
   if (db[0].format == DVO_FORMAT_PS1_SIM)         gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PS1_SIM");
   
Index: branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_image_raw.c
===================================================================
--- branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_image_raw.c	(revision 42816)
+++ branches/eam_branches/ipp-20230313/Ohana/src/libdvo/src/dvo_image_raw.c	(revision 42817)
@@ -64,4 +64,5 @@
   if (db[0].format == DVO_FORMAT_PS1_REF)         ImageSize = sizeof(Image_PS1_REF);
   if (db[0].format == DVO_FORMAT_PS1_REF_V2)      ImageSize = sizeof(Image_PS1_REF_V2);
+  if (db[0].format == DVO_FORMAT_PS1_REF_V3)      ImageSize = sizeof(Image_PS1_REF_V3);
   if (db[0].format == DVO_FORMAT_PS1_SIM)         ImageSize = sizeof(Image_PS1_SIM);
 
@@ -99,4 +100,5 @@
   if (db[0].format == DVO_FORMAT_PS1_REF)         gfits_table_mkheader_Image_PS1_REF (&db[0].theader);
   if (db[0].format == DVO_FORMAT_PS1_REF_V2)      gfits_table_mkheader_Image_PS1_REF_V2 (&db[0].theader);
+  if (db[0].format == DVO_FORMAT_PS1_REF_V3)      gfits_table_mkheader_Image_PS1_REF_V3 (&db[0].theader);
   if (db[0].format == DVO_FORMAT_PS1_SIM)         gfits_table_mkheader_Image_PS1_SIM (&db[0].theader);
     
