Index: trunk/Ohana/src/libdvo/Makefile
===================================================================
--- trunk/Ohana/src/libdvo/Makefile	(revision 16268)
+++ trunk/Ohana/src/libdvo/Makefile	(revision 16810)
@@ -29,5 +29,6 @@
 $(DESTINC)/panstarrs_dev_0_defs.h \
 $(DESTINC)/panstarrs_dev_1_defs.h \
-$(DESTINC)/ps1_dev_1_defs.h
+$(DESTINC)/ps1_dev_1_defs.h \
+$(DESTINC)/ps1_dev_2_defs.h
 
 INCS = $(DEFS) $(DESTINC)/dvo.h $(DESTINC)/autocode.h
@@ -37,7 +38,4 @@
 $(SRC)/coordops.$(ARCH).o	 \
 $(SRC)/dvosorts.$(ARCH).o	 \
-$(SRC)/dvo_photcode_ops.$(ARCH).o \
-$(SRC)/dvo_photcode_convert_elixir.$(ARCH).o \
-$(SRC)/dvo_photcode_convert_ps1_dev_1.$(ARCH).o \
 $(SRC)/dvo_photcode_ops.$(ARCH).o \
 $(SRC)/LoadPhotcodes.$(ARCH).o   \
@@ -64,4 +62,5 @@
 $(SRC)/dvo_convert_panstarrs_DEV_1.$(ARCH).o \
 $(SRC)/dvo_convert_PS1_DEV_1.$(ARCH).o \
+$(SRC)/dvo_convert_PS1_DEV_2.$(ARCH).o \
 $(SRC)/skyregion_io.$(ARCH).o    \
 $(SRC)/skyregion_gsc.$(ARCH).o    \
Index: trunk/Ohana/src/libdvo/include/dvo.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvo.h	(revision 16268)
+++ trunk/Ohana/src/libdvo/include/dvo.h	(revision 16810)
@@ -16,5 +16,6 @@
 	      DVO_FORMAT_PANSTARRS_DEV_0,
 	      DVO_FORMAT_PANSTARRS_DEV_1,
-	      DVO_FORMAT_PS1_DEV_1
+	      DVO_FORMAT_PS1_DEV_1,
+	      DVO_FORMAT_PS1_DEV_2
 } DVOTableFormat;
 
@@ -215,4 +216,7 @@
   struct Catalog *secfilt_catalog;		/* secfilt catalog data (split) */
 
+  unsigned int objID;
+  unsigned int catID;
+
   /* extra catalog information */
   int lockmode;
@@ -383,4 +387,5 @@
 # include "panstarrs_dev_1_defs.h"
 # include "ps1_dev_1_defs.h"
+# include "ps1_dev_2_defs.h"
 
 /*** DVO image db I/O Functions ***/
Index: trunk/Ohana/src/libdvo/include/ps1_dev_2_defs.h
===================================================================
--- trunk/Ohana/src/libdvo/include/ps1_dev_2_defs.h	(revision 16810)
+++ trunk/Ohana/src/libdvo/include/ps1_dev_2_defs.h	(revision 16810)
@@ -0,0 +1,11 @@
+Image 		       	*Image_PS1_DEV_2_ToInternal (Image_PS1_DEV_2 *in, int Nvalues);
+Image_PS1_DEV_2  	*ImageInternalTo_PS1_DEV_2 (Image *in, int Nvalues);
+Average 	       	*Average_PS1_DEV_2_ToInternal (Average_PS1_DEV_2 *in, int Nvalues, SecFilt **primary);
+Average_PS1_DEV_2       *AverageInternalTo_PS1_DEV_2 (Average *in, int Nvalues, SecFilt *primary);
+Measure 	       	*Measure_PS1_DEV_2_ToInternal (Measure_PS1_DEV_2 *in, int Nvalues);
+Measure_PS1_DEV_2       *MeasureInternalTo_PS1_DEV_2 (Measure *in, int Nvalues);
+SecFilt 	       	*SecFilt_PS1_DEV_2_ToInternal (SecFilt_PS1_DEV_2 *in, int Nvalues);
+SecFilt_PS1_DEV_2       *SecFiltInternalTo_PS1_DEV_2 (SecFilt *in, int Nvalues);
+
+PhotCode *PhotCode_PS1_DEV_2_To_Internal (PhotCode_PS1_DEV_2 *in, int Nvalues);
+PhotCode_PS1_DEV_2 *PhotCode_Internal_To_PS1_DEV_2 (PhotCode *in, int Nvalues);
Index: trunk/Ohana/src/libdvo/src/LoadPhotcodesFITS.c
===================================================================
--- trunk/Ohana/src/libdvo/src/LoadPhotcodesFITS.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/LoadPhotcodesFITS.c	(revision 16810)
@@ -50,4 +50,10 @@
     photcode = PhotCode_PS1_DEV_1_To_Internal (photcode_ps1_dev_1, Ncode);
     free (photcode_ps1_dev_1);
+  } 
+
+  if (!strcmp (extname, "DVO_PHOTCODE_PS1_DEV_2")) {
+    PhotCode_PS1_DEV_2 *photcode_ps1_dev_2 = gfits_table_get_PhotCode_PS1_DEV_2 (&db.ftable, &Ncode, &db.swapped);
+    photcode = PhotCode_PS1_DEV_2_To_Internal (photcode_ps1_dev_2, Ncode);
+    free (photcode_ps1_dev_2);
   } 
 
Index: trunk/Ohana/src/libdvo/src/LoadPhotcodesText.c
===================================================================
--- trunk/Ohana/src/libdvo/src/LoadPhotcodesText.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/LoadPhotcodesText.c	(revision 16810)
@@ -27,6 +27,7 @@
   char *c;
   char line[256], **c1_names, **c2_names, **eq_names;
-  char name[32], type[32], Zero[32], Airmass[32], Offset[32],
-    C1[32], C2[32], Slope[32], Color[32], Primary[32];
+  char name[32], type[32], Zero[32], Airmass[32], Offset[32];
+  char C1[32], C2[32], Slope[32], Color[32], Primary[32];
+  char astromErrSys[32], astromErrScale[32], astromErrMagScale[32], photomErrSys[32];
 
   table = GetPhotcodeTable ();
@@ -60,12 +61,27 @@
     for (c = line; isspace (*c); c++);
     if (*c == '#') continue;
