Index: trunk/ppTranslate/src/ppMopsRead.c
===================================================================
--- trunk/ppTranslate/src/ppMopsRead.c	(revision 34488)
+++ trunk/ppTranslate/src/ppMopsRead.c	(revision 34505)
@@ -10,4 +10,6 @@
 static void addDummyValues(psMetadata* md, long size, int version);
 static void replaceDummyValuesF32(const char* colName, psMetadata* source, psMetadata* target, psVector* indexes);
+static void replaceDummyValuesS32(const char* colName, psMetadata* source, psMetadata* target, psVector* indexes);
+static void renameDummyValuesF32(const char* colNameSource, psMetadata* source, const char* colNameTarget, psMetadata* target, psVector* indexes);
 
 /*
@@ -24,4 +26,5 @@
   for (int i = 0; i < num; i++) {
     const char *name = inNames->data[i];
+    printf("%s\n", name);
 
     psFits *fits = psFitsOpen(name,  "r"); // FITS file
@@ -118,5 +121,7 @@
       } else {
 	psTrace("ppMops.read", 3, "Fitted trails extension found\n");
+	psTrace("ppMops.read", 10, "Getting size?\n");
 	int fittedTrailsSize = psFitsTableSize(fits);
+	psTrace("ppMops.read", 10, "size = %d\n", fittedTrailsSize);
 	if (fittedTrailsSize <= 0) {
 	  psErrorStackPrint(stderr, "Unable to determine size of fitted trails extension table %d", i);
@@ -124,5 +129,7 @@
 	  psErrorClear();
 	} else {
+	  psTrace("ppMops.read", 10, "Reading table of interest?\n");
 	  psMetadata* fittedTrails = psFitsReadTableAllColumns(fits); // Table of interest
+	  psTrace("ppMops.read", 10, "OK for table of interest\n");
 	  if (!fittedTrails) {
 	    psError(PS_ERR_IO, false, "Unable to read fittedTrails table in file %d", i);
@@ -130,4 +137,5 @@
 	  }
 	  //Iterate on the different names and types expected in the fittedTrails parameters
+	  psTrace("ppMops.read", 10, "Getting IPP_IDET\n");
 	  psVector* idet = psMetadataLookupVector(NULL, fittedTrails, "IPP_IDET");
 	  replaceDummyValuesF32("X_EXT", fittedTrails, det->table, idet);
@@ -142,18 +150,26 @@
 	  replaceDummyValuesF32("EXT_THETA",  fittedTrails, det->table, idet);
 	  replaceDummyValuesF32("EXT_WIDTH_MAJ_ERR",  fittedTrails, det->table, idet);
-	  replaceDummyValuesF32("EXT_WIDTH_MIN_ERR",  fittedTrails, det->table, idet);
+	  // EXT_WIDTH_MIN_ERR is actually undefined but set to 0. in CMF files
+	  // We explicitely let it set to NaN, hence the commented out
+	  // following line
+	  //replaceDummyValuesF32("EXT_WIDTH_MIN_ERR",  fittedTrails, det->table, idet);
 	  replaceDummyValuesF32("EXT_THETA_ERR",  fittedTrails, det->table, idet);
+	  psTrace("ppMops.read", 10, "Got all version 2 values\n");
 	  if (skyChipPsfVersion >= 3) {
+	    psTrace("ppMops.read", 10, "Getting PS1_DV3 data\n");
 	    replaceDummyValuesF32("RA_EXT",  fittedTrails, det->table, idet);
-	    replaceDummyValuesF32("RA_EXT_SIGMA",  fittedTrails, det->table, idet);
+	    // Note: RA_EXT_SIGMA is computed (see det->raExtErr)
 	    replaceDummyValuesF32("DEC_EXT",  fittedTrails, det->table, idet);
-	    replaceDummyValuesF32("DEC_EXT_SIGMA",  fittedTrails, det->table, idet);
-	    replaceDummyValuesF32("POSANG_EXT",  fittedTrails, det->table, idet);
-	    replaceDummyValuesF32("PLTSCALE_EXT",  fittedTrails, det->table, idet);
-	    replaceDummyValuesF32("EXT_FLUX",  fittedTrails, det->table, idet);
-	    replaceDummyValuesF32("EXT_CAL_MAG",  fittedTrails, det->table, idet);
-	    replaceDummyValuesF32("EXT_MAG_SIG",  fittedTrails, det->table, idet);
-	    replaceDummyValuesF32("EXT_CHISQ",  fittedTrails, det->table, idet);
-	    replaceDummyValuesF32("EXT_NDOF",  fittedTrails, det->table, idet);
+	    // Note: DEC_EXT_SIGMA is computed (see det->decExtErr)
+	    //Note: POSANG_EXT is POSANGLE in xfit
+ 	    renameDummyValuesF32("POSANGLE",  fittedTrails, "POSANG_EXT", det->table, idet);
+	    //Note: PLTSCALE_EXT in xfit is PLTSCALE
+ 	    renameDummyValuesF32("PLTSCALE", fittedTrails, "PLTSCALE_EXT", det->table, idet);
+	    renameDummyValuesF32("EXT_INST_FLUX", fittedTrails, "EXT_FLUX", det->table, idet);
+	    replaceDummyValuesF32("EXT_CAL_MAG", fittedTrails, det->table, idet);
+	    renameDummyValuesF32("EXT_INST_MAG_SIG", fittedTrails, "EXT_MAG_SIG", det->table, idet);
+	    replaceDummyValuesF32("EXT_CHISQ", fittedTrails, det->table, idet);
+	    replaceDummyValuesS32("EXT_NDOF", fittedTrails, det->table, idet);
+	    psTrace("ppMops.read", 10, "Got all version 3 values\n");
 	  }
 	}
@@ -170,7 +186,13 @@
     psVector *ra = psMetadataLookupVector(NULL, table, "RA_PSF");
     psVector *dec = psMetadataLookupVector(NULL, table, "DEC_PSF");
-
     det->raErr = psVectorAlloc(size, PS_TYPE_F64);
     det->decErr = psVectorAlloc(size, PS_TYPE_F64);
+    if (skyChipPsfVersion >= 3) {
+      det->raExtErr = psVectorAlloc(size, PS_TYPE_F64);
+      det->decExtErr = psVectorAlloc(size, PS_TYPE_F64);
+    } else {
+      det->raExtErr = NULL;
+      det->decExtErr = NULL;
+    }
     det->mask = psVectorAlloc(size, PS_TYPE_U8);
 
@@ -186,6 +208,10 @@
 
     // Add our new vectors to the table so that duplicates and masked items may be purged
+    psMetadataAddVector(table, PS_LIST_HEAD, "RA_ERR", 0, NULL, det->raErr);
     psMetadataAddVector(table, PS_LIST_HEAD, "DEC_ERR", 0, NULL, det->decErr);
-    psMetadataAddVector(table, PS_LIST_HEAD, "RA_ERR", 0, NULL, det->raErr);
+    if (skyChipPsfVersion >= 3) {
+      psMetadataAddVector(table, PS_LIST_HEAD, "RA_EXT_SIGMA", 0, NULL, det->raExtErr);
+      psMetadataAddVector(table, PS_LIST_HEAD, "DEC_EXT_SIGMA", 0, NULL, det->decExtErr);
+    }
 
     psTrace("ppMops.read", 2, "Read %ld rows from %s\n", det->num, det->component);
@@ -198,9 +224,18 @@
     psVector *angleV = psMetadataLookupVector(NULL, table, "POSANGLE");
     psVector *flagsV = psMetadataLookupVector(NULL, table, "FLAGS");
+    psVector *xExtErrV = NULL;
+    psVector *yExtErrV = NULL;
+    psVector *scaleExtV = NULL;
+    psVector *angleExtV = NULL;
+    if (skyChipPsfVersion >= 3) {
+      xExtErrV = psMetadataLookupVector(NULL, table, "X_EXT_SIG");
+      yExtErrV = psMetadataLookupVector(NULL, table, "Y_EXT_SIG");
+      scaleExtV = psMetadataLookupVector(NULL, table, "PLTSCALE_EXT");
+      angleExtV = psMetadataLookupVector(NULL, table, "POSANG_EXT");
+    }
 
     double plateScale = 0.0;        // Plate scale
     long numGood = 0;               // Number of good rows
     for (long row = 0; row < size; row++) {
-
       psU32 flags = flagsV->data.U32[row]; // psFitsTableGetU32(NULL, table, row, "FLAGS");
       if (flags & SOURCE_MASK) {
@@ -242,4 +277,22 @@
       plateScale += scale;
       numGood++;
+
+      // Same for EXT data if version permits
+      if (skyChipPsfVersion >= 3) {
+	xErr = xExtErrV->data.F32[row];
+	yErr = yExtErrV->data.F32[row];
+	scale = scaleExtV->data.F32[row]/3600.;
+	angle = angleExtV->data.F32[row];
+
+	cosAngle = cos(angle);
+	sinAngle = sin(angle);
+	cosAngle2 = PS_SQR(cosAngle);
+	sinAngle2 = PS_SQR(sinAngle);
+	xErr2 = PS_SQR(xErr);
+	yErr2 = PS_SQR(yErr);
+	errScale = scale / 3600.0;
+	det->raExtErr->data.F64[row] = errScale * sqrt(cosAngle2 * xErr2 + sinAngle2 * yErr2);
+	det->decExtErr->data.F64[row] = errScale * sqrt(sinAngle2 * xErr2 + cosAngle2 * yErr2);
+      }
     }
     det->numGood = numGood;
@@ -259,4 +312,9 @@
 static psVector* createDummyF32(long size) {
   psVector* dummy = psVectorAlloc(size, PS_TYPE_F32);
+  psVectorInit(dummy, NAN);
+  return dummy;
+}
+static psVector* createDummyS32(long size) {
+  psVector* dummy = psVectorAlloc(size, PS_TYPE_S32);
   psVectorInit(dummy, NAN);
   return dummy;
@@ -280,7 +338,7 @@
     psTrace("ppMops.read", 10, "Adding columns for version PS1_DV%d\n", version);
     psMetadataAdd(md, PS_LIST_TAIL, "RA_EXT",  PS_DATA_VECTOR, "Fitted centroid RA", createDummyF32(size));
-    psMetadataAdd(md, PS_LIST_TAIL, "RA_EXT_SIGMA",  PS_DATA_VECTOR, "Fitted RA sigma", createDummyF32(size));
+/*     psMetadataAdd(md, PS_LIST_TAIL, "RA_EXT_SIGMA",  PS_DATA_VECTOR, "Fitted RA sigma", createDummyF32(size)); *\/ */
     psMetadataAdd(md, PS_LIST_TAIL, "DEC_EXT",  PS_DATA_VECTOR, "Fitted centroid DEC", createDummyF32(size));
