Index: trunk/ppTranslate/src/ppMopsRead.c
===================================================================
--- trunk/ppTranslate/src/ppMopsRead.c	(revision 34279)
+++ trunk/ppTranslate/src/ppMopsRead.c	(revision 34284)
@@ -8,5 +8,6 @@
 #include "ppMops.h"
 
-static psMetadata* sort_by_increasing_idet(psMetadata *fittedTrail, long length, long fillLength);
+static void addDummyValues(psMetadata* md, long size);
+static void replaceDummyValuesF32(const char* colName, psMetadata* source, psMetadata* target, psVector* indexes);
 
 /*
@@ -108,39 +109,42 @@
       return NULL;
     }
-    //Sort table by idet if necessary
-    psMetadata* sortedTable = sort_by_increasing_idet(table, det->num, det->num);
-    if (sortedTable != table) {
-      psFree(table);
-      table = sortedTable;
-    } // else det->table is sorted
     det->table = table;
-    psTrace("ppMops.read", 9, "PSF table:\n%s\n", psMetadataConfigFormat(det->table));
-    psTrace("ppMops.read", 9, "End of PSF table\n");
+    psTrace("ppMops.read", 19, "PSF table:\n%s\n", psMetadataConfigFormat(det->table));
+    psTrace("ppMops.read", 19, "End of PSF table\n");
 
     //fittedTrail extension (Supported for releases 2 and above)
     if (skyChipPsfVersion >= 2) {
+      //First: append all the new columns that we want to the existing table
+      addDummyValues(det->table, size);
       if (!psFitsMoveExtName(fits, "SkyChip.xfit")) {
 	psTrace("ppMops.read", 3, "No fitted trails extension");
       } else {
 	psTrace("ppMops.read", 3, "Fitted trails extension found\n");
-	det->fittedTrailsSize = psFitsTableSize(fits);
-	if (det->fittedTrailsSize <= 0) {
+	int fittedTrailsSize = psFitsTableSize(fits);
+	if (fittedTrailsSize <= 0) {
 	  psErrorStackPrint(stderr, "Unable to determine size of fitted trails extension table %d", i);
 	  psTrace("ppMops.read", 3, "No entry in fitted trails extension!!!!\n");
 	  psErrorClear();
-	  det->fittedTrails = NULL;
 	} else {
-	  det->fittedTrails = psFitsReadTableAllColumns(fits); // Table of interest
-	  if (!det->fittedTrails) {
-	    psError(PS_ERR_IO, false, "Unable to read fittedTrails table %d", i);
+	  psMetadata* fittedTrails = psFitsReadTableAllColumns(fits); // Table of interest
+	  if (!fittedTrails) {
+	    psError(PS_ERR_IO, false, "Unable to read fittedTrails table in file %d", i);
 	    return NULL;
 	  }
-	  psMetadata* sortedFittedTrails = sort_by_increasing_idet(det->fittedTrails, det->fittedTrailsSize, det->num);
-	  if (sortedFittedTrails != det->fittedTrails) {
-	    psFree(det->fittedTrails);
-	    det->fittedTrails = sortedFittedTrails;
-	  } // else det->fittedTrails is sorted
-	  psTrace("ppMops.read", 9, "Fitted trail:\n%s\n", psMetadataConfigFormat(det->fittedTrails));
-	  psTrace("ppMops.read", 9, "End of Fitted trail\n");
+	  //Iterate on the different names and types expected in the fittedTrails parameters
+	  psVector* idet = psMetadataLookupVector(NULL, fittedTrails, "IPP_IDET");
+	  replaceDummyValuesF32("X_EXT", fittedTrails, det->table, idet);
+	  replaceDummyValuesF32("Y_EXT", fittedTrails, det->table, idet);
+	  replaceDummyValuesF32("X_EXT_SIG", fittedTrails, det->table, idet);
+	  replaceDummyValuesF32("Y_EXT_SIG", fittedTrails, det->table, idet);
+	  replaceDummyValuesF32("EXT_INST_MAG",  fittedTrails, det->table, idet);
+	  replaceDummyValuesF32("EXT_INST_MAG_SIG",  fittedTrails, det->table, idet);
+	  replaceDummyValuesF32("NPARAMS",  fittedTrails, det->table, idet);
+	  replaceDummyValuesF32("EXT_WIDTH_MAJ",  fittedTrails, det->table, idet);
+	  replaceDummyValuesF32("EXT_WIDTH_MIN",  fittedTrails, det->table, idet);
+	  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);
+	  replaceDummyValuesF32("EXT_THETA_ERR",  fittedTrails, det->table, idet);
 	}
       }
@@ -198,5 +202,4 @@
 
       // Calculate error in RA, Dec
-
       double xErr = xErrV->data.F32[row];
       double yErr = yErrV->data.F32[row];
@@ -248,106 +251,31 @@
 }
 
-static long* sorted_idets_indexes(psVector *idets);
-static int compare (const void *a, const void *b);
-static psVector* fill_F32_vector(psVector* in, int size, long* indexes, int indexes_length);
-
-// We want the entries in table/fittedTrails to be sorted by increasing idet
-static psMetadata* sort_by_increasing_idet(psMetadata *aTable, long length, long fillLength) {
-  if (aTable == NULL) {
-    return aTable;
+static psVector* createDummyF32(long size) {
+  psVector* dummy = psVectorAlloc(size, PS_TYPE_F32);
+  psVectorInit(dummy, NAN);
+  return dummy;
+}
+
+static void addDummyValues(psMetadata* md, long size) {
+  psMetadataAdd(md, PS_LIST_TAIL, "X_EXT", PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "Y_EXT", PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "X_EXT_SIG", PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "Y_EXT_SIG", PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "EXT_INST_MAG",  PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "EXT_INST_MAG_SIG",  PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "NPARAMS",  PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "EXT_WIDTH_MAJ",  PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "EXT_WIDTH_MIN",  PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "EXT_THETA",  PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "EXT_WIDTH_MAJ_ERR",  PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "EXT_WIDTH_MIN_ERR",  PS_DATA_VECTOR, "", createDummyF32(size));
+  psMetadataAdd(md, PS_LIST_TAIL, "EXT_THETA_ERR",  PS_DATA_VECTOR, "", createDummyF32(size));
+}
+
+static void replaceDummyValuesF32(const char* colName, psMetadata* source, psMetadata* target, psVector* indexes) {
+  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.F32[indexes->data.S64[index]] = source_vector->data.F32[index];
   }
-  psVector *idets = psMetadataLookupVector(NULL, aTable, "IPP_IDET");
-  if (!idets) {
-    psError(PS_ERR_PROGRAMMING, true, "Failed to find IPP_IDET column");
-    return NULL;
-  }
-  bool is_sorted = true;
-  int count = 0;
-  long previous_value = -1;
-  while (is_sorted && (count<length) ){
-    is_sorted = (previous_value < idets->data.S64[count]);
-    previous_value = idets->data.S64[count];
-    count += 1;
-  }
-  if (is_sorted && (length==fillLength)) {
-    psTrace("ppMops.read", 5, "Values are already sorted by idet and the table is complete\n");
-    return aTable;
-  }
-  //otherwise sort (even if it should not happen) and fill
-  long* sortedIndexVector = sorted_idets_indexes(idets);
-  psMetadata* sortedTable = psMetadataAlloc();
-  char* column_name = "X_EXT";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "Y_EXT";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "X_EXT_SIG";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "Y_EXT_SIG";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "EXT_INST_MAG";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "EXT_INST_MAG_SIG";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "NPARAMS";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "EXT_WIDTH_MAJ";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "EXT_WIDTH_MIN";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "EXT_THETA";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "EXT_WIDTH_MAJ_ERR";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "EXT_WIDTH_MIN_ERR";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  column_name = "EXT_THETA_ERR";
-  psMetadataAddVector( sortedTable, PS_LIST_TAIL, column_name, 0, NULL, 
-		       fill_F32_vector(psMetadataLookupVector(NULL, aTable, column_name), fillLength, sortedIndexVector, idets->n) );
-  return sortedTable;
-}
-
-static psVector* fill_F32_vector(psVector* in, int length, long* indexes, int indexes_length) {
-  if (in == NULL) {
-    return NULL;
-  }
-  psVector* out = psVectorAlloc(length, in->type.type);
-  int current_index = 0;
-  for (int i = 0; i < indexes_length; i++) {
-    while ( (current_index < indexes[i]) && (current_index < length) ) {
-      out->data.F32[current_index] = NAN;
-      current_index += 1;
-    }
-    out->data.F32[current_index] = in->data.F32[i];
-    current_index += 1;
-  }
-  while ( current_index < length ) {
-    out->data.F32[current_index] = NAN;
-    current_index += 1;
-  }
-  return out;
-}
-
-static int compare (const void *a, const void *b) {
-  return ( *((long*) a)-*((long*) b));
-}
-
-static long* sorted_idets_indexes(psVector *idets) {
-  long* sortedIndexes = (long*) malloc(idets->n * sizeof(long));
-  for (int i=0;i<idets->n;i++) {
-    sortedIndexes[i] = idets->data.S64[i];
-  }
-  qsort(sortedIndexes, idets->n, sizeof(long), (void *) compare);
-  return sortedIndexes;
-}
+}