-    Nfield = sscanf (c, "%d %s %s %s %s %s %s %s %s %s %s", 
-		     &code, name, type, Zero, Airmass, Offset, C1, C2, Slope, Color, Primary);
-
-    // XXX to add the AstromError (and PhotError) terms, we need to add them to the photcode structure, and
-    // define methods to read (at least) the old and the new photcode versions.
-
-    if (Nfield != 11) { continue; }
-    
+    Nfield = sscanf (c, "%d %s %s %s %s %s %s %s %s %s %s %s %s %s %s", 
+		     &code, name, type, Zero, Airmass, Offset, C1, C2, Slope, Color, Primary, astromErrSys, astromErrScale, astromErrMagScale, photomErrSys);
+
+    switch (Nfield) {
+      case 11: 
+	// minimum number of fields : original elixir layout
+	strcpy (astromErrSys,      "0.0");
+	strcpy (astromErrScale,    "0.0");
+	strcpy (astromErrMagScale, "0.0");
+	strcpy (photomErrSys,      "0.0");
+	break;
+      case 14: 
+	// allow only astrom elements
+	strcpy (photomErrSys,      "0.0");
+	break;
+      case 15: 
+	// all fields defined
+	break;
+      default:
+	// skip unknown layouts
+	continue;
+    }
+
     if (!code) {
 	fprintf (stderr, "photcode values may not be 0: fix %s\n", name);
@@ -95,4 +111,9 @@
       photcode[Ncode].type  = PHOT_ALT;
     }
+
+    photcode[Ncode].astromErrSys      = atof (astromErrSys);
+    photcode[Ncode].astromErrScale    = atof (astromErrScale);
+    photcode[Ncode].astromErrMagScale = atof (astromErrMagScale);
+    photcode[Ncode].photomErrSys      = atof (photomErrSys);
 
     switch (photcode[Ncode].type) {
Index: trunk/Ohana/src/libdvo/src/SavePhotcodesFITS.c
===================================================================
--- trunk/Ohana/src/libdvo/src/SavePhotcodesFITS.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/SavePhotcodesFITS.c	(revision 16810)
@@ -29,9 +29,9 @@
   // for the moment, we simply support the latest photcode format for output
   // XXX update this as needed as new formats are defined
-  PhotCode_PS1_DEV_1 *photcode_output = PhotCode_Internal_To_PS1_DEV_1 (table[0].code, table[0].Ncode);
+  PhotCode_PS1_DEV_2 *photcode_output = PhotCode_Internal_To_PS1_DEV_2 (table[0].code, table[0].Ncode);
 
   /* convert FITS format data to internal format (byteswaps & EXTNAME) */
   gfits_db_create (&db);
-  gfits_table_set_PhotCode_PS1_DEV_1 (&db.ftable, photcode_output, table[0].Ncode);
+  gfits_table_set_PhotCode_PS1_DEV_2 (&db.ftable, photcode_output, table[0].Ncode);
   gfits_db_save (&db);
   gfits_db_close (&db);
Index: trunk/Ohana/src/libdvo/src/dvo_catalog.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_catalog.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_catalog.c	(revision 16810)
@@ -51,4 +51,5 @@
   if (!strcasecmp (catformat, "PANSTARRS_DEV_1")) return (DVO_FORMAT_PANSTARRS_DEV_1);
   if (!strcasecmp (catformat, "PS1_DEV_1"))       return (DVO_FORMAT_PS1_DEV_1);
+  if (!strcasecmp (catformat, "PS1_DEV_2"))       return (DVO_FORMAT_PS1_DEV_2);
   return (DVO_FORMAT_UNDEF);
 }
Index: trunk/Ohana/src/libdvo/src/dvo_catalog_chipcoords.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_catalog_chipcoords.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_catalog_chipcoords.c	(revision 16810)
@@ -54,6 +54,6 @@
   
   for (i = 0; i < catalog[0].Naverage; i++) {
-    m = average[i].offset;
-    for (j = 0; j < average[i].Nm; j++, m++) {
+    m = average[i].measureOffset;
+    for (j = 0; j < average[i].Nmeasure; j++, m++) {
       ra  = average[i].R - measure[m].dR / 3600.0;
       dec = average[i].D - measure[m].dD / 3600.0;
Index: trunk/Ohana/src/libdvo/src/dvo_catalog_raw.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_catalog_raw.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_catalog_raw.c	(revision 16810)
@@ -73,4 +73,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1, PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2, PS1_DEV_2);
 
     default:
@@ -188,6 +189,6 @@
   if (catalog[0].catflags & LOAD_AVES) {
     for (i = Nmeas = Nmiss = 0; i < catalog[0].Naverage; i++) {
-      Nmeas += catalog[0].average[i].Nm; 
-      Nmiss += catalog[0].average[i].Nn; 
+      Nmeas += catalog[0].average[i].Nmeasure; 
+      Nmiss += catalog[0].average[i].Nmissing; 
     }
     if ((Nmeas != catalog[0].Nmeasure) || (Nmiss != catalog[0].Nmissing)) {
@@ -256,4 +257,5 @@
   if (catalog[0].catformat == DVO_FORMAT_PANSTARRS_DEV_1) gfits_modify (&catalog[0].header, "FORMAT", "%s", 1, "PANSTARRS_DEV_1");
   if (catalog[0].catformat == DVO_FORMAT_PS1_DEV_1)       gfits_modify (&catalog[0].header, "FORMAT", "%s", 1, "PS1_DEV_1");
+  if (catalog[0].catformat == DVO_FORMAT_PS1_DEV_2)       gfits_modify (&catalog[0].header, "FORMAT", "%s", 1, "PS1_DEV_2");
 
   /* rewind file pointers and truncate file */
@@ -350,4 +352,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1, PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2, PS1_DEV_2);
 
     default:
@@ -395,4 +398,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1, PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2, PS1_DEV_2);
 
     default:
@@ -444,4 +448,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1, PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2, PS1_DEV_2);
 
     default:
@@ -489,4 +494,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1, PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2, PS1_DEV_2);
 
     default:
@@ -538,4 +544,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1, PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2, PS1_DEV_2);
 
     default:
@@ -583,4 +590,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1, PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2, PS1_DEV_2);
 
     default:
Index: trunk/Ohana/src/libdvo/src/dvo_convert.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_convert.c	(revision 16810)
@@ -48,4 +48,5 @@
   CONVERT_FORMAT ("DVO_AVERAGE_PANSTARRS_DEV_1", PANSTARRS_DEV_1, Panstarrs_DEV_1);
   CONVERT_FORMAT ("DVO_AVERAGE_PS1_DEV_1",       PS1_DEV_1,       PS1_DEV_1);
+  CONVERT_FORMAT ("DVO_AVERAGE_PS1_DEV_2",       PS1_DEV_2,       PS1_DEV_2);
 # undef CONVERT_FORMAT
 
@@ -77,4 +78,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1,       PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2,       PS1_DEV_2);
 # undef FORMAT_CASE
 
@@ -119,4 +121,5 @@
   CONVERT_FORMAT ("DVO_MEASURE_PANSTARRS_DEV_1", PANSTARRS_DEV_1, Panstarrs_DEV_1);
   CONVERT_FORMAT ("DVO_MEASURE_PS1_DEV_1",       PS1_DEV_1,       PS1_DEV_1);
+  CONVERT_FORMAT ("DVO_MEASURE_PS1_DEV_2",       PS1_DEV_2,       PS1_DEV_2);
 # undef CONVERT_FORMAT
 