-    psMetadataAdd(md, PS_LIST_TAIL, "DEC_EXT_SIGMA",  PS_DATA_VECTOR, "Fitted DEC sigma", createDummyF32(size));
+/*     psMetadataAdd(md, PS_LIST_TAIL, "DEC_EXT_SIGMA",  PS_DATA_VECTOR, "Fitted DEC sigma", createDummyF32(size)); *\/ */
     psMetadataAdd(md, PS_LIST_TAIL, "POSANG_EXT",  PS_DATA_VECTOR, "Fitted position angle", createDummyF32(size));
     psMetadataAdd(md, PS_LIST_TAIL, "PLTSCALE_EXT",  PS_DATA_VECTOR, "Plate scale at centroid", createDummyF32(size));
@@ -289,9 +347,10 @@
     psMetadataAdd(md, PS_LIST_TAIL, "EXT_MAG_SIG",  PS_DATA_VECTOR, "Mag sigma", createDummyF32(size));
     psMetadataAdd(md, PS_LIST_TAIL, "EXT_CHISQ",  PS_DATA_VECTOR, "Chi^2 of fit", createDummyF32(size));
-    psMetadataAdd(md, PS_LIST_TAIL, "EXT_NDOF",  PS_DATA_VECTOR, "Fit degrees of freedom", createDummyF32(size));
+    psMetadataAdd(md, PS_LIST_TAIL, "EXT_NDOF",  PS_DATA_VECTOR, "Fit degrees of freedom", createDummyS32(size));
   }
 }
 
 static void replaceDummyValuesF32(const char* colName, psMetadata* source, psMetadata* target, psVector* indexes) {
+  psTrace("ppMops.read", 10, "Trying to get column %s\n", colName);
   psVector* source_vector = psMetadataLookupVector(NULL, source, colName);
   psVector* target_vector = psMetadataLookupVector(NULL, target, colName);
@@ -299,3 +358,24 @@
     target_vector->data.F32[indexes->data.S64[index]] = source_vector->data.F32[index];
   }
