Index: trunk/ppTranslate/src/Makefile.am
===================================================================
--- trunk/ppTranslate/src/Makefile.am	(revision 29560)
+++ trunk/ppTranslate/src/Makefile.am	(revision 29565)
@@ -32,5 +32,6 @@
 	ppMopsRead.c		\
 	ppMopsWrite.c		\
-	ppMopsMerge.c
+	ppMopsMerge.c		\
+	ppMopsGetSkyChipPsfVersion.c
 
 ppMonet_CPPFLAGS = $(PSLIB_CFLAGS) $(PSMODULES_CFLAGS) $(PPMONET_CFLAGS)
Index: trunk/ppTranslate/src/ppMops.c
===================================================================
--- trunk/ppTranslate/src/ppMops.c	(revision 29560)
+++ trunk/ppTranslate/src/ppMops.c	(revision 29565)
@@ -3,4 +3,35 @@
 
 #include "ppMops.h"
+
+/*
+  Behavior:
+
+  If the CMF input files have different versions, merging cannot be
+  performed.
+
+  If -version option is not given: 
+    the output version is the version of the input file(s)
+  otherwise
+    the output version is (possibly forced to) the version option
+
+  If the input file(s) version is equals to the version option:
+    no change in version (neither data creation nor data loss)
+  If the input file(s) version is strictly less than the version option:
+    Data for version option are set tp default values: 0, NaN, NULL
+  If the input file(s) version is strictly greater than the version option:
+    Data are those of the lower version
+
+  Example:
+   -> ppMops dv1_input_files_list output -version 1
+      is the same as 'ppMops dv1_input_files_list output'
+   -> ppMops dv1_input_files_list output -version 1
+      is the same as 'ppMops dv1_input_files_list output'
+   -> ppMops dv1_input_files_list output -version 2
+      Aggregate DV1 values and add default DV2 values
+      Saved as DV2 file
+   -> ppMops dv2_input_files_list output -version 1
+      Aggregate DV1 values and truncate DV2 values 
+      Saved as DV1 file
+ */
 
 int main(int argc, char *argv[])
Index: trunk/ppTranslate/src/ppMops.h
===================================================================
--- trunk/ppTranslate/src/ppMops.h	(revision 29560)
+++ trunk/ppTranslate/src/ppMops.h	(revision 29565)
@@ -25,5 +25,5 @@
   float rmsAstrom;                    // Astrometric solution RMS
   psString output;                    // Output filename
-  psU16 version;                        // Version (for parameters)
+  psU16 version;                      // Version (for parameters)
 } ppMopsArguments;
 
@@ -125,5 +125,5 @@
 
 /// Read detections
-psArray *ppMopsRead(const ppMopsArguments *args);
+psArray *ppMopsRead(ppMopsArguments *args);
 
 /// Merge detections
@@ -133,3 +133,9 @@
 bool ppMopsWrite(const ppMopsDetections *detections, const ppMopsArguments *args);
 
+/// Get the version contained in EXTTYPE of the "SkyChip.psf" table:
+/// @returns 1 if EXTTYPE of "SkyChip.psf" is PS1_DV1
+/// @returns 2 if EXTTYPE of "SkyChip.psf" is PS1_DV2
+/// @returns 0 otherwise
+int ppMopsGetSkyChipPsfVersion(const psFits* fits);
+
 #endif