@@ -148,4 +151,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1,       PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2,       PS1_DEV_2);
 # undef FORMAT_CASE
 
@@ -190,4 +194,5 @@
   CONVERT_FORMAT ("DVO_SECFILT_PANSTARRS_DEV_1", PANSTARRS_DEV_1, Panstarrs_DEV_1);
   CONVERT_FORMAT ("DVO_SECFILT_PS1_DEV_1",       PS1_DEV_1,       PS1_DEV_1);
+  CONVERT_FORMAT ("DVO_SECFILT_PS1_DEV_2",       PS1_DEV_2,       PS1_DEV_2);
 # undef CONVERT_FORMAT
 
@@ -219,4 +224,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1,       PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2,       PS1_DEV_2);
 # undef FORMAT_CASE
 
@@ -281,4 +287,5 @@
   CONVERT_FORMAT ("DVO_IMAGE_PANSTARRS_DEV_1", PANSTARRS_DEV_1, Panstarrs_DEV_1);
   CONVERT_FORMAT ("DVO_IMAGE_PS1_DEV_1",       PS1_DEV_1,       PS1_DEV_1);
+  CONVERT_FORMAT ("DVO_IMAGE_PS1_DEV_2",       PS1_DEV_2,       PS1_DEV_2);
 # undef CONVERT_FORMAT
 
@@ -313,4 +320,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1,       PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2,       PS1_DEV_2);
 # undef FORMAT_CASE
 
@@ -361,4 +369,5 @@
       FORMAT_CASE (PANSTARRS_DEV_1, Panstarrs_DEV_1);
       FORMAT_CASE (PS1_DEV_1,       PS1_DEV_1);
+      FORMAT_CASE (PS1_DEV_2,       PS1_DEV_2);
 # undef FORMAT_CASE
 
Index: trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_1.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_1.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_1.c	(revision 16810)
@@ -1,7 +1,6 @@
 # include <dvo.h>
 
-// XXX these functions ahve to be adjusted to agree with the new definition of PS1_DEV_1
-
-/* convert panstarrs-format measures to internal measures */
+/* convert PS1_DEV_1 formats to internal formats */
+
 Measure *Measure_PS1_DEV_1_ToInternal (Measure_PS1_DEV_1 *in, int Nvalues) {
 
@@ -16,5 +15,5 @@
     out[i].M          = in[i].M;
     out[i].Mcal       = in[i].Mcal;
-    out[i].Mgal       = in[i].Mgal;
+    out[i].Map        = in[i].Mgal;
     out[i].dM         = in[i].dM;
     out[i].dt         = in[i].dt;
@@ -30,5 +29,5 @@
     out[i].imageID    = in[i].imageID;
     out[i].qPSF       = in[i].qPSF;
-    out[i].psfProb    = in[i].psfProb;
+    out[i].psfChisq   = in[i].psfChisq;
     out[i].crNsigma   = in[i].crNsigma;
     out[i].extNsigma  = in[i].extNsigma;
@@ -47,5 +46,4 @@
 }
 
-/* convert internal measures to panstarrs-format measures */
 Measure_PS1_DEV_1 *MeasureInternalTo_PS1_DEV_1 (Measure *in, int Nvalues) {
 
@@ -60,5 +58,5 @@
     out[i].M          = in[i].M;
     out[i].Mcal       = in[i].Mcal;
-    out[i].Mgal       = in[i].Mgal;
+    out[i].Mgal       = in[i].Map;
     out[i].dM         = in[i].dM;
     out[i].dt         = in[i].dt;
@@ -74,5 +72,5 @@
     out[i].imageID    = in[i].imageID;
     out[i].qPSF       = in[i].qPSF;
-    out[i].psfProb    = in[i].psfProb;
+    out[i].psfChisq   = in[i].psfChisq;
     out[i].crNsigma   = in[i].crNsigma;
     out[i].extNsigma  = in[i].extNsigma;
@@ -91,6 +89,5 @@
 }
 
-/* convert panstarrs-format averages to internal averages */
-// 'primary is needed to conform with the API for Loneos and Elixir, but is not used
+// 'primary' is needed to conform with the API for Loneos and Elixir, but is not used
 Average *Average_PS1_DEV_1_ToInternal (Average_PS1_DEV_1 *in, int Nvalues, SecFilt **primary) {
 
@@ -99,4 +96,35 @@
 
   ALLOCATE (out, Average, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    out[i].R        	 = in[i].R;      
+    out[i].D        	 = in[i].D;      
+    out[i].Xp       	 = in[i].Xp;     
+    out[i].Nmeasure      = in[i].Nm;     
+    out[i].Nmissing      = in[i].Nn;     
+    out[i].code     	 = in[i].code;   
+    out[i].measureOffset = in[i].offset; 
+    out[i].missingOffset = in[i].missing;
+    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].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_DEV_1 *AverageInternalTo_PS1_DEV_1 (Average *in, int Nvalues, SecFilt *primary) {
+
+  int i;
+  Average_PS1_DEV_1 *out;
+
+  ALLOCATE (out, Average_PS1_DEV_1, Nvalues);
 
   for (i = 0; i < Nvalues; i++) {
@@ -104,9 +132,9 @@
     out[i].D        = in[i].D;      
     out[i].Xp       = in[i].Xp;     
-    out[i].Nm       = in[i].Nm;     
-    out[i].Nn       = in[i].Nn;     
+    out[i].Nm       = in[i].Nmeasure;     
+    out[i].Nn       = in[i].Nmissing;     
     out[i].code     = in[i].code;   
-    out[i].offset   = in[i].offset; 
-    out[i].missing  = in[i].missing;
+    out[i].offset   = in[i].measureOffset; 
+    out[i].missing  = in[i].missingOffset;
     out[i].dR       = in[i].dR;
     out[i].dD       = in[i].dD;
@@ -117,43 +145,10 @@
     out[i].P        = in[i].P;
     out[i].dP       = in[i].dP;
-    out[i].objID_hi = in[i].objID_hi;
-    out[i].objID_lo = in[i].objID_lo;
-  }
-  return (out);
-}
-
-/* convert internal averages to panstarrs-format averages */
-// 'primary is needed to conform with the API for Loneos and Elixir, but is not used
-Average_PS1_DEV_1 *AverageInternalTo_PS1_DEV_1 (Average *in, int Nvalues, SecFilt *primary) {
-
-  int i;
-  Average_PS1_DEV_1 *out;
-
-  ALLOCATE (out, Average_PS1_DEV_1, Nvalues);
-
-  for (i = 0; i < Nvalues; i++) {
-    out[i].R        = in[i].R;      
-    out[i].D        = in[i].D;      
-    out[i].Xp       = in[i].Xp;     
-    out[i].Nm       = in[i].Nm;     
-    out[i].Nn       = in[i].Nn;     
-    out[i].code     = in[i].code;   
-    out[i].offset   = in[i].offset; 
-    out[i].missing  = in[i].missing;
-    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].objID_hi = in[i].objID_hi;
-    out[i].objID_lo = in[i].objID_lo;
-  }
-  return (out);
-}
-
-/* convert panstarrs-format secfilts to internal secfilts */
+    out[i].objID    = in[i].objID;
+    out[i].catID    = in[i].catID;
+  }
+  return (out);
+}
+
 SecFilt *SecFilt_PS1_DEV_1_ToInternal (SecFilt_PS1_DEV_1 *in, int Nvalues) {
 
@@ -173,5 +168,4 @@
 }
 