-}
+  psTrace("ppMops.read", 10, "OK for %s\n", colName);
+}
+
+static void replaceDummyValuesS32(const char* colName, psMetadata* source, psMetadata* target, psVector* indexes) {
+  psTrace("ppMops.read", 10, "Trying to get column %s\n", colName);
+  psVector* source_vector = psMetadataLookupVector(NULL, source, colName);
+  psVector* target_vector = psMetadataLookupVector(NULL, target, colName);
+  for (long index = 0; index<indexes->n; ++index) {
+    target_vector->data.S32[indexes->data.S64[index]] = source_vector->data.S32[index];
+  }
+  psTrace("ppMops.read", 10, "OK for %s\n", colName);
+}
+
+static void renameDummyValuesF32(const char* colNameSource, psMetadata* source, const char* colNameTarget, psMetadata* target, psVector* indexes) {
+  psTrace("ppMops.read", 10, "Trying to rename column %s to %s\n", colNameSource, colNameTarget);
+  psVector* source_vector = psMetadataLookupVector(NULL, source, colNameSource);
+  psVector* target_vector = psMetadataLookupVector(NULL, target, colNameTarget);
+  for (long index = 0; index<indexes->n; ++index) {
+    target_vector->data.F32[indexes->data.S64[index]] = source_vector->data.F32[index];
+  }
+  psTrace("ppMops.read", 10, "OK for %s (renamed by %s)\n", colNameSource, colNameTarget);
+}
