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;
+	      }
 	    }
 