-/* convert internal secfilts to panstarrs-format secfilts */
 SecFilt_PS1_DEV_1 *SecFiltInternalTo_PS1_DEV_1 (SecFilt *in, int Nvalues) {
 
@@ -191,5 +185,4 @@
 }
 
-/* convert panstarrs-format images to internal images */
 Image *Image_PS1_DEV_1_ToInternal (Image_PS1_DEV_1 *in, int Nvalues) {
 
@@ -300,2 +293,66 @@
   return (out);
 }
+
+PhotCode_PS1_DEV_1 *PhotCode_Internal_To_PS1_DEV_1 (PhotCode *in, int Nvalues) {
+
+  int i;
+  PhotCode_PS1_DEV_1 *out;
+
+  ALLOCATE (out, PhotCode_PS1_DEV_1, 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].astromErrMagScale = out[i].astromErrMagScale;
+    out[i].photomErrSys      = out[i].photomErrSys;
+
+  }
+  return (out);
+}
+
+PhotCode *PhotCode_PS1_DEV_1_To_Internal (PhotCode_PS1_DEV_1 *in, int Nvalues) {
+
+  int i;
+  PhotCode *out;
+
+  ALLOCATE (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;           
+
+    // not defined in PS1_DEV_1
+    out[i].astromErrSys      = 0.0;
+    out[i].astromErrScale    = 0.0;
+    out[i].astromErrMagScale = in[i].astromErrMagScale;
+    out[i].photomErrSys      = in[i].photomErrSys;
+
+    memcpy (out[i].X, in[i].X, 4*sizeof(float));            
+
+  }
+  return (out);
+}
Index: trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_2.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_2.c	(revision 16810)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_2.c	(revision 16810)
@@ -0,0 +1,365 @@
+# include <dvo.h>
+
+/* convert PS1_DEV_2 formats to internal formats */
+
+Measure *Measure_PS1_DEV_2_ToInternal (Measure_PS1_DEV_2 *in, int Nvalues) {
+
+  int i;
+  Measure *out;
+
+  ALLOCATE (out, Measure, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    out[i].dR         = in[i].dR;
+    out[i].dD         = in[i].dD;
+    out[i].M          = in[i].M;
+    out[i].Mcal       = in[i].Mcal;
+    out[i].Map        = in[i].Map;
+    out[i].dM         = in[i].dM;
+    out[i].dMcal      = in[i].dMcal;
+    out[i].dt         = in[i].dt;
+    out[i].airmass    = in[i].airmass;
+    out[i].az         = in[i].az;
+    out[i].Xccd       = in[i].Xccd;
+    out[i].Yccd       = in[i].Yccd;
+    out[i].Sky        = in[i].Sky;
+    out[i].dSky       = in[i].dSky;
+    out[i].t          = in[i].t;
+    out[i].averef     = in[i].averef;
+    out[i].detID      = in[i].detID;
+    out[i].imageID    = in[i].imageID;
+    out[i].qPSF       = in[i].qPSF;
+    out[i].psfChisq   = in[i].psfChisq;
+    out[i].crNsigma   = in[i].crNsigma;
+    out[i].extNsigma  = in[i].extNsigma;
+    out[i].FWx 	      = in[i].FWx;
+    out[i].FWy 	      = in[i].FWy;
+    out[i].theta      = in[i].theta;
+    out[i].photcode   = in[i].photcode;
+    out[i].dXccd      = in[i].dXccd;
+    out[i].dYccd      = in[i].dYccd;
+    out[i].dbFlags    = in[i].dbFlags;
+    out[i].photFlags  = in[i].photFlags;
+    out[i].stargal    = in[i].stargal;
+    out[i].dophot     = in[i].dophot;
+  }
+  return (out);
+}
+
+Measure_PS1_DEV_2 *MeasureInternalTo_PS1_DEV_2 (Measure *in, int Nvalues) {
+
+  int i;
+  Measure_PS1_DEV_2 *out;
+
+  ALLOCATE (out, Measure_PS1_DEV_2, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    out[i].dR         = in[i].dR;
+    out[i].dD         = in[i].dD;
+    out[i].M          = in[i].M;
+    out[i].Mcal       = in[i].Mcal;
+    out[i].Map        = in[i].Map;
+    out[i].dM         = in[i].dM;
+    out[i].dMcal      = in[i].dMcal;
+    out[i].dt         = in[i].dt;
+    out[i].airmass    = in[i].airmass;
+    out[i].az         = in[i].az;
+    out[i].Xccd       = in[i].Xccd;
+    out[i].Yccd       = in[i].Yccd;
+    out[i].Sky        = in[i].Sky;
+    out[i].dSky       = in[i].dSky;
+    out[i].t          = in[i].t;
+    out[i].averef     = in[i].averef;
+    out[i].detID      = in[i].detID;
+    out[i].imageID    = in[i].imageID;
+    out[i].qPSF       = in[i].qPSF;
+    out[i].psfChisq   = in[i].psfChisq;
+    out[i].crNsigma   = in[i].crNsigma;
+    out[i].extNsigma  = in[i].extNsigma;
+    out[i].FWx 	      = in[i].FWx;
+    out[i].FWy 	      = in[i].FWy;
+    out[i].theta      = in[i].theta;
+    out[i].photcode   = in[i].photcode;
+    out[i].dXccd      = in[i].dXccd;
+    out[i].dYccd      = in[i].dYccd;
+    out[i].dbFlags    = in[i].dbFlags;
+    out[i].photFlags  = in[i].photFlags;
+    out[i].stargal    = in[i].stargal;
+    out[i].dophot     = in[i].dophot;
+  }
+  return (out);
+}
+
+// 'primary' is needed to conform with the API for Loneos and Elixir, but is not used
+Average *Average_PS1_DEV_2_ToInternal (Average_PS1_DEV_2 *in, int Nvalues, SecFilt **primary) {
+
+  int i;
+  Average *out;
+
+  ALLOCATE (out, Average, 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].Xp       	 = in[i].Xp;     
+    out[i].Nmeasure      = in[i].Nmeasure;     
+    out[i].Nmissing      = in[i].Nmissing;     
+    out[i].Nextend       = in[i].Nextend;     
+    out[i].code     	 = in[i].code;   
+    out[i].measureOffset = in[i].measureOffset; 
+    out[i].missingOffset = in[i].missingOffset;
+    out[i].extendOffset  = in[i].extendOffset;
+    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_DEV_2 *AverageInternalTo_PS1_DEV_2 (Average *in, int Nvalues, SecFilt *primary) {
+
+  int i;
+  Average_PS1_DEV_2 *out;
+
+  ALLOCATE (out, Average_PS1_DEV_2, 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].Xp       	 = in[i].Xp;     
+    out[i].Nmeasure      = in[i].Nmeasure;     
+    out[i].Nmissing      = in[i].Nmissing;     
+    out[i].Nextend       = in[i].Nextend;     
+    out[i].code     	 = in[i].code;   
+    out[i].measureOffset = in[i].measureOffset; 
+    out[i].missingOffset = in[i].missingOffset;
+    out[i].extendOffset  = in[i].extendOffset;
+    out[i].objID 	 = in[i].objID;
+    out[i].catID 	 = in[i].catID;
+  }
+  return (out);
+}
+
+SecFilt *SecFilt_PS1_DEV_2_ToInternal (SecFilt_PS1_DEV_2 *in, int Nvalues) {
+
+  int i;
+  SecFilt *out;
+
+  ALLOCATE (out, SecFilt, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    out[i].M     = in[i].M;      
+    out[i].dM    = in[i].dM;      
+    out[i].Xm    = in[i].Xm;     
+    out[i].Ncode = in[i].Ncode;
+    out[i].Nused = in[i].Nused;
+ }
+  return (out);
+}
+
+SecFilt_PS1_DEV_2 *SecFiltInternalTo_PS1_DEV_2 (SecFilt *in, int Nvalues) {
+
+  int i;
+  SecFilt_PS1_DEV_2 *out;
+
+  ALLOCATE (out, SecFilt_PS1_DEV_2, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    out[i].M     = in[i].M;      
+    out[i].dM    = in[i].dM;      
+    out[i].Xm    = in[i].Xm;     
+    out[i].Ncode = in[i].Ncode;
+    out[i].Nused = in[i].Nused;
+  }
+  return (out);
+}
+
+Image *Image_PS1_DEV_2_ToInternal (Image_PS1_DEV_2 *in, int Nvalues) {
+
+  int i;
+  Image *out;
+
+  ALLOCATE (out, Image, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
+    strcpy (out[i].name, in[i].name);
+
+    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].Mcal;
+    out[i].dMcal    	    = in[i].dMcal;
+    out[i].Xm	    	    = 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].code		    = in[i].code;
+    out[i].ccdnum	    = in[i].ccdnum;
+    out[i].imageID	    = in[i].imageID;
+    out[i].externID	    = in[i].externID;
+    out[i].sourceID	    = in[i].sourceID;
+
+    out[i].order	    = in[i].order;
+    out[i].Mx		    = in[i].Mx;
+    out[i].My		    = in[i].My;
+    out[i].Mxx		    = in[i].Mxx;
+    out[i].Mxy		    = in[i].Mxy;
+    out[i].Myy		    = in[i].Myy;
+    out[i].Mxxx		    = in[i].Mxxx;
+    out[i].Mxxy		    = in[i].Mxxy;
+    out[i].Mxyy		    = in[i].Mxyy;
+    out[i].Myyy		    = in[i].Myyy;
+    out[i].Mxxxx	    = in[i].Mxxxx;
+    out[i].Mxxxy	    = in[i].Mxxxy;
+    out[i].Mxxyy	    = in[i].Mxxyy;
+    out[i].Mxyyy	    = in[i].Mxyyy;
+    out[i].Myyyy	    = in[i].Myyyy;
+  }
+  return (out);
+}
+
+Image_PS1_DEV_2 *ImageInternalTo_PS1_DEV_2 (Image *in, int Nvalues) {
+
+  int i;
+  Image_PS1_DEV_2 *out;
+
+  ALLOCATE (out, Image_PS1_DEV_2, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
+    strcpy (out[i].name, in[i].name);
+
+    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].Mcal;
+    out[i].dMcal    	    = in[i].dMcal;
+    out[i].Xm	    	    = 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].code		    = in[i].code;
+    out[i].ccdnum	    = in[i].ccdnum;
+    out[i].imageID	    = in[i].imageID;
+    out[i].externID	    = in[i].externID;
+    out[i].sourceID	    = in[i].sourceID;
+
+    out[i].order	    = in[i].order;
+    out[i].Mx		    = in[i].Mx;
+    out[i].My		    = in[i].My;
+    out[i].Mxx		    = in[i].Mxx;
+    out[i].Mxy		    = in[i].Mxy;
+    out[i].Myy		    = in[i].Myy;
+    out[i].Mxxx		    = in[i].Mxxx;
+    out[i].Mxxy		    = in[i].Mxxy;
+    out[i].Mxyy		    = in[i].Mxyy;
+    out[i].Myyy		    = in[i].Myyy;
+    out[i].Mxxxx	    = in[i].Mxxxx;
+    out[i].Mxxxy	    = in[i].Mxxxy;
+    out[i].Mxxyy	    = in[i].Mxxyy;
+    out[i].Mxyyy	    = in[i].Mxyyy;
+    out[i].Myyyy	    = in[i].Myyyy;
+  }
+  return (out);
+}
+
+PhotCode_PS1_DEV_2 *PhotCode_Internal_To_PS1_DEV_2 (PhotCode *in, int Nvalues) {
+
+  int i;
+  PhotCode_PS1_DEV_2 *out;
+
+  ALLOCATE (out, PhotCode_PS1_DEV_2, 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;
+  }
+  return (out);
+}
+
+PhotCode *PhotCode_PS1_DEV_2_To_Internal (PhotCode_PS1_DEV_2 *in, int Nvalues) {
+
+  int i;
+  PhotCode *out;
+
+  ALLOCATE (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;
+  }
+  return (out);
+}
Index: trunk/Ohana/src/libdvo/src/dvo_convert_elixir.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_elixir.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_elixir.c	(revision 16810)
@@ -16,5 +16,8 @@
     out[i].dt       = (in[i].dt      == NAN_S_SHORT) ? NAN : in[i].dt     * 0.001;
     out[i].Mcal     = (in[i].Mcal    == NAN_S_SHORT) ? NAN : in[i].Mcal   * 0.001;