Index: trunk/ppTranslate/src/ppMopsArguments.c
===================================================================
--- trunk/ppTranslate/src/ppMopsArguments.c	(revision 29560)
+++ trunk/ppTranslate/src/ppMopsArguments.c	(revision 29565)
@@ -74,5 +74,5 @@
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-zp_error", 0, "Error in magnitude zero point", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-astrom_rms", 0, "Astrometric solution RMS", NAN);
-    psMetadataAddU16(arguments, PS_LIST_TAIL, "-version", 0, "Parameters version (see ICD)", 1);
+    psMetadataAddU16(arguments, PS_LIST_TAIL, "-version", 0, "Parameters version (see ICD)", 0);
 
     if (argc == 1 || !psArgumentParse(arguments, &argc, argv) || argc != 3) {
Index: trunk/ppTranslate/src/ppMopsGetSkyChipPsfVersion.c
===================================================================
--- trunk/ppTranslate/src/ppMopsGetSkyChipPsfVersion.c	(revision 29565)
+++ trunk/ppTranslate/src/ppMopsGetSkyChipPsfVersion.c	(revision 29565)
@@ -0,0 +1,17 @@
+# include "ppMops.h"
+
+int ppMopsGetSkyChipPsfVersion(const psFits* fits) {
+  // It is expected that the fits stream cursor was advanced
+  // till the "SkyChip.psf"
+  psMetadata *headerSkyChip = psFitsReadHeader(NULL, fits); 
+  char* version = psMetadataLookupStr(NULL, headerSkyChip, "EXTTYPE");
+  psTrace("ppMopsGetSkyChipPsfVersion", 1, 
+	  "EXTTYPE value: [%s]\n", version);
+  if (strcmp(version, "PS1_DV1") == 0) {
+    return 1;
+  } else if (strcmp(version, "PS1_DV2") == 0) {
+    return 2;
+  }
+  psWarning("Unsupported EXTTYPE in SkyChip.psf table: [%s]", version);
+  return 0;
+}
Index: trunk/ppTranslate/src/ppMopsRead.c
===================================================================
--- trunk/ppTranslate/src/ppMopsRead.c	(revision 29560)
+++ trunk/ppTranslate/src/ppMopsRead.c	(revision 29565)
@@ -8,5 +8,9 @@
 #include "ppMops.h"
 
-psArray *ppMopsRead(const ppMopsArguments *args)
+/*
+  ppMopsRead possibly modifies the args->version if the user did not
+  set it explicitely.
+ */
+psArray *ppMopsRead(ppMopsArguments *args)
 {
     psTrace("ppMops.read", 1, "Reading input detections\n");
@@ -17,4 +21,5 @@
     for (int i = 0; i < num; i++) {
         psFits *fits = psFitsOpen(inNames->data[i], "r"); // FITS file
+
         if (!fits) {
             psError(PS_ERR_IO, false, "Unable to open input %d", i);
@@ -37,4 +42,25 @@
             return false;
         }
+	int skyChipPsfVersion = ppMopsGetSkyChipPsfVersion(fits);
+	if (args->version == 0) {
+	  psTrace("ppMops.read", 1, "Changing args->version to %d\n", skyChipPsfVersion);
+	  args->version = skyChipPsfVersion;
+	}
+	if (skyChipPsfVersion == 0) {
+	  // Try to read with the user specified version?
+	  skyChipPsfVersion = args->version;
+	}
+	/* Display a warning message if there are version
+	   inconsistencies between the file and the flag (note that
+	   those inconsistencies might be wanted) */
+	if (skyChipPsfVersion != args->version) {
+	  if (skyChipPsfVersion > args->version) {
+	    psWarning("The FITS data will be downgraded from PS1_DV%d to PS1_DV%d\n",
+		      skyChipPsfVersion, args->version);
+	  } else { // Necessarily: skyChipPsfVersion > args->version
+	    psWarning("The FITS data will be upgraded from PS1_DV%d to PS1_DV%d (new values set to default 0, NaN...)\n",
+		      skyChipPsfVersion, args->version);	    
+	  }
+	}
 
         long size = psFitsTableSize(fits); // Size of table
@@ -117,59 +143,62 @@
 	    //Additions of 2010-10-25
 	    if (args->version == 2) {
-	      det->psfInstFlux->data.F32[numGood] = psMetadataLookupS32(NULL, row, "PSF_INST_FLUX");
-	      det->psfInstFluxSig->data.F32[numGood] = psMetadataLookupS32(NULL, row, "PSF_INST_FLUX_SIG");
-	      det->apMag->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_MAG");
-	      det->apMagRaw->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_MAG_RAW");
-	      det->apMagRadius->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_MAG_RADIUS");
-	      det->apFlux->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_FLUX");
-	      det->apFluxSig->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_FLUX_SIG");
-	      det->peakFluxAsMag->data.F32[numGood] = psMetadataLookupS32(NULL, row, "PEAK_FLUX_AS_MAG");
-	      det->calPsfMag->data.F32[numGood] = psMetadataLookupS32(NULL, row, "CAL_PSF_MAG");
-	      det->calPsfMagSig->data.F32[numGood] = psMetadataLookupS32(NULL, row, "CAL_PSF_MAG_SIG");
-	      det->sky->data.F32[numGood] = psMetadataLookupS32(NULL, row, "SKY");
-	      det->skySig->data.F32[numGood] = psMetadataLookupS32(NULL, row, "SKY_SIGMA");
-	      det->qualityPerfect->data.F32[numGood] = psMetadataLookupF32(NULL, row, "PSF_QF_PERFECT");
-	      det->momentsR1->data.F32[numGood] = psMetadataLookupF32(NULL, row, "MOMENTS_R1");
-	      det->momentsRH->data.F32[numGood] = psMetadataLookupF32(NULL, row, "MOMENTS_RH");
-	      det->kronFlux->data.F32[numGood] = psMetadataLookupF32(NULL, row, "KRON_FLUX");
-	      det->kronFluxErr->data.F32[numGood] = psMetadataLookupF32(NULL, row, "KRON_FLUX_ERR");
-	      det->kronFluxInner->data.F32[numGood] = psMetadataLookupF32(NULL, row, "KRON_FLUX_INNER");
-	      det->kronFluxOuter->data.F32[numGood] = psMetadataLookupF32(NULL, row, "KRON_FLUX_OUTER");
-	      det->diffRP->data.F32[numGood] = psMetadataLookupF32(NULL, row, "DIFF_R_P");
-	      det->diffSnP->data.F32[numGood] = psMetadataLookupF32(NULL, row, "DIFF_SN_P");
-	      det->diffRM->data.F32[numGood] = psMetadataLookupF32(NULL, row, "DIFF_R_M");
-	      det->diffSnM->data.F32[numGood] = psMetadataLookupF32(NULL, row, "DIFF_SN_M");
-	      det->flags2->data.U32[numGood] = psMetadataLookupU32(NULL, row, "FLAGS2");
-	      det->ippIdet->data.U32[numGood] = psMetadataLookupU32(NULL, row, "IPP_IDET");
-	      det->nFrames->data.U16[numGood] = psMetadataLookupU16(NULL, row, "N_FRAMES");
-	      det->padding->data.S16[numGood] = psMetadataLookupS16(NULL, row, "PADDING");
-	    } else {
-	      det->psfInstFlux->data.F32[numGood] = NAN;
-	      det->psfInstFluxSig->data.F32[numGood] = NAN;
-	      det->apMag->data.F32[numGood] = NAN;
-	      det->apMagRaw->data.F32[numGood] = NAN;
-	      det->apMagRadius->data.F32[numGood] = NAN;
-	      det->apFlux->data.F32[numGood] = NAN;
-	      det->apFluxSig->data.F32[numGood] = NAN;
-	      det->peakFluxAsMag->data.F32[numGood] = NAN;
-	      det->calPsfMag->data.F32[numGood] = NAN;
-	      det->calPsfMagSig->data.F32[numGood] = NAN;
-	      det->sky->data.F32[numGood] = NAN;
-	      det->skySig->data.F32[numGood] = NAN;
-	      det->qualityPerfect->data.F32[numGood] = NAN;
-	      det->momentsR1->data.F32[numGood] = NAN;
-	      det->momentsRH->data.F32[numGood] = NAN;
-	      det->kronFlux->data.F32[numGood] = NAN;
-	      det->kronFluxErr->data.F32[numGood] = NAN;
-	      det->kronFluxInner->data.F32[numGood] = NAN;
-	      det->kronFluxOuter->data.F32[numGood] = NAN;
-	      det->diffRP->data.F32[numGood] = NAN;
-	      det->diffSnP->data.F32[numGood] = NAN;
-	      det->diffRM->data.F32[numGood] = NAN;
-	      det->diffSnM->data.F32[numGood] = NAN;
-	      det->flags2->data.U32[numGood] = 0;
-	      det->ippIdet->data.U32[numGood] = 0;
-	      det->nFrames->data.U16[numGood] = 0;
-	      det->padding->data.S16[numGood] = 0;
+	      //Values are set only if the version is 2
+	      if (skyChipPsfVersion == 2) {
+		det->psfInstFlux->data.F32[numGood] = psMetadataLookupS32(NULL, row, "PSF_INST_FLUX");
+		det->psfInstFluxSig->data.F32[numGood] = psMetadataLookupS32(NULL, row, "PSF_INST_FLUX_SIG");
+		det->apMag->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_MAG");
+		det->apMagRaw->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_MAG_RAW");
+		det->apMagRadius->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_MAG_RADIUS");
+		det->apFlux->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_FLUX");
+		det->apFluxSig->data.F32[numGood] = psMetadataLookupS32(NULL, row, "AP_FLUX_SIG");
+		det->peakFluxAsMag->data.F32[numGood] = psMetadataLookupS32(NULL, row, "PEAK_FLUX_AS_MAG");
+		det->calPsfMag->data.F32[numGood] = psMetadataLookupS32(NULL, row, "CAL_PSF_MAG");
+		det->calPsfMagSig->data.F32[numGood] = psMetadataLookupS32(NULL, row, "CAL_PSF_MAG_SIG");
+		det->sky->data.F32[numGood] = psMetadataLookupS32(NULL, row, "SKY");
+		det->skySig->data.F32[numGood] = psMetadataLookupS32(NULL, row, "SKY_SIGMA");
+		det->qualityPerfect->data.F32[numGood] = psMetadataLookupF32(NULL, row, "PSF_QF_PERFECT");
+		det->momentsR1->data.F32[numGood] = psMetadataLookupF32(NULL, row, "MOMENTS_R1");
+		det->momentsRH->data.F32[numGood] = psMetadataLookupF32(NULL, row, "MOMENTS_RH");
+		det->kronFlux->data.F32[numGood] = psMetadataLookupF32(NULL, row, "KRON_FLUX");
+		det->kronFluxErr->data.F32[numGood] = psMetadataLookupF32(NULL, row, "KRON_FLUX_ERR");
+		det->kronFluxInner->data.F32[numGood] = psMetadataLookupF32(NULL, row, "KRON_FLUX_INNER");
+		det->kronFluxOuter->data.F32[numGood] = psMetadataLookupF32(NULL, row, "KRON_FLUX_OUTER");
+		det->diffRP->data.F32[numGood] = psMetadataLookupF32(NULL, row, "DIFF_R_P");
+		det->diffSnP->data.F32[numGood] = psMetadataLookupF32(NULL, row, "DIFF_SN_P");
+		det->diffRM->data.F32[numGood] = psMetadataLookupF32(NULL, row, "DIFF_R_M");
+		det->diffSnM->data.F32[numGood] = psMetadataLookupF32(NULL, row, "DIFF_SN_M");
+		det->flags2->data.U32[numGood] = psMetadataLookupU32(NULL, row, "FLAGS2");
+		det->ippIdet->data.U32[numGood] = psMetadataLookupU32(NULL, row, "IPP_IDET");
+		det->nFrames->data.U16[numGood] = psMetadataLookupU16(NULL, row, "N_FRAMES");
+		det->padding->data.S16[numGood] = psMetadataLookupS16(NULL, row, "PADDING");
+	      } else {
+		det->psfInstFlux->data.F32[numGood] = NAN;
+		det->psfInstFluxSig->data.F32[numGood] = NAN;
+		det->apMag->data.F32[numGood] = NAN;
+		det->apMagRaw->data.F32[numGood] = NAN;
+		det->apMagRadius->data.F32[numGood] = NAN;
+		det->apFlux->data.F32[numGood] = NAN;
+		det->apFluxSig->data.F32[numGood] = NAN;
+		det->peakFluxAsMag->data.F32[numGood] = NAN;
+		det->calPsfMag->data.F32[numGood] = NAN;
+		det->calPsfMagSig->data.F32[numGood] = NAN;
+		det->sky->data.F32[numGood] = NAN;
+		det->skySig->data.F32[numGood] = NAN;
+		det->qualityPerfect->data.F32[numGood] = NAN;
+		det->momentsR1->data.F32[numGood] = NAN;
+		det->momentsRH->data.F32[numGood] = NAN;
+		det->kronFlux->data.F32[numGood] = NAN;
+		det->kronFluxErr->data.F32[numGood] = NAN;
+		det->kronFluxInner->data.F32[numGood] = NAN;
+		det->kronFluxOuter->data.F32[numGood] = NAN;
+		det->diffRP->data.F32[numGood] = NAN;
+		det->diffSnP->data.F32[numGood] = NAN;
+		det->diffRM->data.F32[numGood] = NAN;
+		det->diffSnM->data.F32[numGood] = NAN;
+		det->flags2->data.U32[numGood] = 0;
+		det->ippIdet->data.U32[numGood] = 0;
+		det->nFrames->data.U16[numGood] = 0;
+		det->padding->data.S16[numGood] = 0;
+	      }
 	    }
 
Index: trunk/ppTranslate/src/ppMopsWrite.c
===================================================================
--- trunk/ppTranslate/src/ppMopsWrite.c	(revision 29560)
+++ trunk/ppTranslate/src/ppMopsWrite.c	(revision 29565)
@@ -50,4 +50,8 @@
     psMetadataAddF32(header, PS_LIST_TAIL, "MAGZPERR", 0, "Error in magnitude zero point", args->zpErr);
     psMetadataAddF32(header, PS_LIST_TAIL, "ASTRORMS", 0, "RMS of astrometric fit", args->rmsAstrom);
+    //New field in header that tells about the CMF version
+    char cmfVersion[8];
+    sprintf(cmfVersion, "PS1_DV%d", args->version);
+    psMetadataAddStr(header, PS_LIST_TAIL, "CMFVERSION", 0, "CMF version", cmfVersion);
 
     if (det->num == 0) {