-    out[i].Mgal     = (in[i].Mgal    == NAN_S_SHORT) ? NAN : in[i].Mgal   * 0.001;
+
+    // 2008.02.26 : I've renamed Mgal to Map, and intend it to be used per aperture
+    // magnitudes.  Most uses of Mgal in the past were actually aperture (isophotal) mags
+    out[i].Map      = (in[i].Mgal    == NAN_S_SHORT) ? NAN : in[i].Mgal   * 0.001;
     out[i].airmass  = (in[i].airmass == NAN_S_SHORT) ? NAN : in[i].airmass* 0.001;
     out[i].FWx 	    = in[i].FWx;
@@ -39,5 +42,5 @@
     out[i].dSky      = 0;
     out[i].qPSF      = 0;
-    out[i].psfProb   = 0;
+    out[i].psfChisq  = 0;
     out[i].crNsigma  = 0;
     out[i].extNsigma = 0;
@@ -66,5 +69,5 @@
     out[i].dt       = isnan(in[i].dt     ) ? NAN_S_SHORT : in[i].dt      * 1000.0;
     out[i].Mcal     = isnan(in[i].Mcal   ) ? NAN_S_SHORT : in[i].Mcal    * 1000.0;
-    out[i].Mgal     = isnan(in[i].Mgal   ) ? NAN_S_SHORT : in[i].Mgal    * 1000.0;
+    out[i].Mgal     = isnan(in[i].Map    ) ? NAN_S_SHORT : in[i].Map     * 1000.0;
     out[i].airmass  = isnan(in[i].airmass) ? NAN_S_SHORT : in[i].airmass * 1000.0;
 
@@ -95,12 +98,12 @@
 
   for (i = 0; i < Nvalues; i++) {
-    out[i].R       = in[i].R;      
-    out[i].D       = in[i].D;      
-    out[i].Xp      = in[i].Xp;     
-    out[i].Nm      = in[i].Nm;     
-    out[i].Nn      = in[i].Nn;     
-    out[i].code    = in[i].code;   
-    out[i].offset  = in[i].offset; 
-    out[i].missing = in[i].missing;
+    out[i].R       	 = in[i].R;      
+    out[i].D       	 = in[i].D;      
+    out[i].Xp      	 = in[i].Xp;     
+    out[i].Nmeasure 	 = in[i].Nm;     
+    out[i].Nmissing 	 = in[i].Nn;     
+    out[i].code     	 = in[i].code;   
+    out[i].measureOffset = in[i].offset; 
+    out[i].missingOffset = in[i].missing;
 
     /* these don't exist in Elixir */
@@ -115,6 +118,6 @@
 
     /* XXX add these later */
-    out[i].objID_hi = 0;
-    out[i].objID_lo = 0;
+    out[i].objID   = 0;
+    out[i].catID   = 0;
 
     primary[0][i].M     = (in[i].M  == NAN_S_SHORT) ? NAN : in[i].M  * 0.001;      
@@ -139,9 +142,9 @@
     out[i].D       = in[i].D;      
     out[i].Xp      = in[i].Xp;     
-    out[i].Nm      = in[i].Nm;     
-    out[i].Nn      = in[i].Nn;     
+    out[i].Nm      = in[i].Nmeasure;     
+    out[i].Nn      = in[i].Nmissing;     
     out[i].code    = in[i].code;   
-    out[i].offset  = in[i].offset; 
-    out[i].missing = in[i].missing;
+    out[i].offset  = in[i].measureOffset; 
+    out[i].missing = in[i].missingOffset;
 
     out[i].M       = isnan(primary[i].M)  ? NAN_S_SHORT : primary[i].M   * 1000.0;
@@ -297,2 +300,60 @@
   return (out);
 }
+
+PhotCode_Elixir *PhotCode_Internal_To_Elixir (PhotCode *in, int Nvalues) {
+
+  int i;
+  PhotCode_Elixir *out;
+
+  ALLOCATE (out, PhotCode_Elixir, 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));            
+  }
+  return (out);
+}
+
+PhotCode *PhotCode_Elixir_To_Internal (PhotCode_Elixir *in, int Nvalues) {
+
+  int i;
+  PhotCode *out;
+
+  ALLOCATE (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));            
+
+    // not defined in Elixir:
+    out[i].astromErrSys      = 0.0;
+    out[i].astromErrScale    = 0.0;
+    out[i].astromErrMagScale = 0.0;
+    out[i].photomErrSys      = 0.0;
+  }
+  return (out);
+}
Index: trunk/Ohana/src/libdvo/src/dvo_convert_loneos.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_loneos.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_loneos.c	(revision 16810)
@@ -24,16 +24,19 @@
 
     /* these values don't exist in the Loneos format */
-    out[i].Mgal     = out[i].M;
-    out[i].dt       = 0;
-    out[i].airmass  = 0;
-    out[i].az       = 0;
-    out[i].FWx 	    = 0;
-    out[i].FWy 	    = 0;
-    out[i].theta    = 0;
-    out[i].stargal  = 0;
-    out[i].Sky      = 0;
-    out[i].dSky     = 0;
-    out[i].qPSF     = 0;
-    out[i].psfProb   = 0;
+
+    // 2008.02.26 : I've renamed Mgal to Map, and intend it to be used per aperture
+    // magnitudes.  Most uses of Mgal in the past were actually aperture (isophotal) mags
+    out[i].Map       = out[i].M;
+    out[i].dt        = 0;
+    out[i].airmass   = 0;
+    out[i].az        = 0;
+    out[i].FWx 	     = 0;
+    out[i].FWy 	     = 0;
+    out[i].theta     = 0;
+    out[i].stargal   = 0;
+    out[i].Sky       = 0;
+    out[i].dSky      = 0;
+    out[i].qPSF      = 0;
+    out[i].psfChisq  = 0;
     out[i].crNsigma  = 0;
     out[i].extNsigma = 0;
@@ -87,12 +90,12 @@
 
   for (i = 0; i < Nvalues; i++) {
-    out[i].R       = in[i].R;      
-    out[i].D       = in[i].D;      
-    out[i].Xp      = in[i].Xp;     
-    out[i].Nm      = in[i].Nm;     
-    out[i].Nn      = in[i].Nn;     
-    out[i].code    = in[i].code;   
-    out[i].offset  = in[i].offset; 
-    out[i].missing = in[i].missing;
+    out[i].R       	 = in[i].R;      
+    out[i].D       	 = in[i].D;      
+    out[i].Xp      	 = in[i].Xp;     
+    out[i].Nmeasure      = in[i].Nm;     
+    out[i].Nmissing      = in[i].Nn;     
+    out[i].code    	 = in[i].code;   
+    out[i].measureOffset = in[i].offset; 
+    out[i].missingOffset = in[i].missing;
 
     /* these don't exist in Loneos */
@@ -107,6 +110,6 @@
 
     /* XXX add these later */
-    out[i].objID_hi = 0;
-    out[i].objID_lo = 0;
+    out[i].objID   = 0;
+    out[i].catID   = 0;
 
     primary[0][i].M  = (in[i].M  == NAN_S_SHORT) ? NAN : in[i].M  * 0.001;      
@@ -131,9 +134,9 @@
     out[i].D       = in[i].D;      
     out[i].Xp      = in[i].Xp;     
-    out[i].Nm      = in[i].Nm;     
-    out[i].Nn      = in[i].Nn;     
+    out[i].Nm      = in[i].Nmeasure;     
+    out[i].Nn      = in[i].Nmissing;     
     out[i].code    = in[i].code;   
-    out[i].offset  = in[i].offset; 
-    out[i].missing = in[i].missing;
+    out[i].offset  = in[i].measureOffset; 
+    out[i].missing = in[i].missingOffset;
 
     out[i].M       = isnan(primary[i].M)  ? NAN_S_SHORT : primary[i].M   * 1000.0;
Index: trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_0.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_0.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_0.c	(revision 16810)
@@ -15,5 +15,8 @@
     out[i].dM         = in[i].dM;
     out[i].Mcal       = in[i].Mcal;
-    out[i].Mgal       = in[i].Mgal;
+
+    // 2008.02.26 : I've renamed Mgal to Map, and intend it to be used per aperture
+    // magnitudes.  Most uses of Mgal in the past were actually aperture (isophotal) mags
+    out[i].Map        = in[i].Mgal;
     out[i].airmass    = in[i].airmass;
     out[i].az         = in[i].az;
@@ -39,5 +42,5 @@
 
     // these don't have a correspondence
-    out[i].psfProb   = 0;
+    out[i].psfChisq  = 0;
     out[i].crNsigma  = 0;
     out[i].extNsigma = 0;
@@ -61,5 +64,5 @@
     out[i].dM         = in[i].dM;
     out[i].Mcal       = in[i].Mcal;
-    out[i].Mgal       = in[i].Mgal;
+    out[i].Mgal       = in[i].Map;
     out[i].airmass    = in[i].airmass;
     out[i].az         = in[i].az;
@@ -99,12 +102,44 @@
 
   for (i = 0; i < Nvalues; i++) {
+    out[i].R        	 = in[i].R;      
+    out[i].D        	 = in[i].D;      
+    out[i].Xp       	 = in[i].Xp;     
+    out[i].Nmeasure      = in[i].Nm;     
+    out[i].Nmissing      = in[i].Nn;     
+    out[i].code          = in[i].code;   
+    out[i].measureOffset = in[i].offset; 
+    out[i].missingOffset = in[i].missing;
+    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].objID 	 = in[i].objID;
+    out[i].catID 	 = in[i].catID;
+  }
+  return (out);
+}
+
+/* convert internal averages to panstarrs-format averages */
+// 'primary is needed to conform with the API for Loneos and Elixir, but is not used
+Average_Panstarrs_DEV_0 *AverageInternalTo_Panstarrs_DEV_0 (Average *in, int Nvalues, SecFilt *primary) {
+
+  int i;
+  Average_Panstarrs_DEV_0 *out;
+
+  ALLOCATE (out, Average_Panstarrs_DEV_0, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
     out[i].R        = in[i].R;      
     out[i].D        = in[i].D;      
     out[i].Xp       = in[i].Xp;     
-    out[i].Nm       = in[i].Nm;     
-    out[i].Nn       = in[i].Nn;     
+    out[i].Nm       = in[i].Nmeasure;     
+    out[i].Nn       = in[i].Nmissing;     
     out[i].code     = in[i].code;   
-    out[i].offset   = in[i].offset; 
-    out[i].missing  = in[i].missing;
+    out[i].offset   = in[i].measureOffset; 
+    out[i].missing  = in[i].missingOffset;
     out[i].dR       = in[i].dR;
     out[i].dD       = in[i].dD;
@@ -115,38 +150,6 @@
     out[i].P        = in[i].P;
     out[i].dP       = in[i].dP;
-    out[i].objID_hi = in[i].objID_hi;
-    out[i].objID_lo = in[i].objID_lo;
-  }
-  return (out);
-}
-
-/* convert internal averages to panstarrs-format averages */
-// 'primary is needed to conform with the API for Loneos and Elixir, but is not used
-Average_Panstarrs_DEV_0 *AverageInternalTo_Panstarrs_DEV_0 (Average *in, int Nvalues, SecFilt *primary) {
-
-  int i;
-  Average_Panstarrs_DEV_0 *out;
-
-  ALLOCATE (out, Average_Panstarrs_DEV_0, Nvalues);
-
-  for (i = 0; i < Nvalues; i++) {
-    out[i].R        = in[i].R;      
-    out[i].D        = in[i].D;      
-    out[i].Xp       = in[i].Xp;     
-    out[i].Nm       = in[i].Nm;     
-    out[i].Nn       = in[i].Nn;     
-    out[i].code     = in[i].code;   
-    out[i].offset   = in[i].offset; 
-    out[i].missing  = in[i].missing;
-    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].objID_hi = in[i].objID_hi;
-    out[i].objID_lo = in[i].objID_lo;
+    out[i].objID    = in[i].objID;
+    out[i].catID    = in[i].catID;
   }
   return (out);
Index: trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_1.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_1.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_1.c	(revision 16810)
@@ -15,5 +15,8 @@
     out[i].dM         = in[i].dM;
     out[i].Mcal       = in[i].Mcal;
-    out[i].Mgal       = in[i].Mgal;
+
+    // 2008.02.26 : I've renamed Mgal to Map, and intend it to be used per aperture
+    // magnitudes.  Most uses of Mgal in the past were actually aperture (isophotal) mags
+    out[i].Map        = in[i].Mgal;
     out[i].airmass    = in[i].airmass;
     out[i].az         = in[i].az;
@@ -39,5 +42,5 @@
 
     // these don't have a correspondence
-    out[i].psfProb   = 0;
+    out[i].psfChisq  = 0;
     out[i].crNsigma  = 0;
     out[i].extNsigma = 0;
@@ -61,5 +64,5 @@
     out[i].dM         = in[i].dM;
     out[i].Mcal       = in[i].Mcal;
-    out[i].Mgal       = in[i].Mgal;
+    out[i].Mgal       = in[i].Map;
     out[i].airmass    = in[i].airmass;
     out[i].az         = in[i].az;
@@ -99,12 +102,44 @@
 
   for (i = 0; i < Nvalues; i++) {
+    out[i].R        	 = in[i].R;      
+    out[i].D        	 = in[i].D;      
+    out[i].Xp       	 = in[i].Xp;     
+    out[i].Nmeasure      = in[i].Nm;     
+    out[i].Nmissing      = in[i].Nn;     
+    out[i].code     	 = in[i].code;   
+    out[i].measureOffset = in[i].offset; 
+    out[i].missingOffset = in[i].missing;
+    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].objID 	 = in[i].objID;
+    out[i].catID 	 = in[i].catID;
+  }
+  return (out);
+}
+
+/* convert internal averages to panstarrs-format averages */
+// 'primary is needed to conform with the API for Loneos and Elixir, but is not used
+Average_Panstarrs_DEV_1 *AverageInternalTo_Panstarrs_DEV_1 (Average *in, int Nvalues, SecFilt *primary) {
+
+  int i;
+  Average_Panstarrs_DEV_1 *out;
+
+  ALLOCATE (out, Average_Panstarrs_DEV_1, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
     out[i].R        = in[i].R;      
     out[i].D        = in[i].D;      
     out[i].Xp       = in[i].Xp;     
-    out[i].Nm       = in[i].Nm;     
-    out[i].Nn       = in[i].Nn;     
+    out[i].Nm       = in[i].Nmeasure;     
+    out[i].Nn       = in[i].Nmissing;     
     out[i].code     = in[i].code;   
-    out[i].offset   = in[i].offset; 
-    out[i].missing  = in[i].missing;
+    out[i].offset   = in[i].measureOffset; 
+    out[i].missing  = in[i].missingOffset;
     out[i].dR       = in[i].dR;
     out[i].dD       = in[i].dD;
@@ -115,38 +150,6 @@
     out[i].P        = in[i].P;
     out[i].dP       = in[i].dP;
-    out[i].objID_hi = in[i].objID_hi;
-    out[i].objID_lo = in[i].objID_lo;
-  }
-  return (out);
-}
-
-/* convert internal averages to panstarrs-format averages */
-// 'primary is needed to conform with the API for Loneos and Elixir, but is not used
-Average_Panstarrs_DEV_1 *AverageInternalTo_Panstarrs_DEV_1 (Average *in, int Nvalues, SecFilt *primary) {
-
-  int i;
-  Average_Panstarrs_DEV_1 *out;
-
-  ALLOCATE (out, Average_Panstarrs_DEV_1, Nvalues);
-
-  for (i = 0; i < Nvalues; i++) {
-    out[i].R        = in[i].R;      
-    out[i].D        = in[i].D;      
-    out[i].Xp       = in[i].Xp;     
-    out[i].Nm       = in[i].Nm;     
-    out[i].Nn       = in[i].Nn;     
-    out[i].code     = in[i].code;   
-    out[i].offset   = in[i].offset; 
-    out[i].missing  = in[i].missing;
-    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].objID_hi = in[i].objID_hi;
-    out[i].objID_lo = in[i].objID_lo;
+    out[i].objID    = in[i].objID;
+    out[i].catID    = in[i].catID;
   }
   return (out);
Index: trunk/Ohana/src/libdvo/src/dvo_image.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_image.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_image.c	(revision 16810)
@@ -194,4 +194,5 @@
   if (db[0].format == DVO_FORMAT_PANSTARRS_DEV_1) gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PANSTARRS_DEV_1");
   if (db[0].format == DVO_FORMAT_PS1_DEV_1)       gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PS1_DEV_1");
+  if (db[0].format == DVO_FORMAT_PS1_DEV_2)       gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PS1_DEV_2");
   
   return;
Index: trunk/Ohana/src/libdvo/src/dvo_image_raw.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_image_raw.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_image_raw.c	(revision 16810)
@@ -53,4 +53,5 @@
   if (db[0].format == DVO_FORMAT_PANSTARRS_DEV_1) ImageSize = sizeof(Image_Panstarrs_DEV_1);
   if (db[0].format == DVO_FORMAT_PS1_DEV_1)       ImageSize = sizeof(Image_PS1_DEV_1);
+  if (db[0].format == DVO_FORMAT_PS1_DEV_2)       ImageSize = sizeof(Image_PS1_DEV_2);
 
   /* check that filesize makes sense */
@@ -76,4 +77,5 @@
   if (db[0].format == DVO_FORMAT_PANSTARRS_DEV_1) gfits_table_mkheader_Image_Panstarrs_DEV_1 (&db[0].theader);
   if (db[0].format == DVO_FORMAT_PS1_DEV_1)       gfits_table_mkheader_Image_PS1_DEV_1 (&db[0].theader);
+  if (db[0].format == DVO_FORMAT_PS1_DEV_2)       gfits_table_mkheader_Image_PS1_DEV_2 (&db[0].theader);
     
   /* read data from file */
Index: trunk/Ohana/src/libdvo/src/dvo_photcode_convert_elixir.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_photcode_convert_elixir.c	(revision 16268)
+++ 	(revision )
@@ -1,57 +1,0 @@
-# include <dvo.h>
-
-PhotCode_Elixir *PhotCode_Internal_To_Elixir (PhotCode *in, int Nvalues) {
-
-  int i;
-  PhotCode_Elixir *out;
-
-  ALLOCATE (out, PhotCode_Elixir, 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));            
-  }
-  return (out);
-}
-
-PhotCode *PhotCode_Elixir_To_Internal (PhotCode_Elixir *in, int Nvalues) {
-
-  int i;
-  PhotCode *out;
-
-  ALLOCATE (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));            
-
-    // not defined in Elixir:
-    out[i].astromScale = 1.0;
-    out[i].photSysErr = 1.0;
-  }
-  return (out);
-}
Index: trunk/Ohana/src/libdvo/src/dvo_photcode_convert_ps1_dev_1.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_photcode_convert_ps1_dev_1.c	(revision 16268)
+++ 	(revision )
@@ -1,59 +1,0 @@
-# include <dvo.h>
-
-PhotCode_PS1_DEV_1 *PhotCode_Internal_To_PS1_DEV_1 (PhotCode *in, int Nvalues) {
-
-  int i;
-  PhotCode_PS1_DEV_1 *out;
-
-  ALLOCATE (out, PhotCode_PS1_DEV_1, 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].astromScale = in[i].astromScale;  
-    out[i].photSysErr = in[i].photSysErr;   
-  }
-  return (out);
-}
-
-PhotCode *PhotCode_PS1_DEV_1_To_Internal (PhotCode_PS1_DEV_1 *in, int Nvalues) {
-
-  int i;
-  PhotCode *out;
-
-  ALLOCATE (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].astromScale = in[i].astromScale;  
-    out[i].photSysErr = in[i].photSysErr;   
-  }
-  return (out);
-}
Index: trunk/Ohana/src/libdvo/src/dvo_photcode_ops.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 16268)
+++ trunk/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 16810)
@@ -370,5 +370,5 @@
   if (color == NULL) return (NAN);
   if (color[0].type == PHOT_REF) {
-    for (i = 0; (i < average[0].Nm) && (isnan(m1)); i++) {
+    for (i = 0; (i < average[0].Nmeasure) && (isnan(m1)); i++) {
       if (measure[i].photcode == color[0].code) {
 	m1 = measure[i].M;
@@ -384,5 +384,5 @@
   if (color == NULL) return (NAN);
   if (color[0].type == PHOT_REF) {
-    for (i = 0; (i < average[0].Nm) && (isnan(m2)); i++) {
+    for (i = 0; (i < average[0].Nmeasure) && (isnan(m2)); i++) {
       if (measure[i].photcode == color[0].code) {
 	m2 = measure[i].M;
@@ -466,5 +466,5 @@
   if (code == NULL) return (FALSE);
   if (code[0].type == PHOT_REF) {
-    for (i = 0; i < average[0].Nm; i++) {
+    for (i = 0; i < average[0].Nmeasure; i++) {
       if (measure[i].photcode == c1) {
 	M1 = measure[i].M;
@@ -482,5 +482,5 @@
   if (code == NULL) return (FALSE);
   if (code[0].type == PHOT_REF) {
-    for (i = 0; i < average[0].Nm; i++) {
+    for (i = 0; i < average[0].Nmeasure; i++) {
       if (measure[i].photcode == c2) {
 	M2 = measure[i].M;
