Index: /branches/eam_branches/relphot.20210521/include/relphot.h
===================================================================
--- /branches/eam_branches/relphot.20210521/include/relphot.h	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/include/relphot.h	(revision 41606)
@@ -518,5 +518,5 @@
 int           bcatalog            PROTO((Catalog *subcatalog, Catalog *catalog, int Ncat));
 void          clean_images        PROTO((void));
-void          clean_measures      PROTO((Catalog *catalog, int Ncatalog, int final, FlatCorrectionTable *flatcorr));
+void          clean_measures      PROTO((Catalog *catalog, int Ncatalog, int final));
 void          clean_mosaics       PROTO((void));
 void          clean_tgroups       PROTO((void));
@@ -555,5 +555,5 @@
 
 float         getMcal             PROTO((off_t meas, int cat, dvoMagClassType class));
-float         getMflat            PROTO((off_t meas, int cat, FlatCorrectionTable *flatcorr, Catalog *catalog));
+float         getMflat            PROTO((off_t meas, int cat, Catalog *catalog));
 float         getMgridTiny        PROTO((MeasureTiny *measure));
 float         getMgrid            PROTO((Measure *measure));
@@ -566,5 +566,5 @@
 Image        *getimages           PROTO((off_t *N, off_t **LineNumber));
 ImageSubset  *getimages_subset    PROTO((off_t *N));
-void          global_stats        PROTO((Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr, int nloop));
+void          global_stats        PROTO((Catalog *catalog, int Ncatalog, int nloop));
 void          initGrid            PROTO(());
 void          initGridBins        PROTO(());
@@ -621,5 +621,5 @@
 void          plot_mosaic_fields  PROTO((Catalog *catalog));
 void          plot_mosaics        PROTO((void));
-void          plot_scatter        PROTO((Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr));
+void          plot_scatter        PROTO((Catalog *catalog, int Ncatalog));
 void          plot_star_coords    PROTO((Catalog *catalog, int Ncatalog));
 void          plot_stars          PROTO((Catalog *catalog, int Ncatalog));
@@ -630,5 +630,5 @@
 int           open_graph          PROTO((int N));
 
-void          reload_catalogs     PROTO((SkyList *skylist, FlatCorrectionTable *flatcorr, int hostID, char *hostpath));
+void          reload_catalogs     PROTO((SkyList *skylist, int hostID, char *hostpath));
 int           reload_catalogs_parallel PROTO((SkyList *sky));
 int           reload_images       PROTO((FITS_DB *db));
@@ -639,20 +639,20 @@
 void          setMcalFromMosaics  PROTO((void));
 void          setMcalFromTGroups  PROTO((void));
-int           setMcalOutput       PROTO((Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr));
-
-void          setMcal             PROTO((Catalog *catalog, FlatCorrectionTable *flatcorr));
-int           setMmos             PROTO((Catalog *catalog, FlatCorrectionTable *flatcorr));
-int           setMgrp             PROTO((Catalog *catalog, FlatCorrectionTable *flatcorr));
-
-int           setMrel             PROTO((Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr));
-void          setMrelFinal        PROTO((Catalog *catalog, FlatCorrectionTable *flatcorr, int simpleAverage));
-int           setMrelOutput       PROTO((Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr));
-
-void          setMcalTest         PROTO((Catalog *catalog, FlatCorrectionTable *flatcorr));
+int           setMcalOutput       PROTO((Catalog *catalog, int Ncatalog));
+
+void          setMcal             PROTO((Catalog *catalog));
+int           setMmos             PROTO((Catalog *catalog));
+int           setMgrp             PROTO((Catalog *catalog));
+
+int           setMrel             PROTO((Catalog *catalog, int Ncatalog));
+void          setMrelFinal        PROTO((Catalog *catalog, int simpleAverage));
+int           setMrelOutput       PROTO((Catalog *catalog, int Ncatalog));
+
+void          setMcalTest         PROTO((Catalog *catalog));
 
 int           setMave             PROTO((Catalog *catalog, int Ncatalog));
 void          set_ZP              PROTO((double ZERO));
 int           setrefcode          PROTO((Image *image, off_t Nimage)); 
-void          skip_measurements   PROTO((Catalog *catalog, int pass, FlatCorrectionTable *flatcorr));
+void          skip_measurements   PROTO((Catalog *catalog, int pass));
 void          sortA               PROTO((double *X, int N));
 void          sortB               PROTO((double *X, double *Y, int N));
@@ -660,9 +660,9 @@
 void          sortD               PROTO((double *X, double *Y, double *Z, int N));
 StatType      statsImageM         PROTO((Catalog *catalog));
-StatType      statsImageN         PROTO((Catalog *catalog, FlatCorrectionTable *flatcorr));
+StatType      statsImageN         PROTO((Catalog *catalog));
 StatType      statsImageX         PROTO((Catalog *catalog));
 StatType      statsImagedM        PROTO((Catalog *catalog));
 StatType      statsMosaicM        PROTO((Catalog *catalog));
-StatType      statsMosaicN        PROTO((Catalog *catalog, FlatCorrectionTable *flatcorr));
+StatType      statsMosaicN        PROTO((Catalog *catalog));
 StatType      statsMosaicX        PROTO((Catalog *catalog));
 StatType      statsMosaicdM       PROTO((Catalog *catalog));
@@ -671,5 +671,5 @@
 StatType      statsTGroupdM       PROTO((Catalog *catalog));
 
-StatType      statsStarN          PROTO((Catalog *catalog, int Ncatalog, int Nsec, int seccode, FlatCorrectionTable *flatcorr));
+StatType      statsStarN          PROTO((Catalog *catalog, int Ncatalog, int Nsec, int seccode));
 StatType      statsStarS          PROTO((Catalog *catalog, int Ncatalog, int Nsec));
 StatType      statsStarX          PROTO((Catalog *catalog, int Ncatalog, int Nsec));
@@ -717,8 +717,8 @@
 
 int print_measure_set_alt (Average *average, SecFilt *secfilt, Measure *measure);
-int setMrel_catalog_alt (Catalog *catalog, int Nc, int isSetMrelFinal, FlatCorrectionTable *flatcorr, SetMrelInfo *results, int Nsecfilt);
-int setMrelAverageExposure (Catalog *catalog, int cat, off_t ave, int Nsecfilt, int isSetMrelFinal, FlatCorrectionTable *flatcorr, SetMrelInfo *results);
-int setMrelAverageStack (Catalog *catalog, int cat, off_t ave, int Nsecfilt, FlatCorrectionTable *flatcorr);
-int setMrelAverageForcedWarp (Catalog *catalog, int cat, off_t ave, int Nsecfilt, FlatCorrectionTable *flatcorr, SetMrelInfo *results);
+int setMrel_catalog_alt (Catalog *catalog, int Nc, int isSetMrelFinal, SetMrelInfo *results, int Nsecfilt);
+int setMrelAverageExposure (Catalog *catalog, int cat, off_t ave, int Nsecfilt, int isSetMrelFinal, SetMrelInfo *results);
+int setMrelAverageStack (Catalog *catalog, int cat, off_t ave, int Nsecfilt);
+int setMrelAverageForcedWarp (Catalog *catalog, int cat, off_t ave, int Nsecfilt, SetMrelInfo *results);
 
 int setGlobalObjStats (Average *average, Measure *measure);
Index: /branches/eam_branches/relphot.20210521/src/BrightCatalog.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/BrightCatalog.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/BrightCatalog.c	(revision 41606)
@@ -12,8 +12,4 @@
   myAssert (!strcmp(type, #TYPE), "wrong column type");
 
-// XXX double check the header extname values for each table
-// XXX make sure we free things as we can
-// XXX make sure we close files as we can
-// XXX handle free and close on error return as well
 BrightCatalog *BrightCatalogLoad(char *filename) {
 
@@ -622,12 +618,5 @@
 int BrightCatalogSplitFree (CatalogSplitter *catalogs) {
 
-  // XXX don't free the catalogs : 
-  // for (i = 0; i < NCATALOG; i++) {
-  //   free (catalogs->catalog[i].averageT);
-  //   free (catalogs->catalog[i].measureT);
-  //   free (catalogs->catalog[i].secfilt);
-  // }
-  // free (catalogs->catalog);
-
+  // don't free the catalogs : free elsewhere
   free (catalogs->catIDs);
   free (catalogs->NAVERAGE);
@@ -652,5 +641,4 @@
     catIDmax = MAX(catIDmax, bcatalog->average[i].catID);
   }
-  // XXX validate the measure ID range here
     
   int maxIDold = catalogs->maxID;
@@ -746,5 +734,4 @@
 
   // assign the measures to the corresponding catalog
-  // XXX what about averef and related links?  Do I need them?
   for (i = 0; i < bcatalog->Nmeasure; i++) {
     int ID = bcatalog->measure[i].catID;
Index: /branches/eam_branches/relphot.20210521/src/ImageOps.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/ImageOps.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/ImageOps.c	(revision 41606)
@@ -497,17 +497,4 @@
 }
 
-float getMflat (off_t meas, int cat, FlatCorrectionTable *flatcorr, Catalog *catalog) {
-  OHANA_UNUSED_PARAM(flatcorr);
-
-  off_t i = MeasureToImage[cat][meas];
-  if (i == -1) return (NAN);
-
-  float offset = catalog[cat].measureT[meas].Mflat;
-  if (!isfinite(offset)) {
-    offset = 0.0;
-  }
-  return (offset);
-}
-
 Coords *getCoords (off_t meas, int cat) {
 
@@ -520,5 +507,5 @@
 
 /* determine Mcal values for all images */
-void setMcal (Catalog *catalog, FlatCorrectionTable *flatcorr) {
+void setMcal (Catalog *catalog) {
 
   off_t i, j, m, c, n;
@@ -651,5 +638,5 @@
       // the flat-correction.  NOTE the sign of Mflat (Image.Mcal = Measure.Mcal - Mflat)
 
-      float Mflat = getMflat (m, c, flatcorr, catalog);
+      float Mflat = getMflat (m, c, catalog);
 
       n = catalog[c].measureT[m].averef;
@@ -773,5 +760,5 @@
 
 /* determine McalTEST values for all images -- this is not used to set measure.Mcal, but only to test */
-void setMcalTest (Catalog *catalog, FlatCorrectionTable *flatcorr) {
+void setMcalTest (Catalog *catalog) {
 
   off_t i, j, m, c, n;
@@ -845,5 +832,5 @@
       // the flat-correction.  NOTE the sign of Mflat (Image.Mcal = Measure.Mcal - Mflat)
 
-      float Mflat = getMflat (m, c, flatcorr, catalog);
+      float Mflat = getMflat (m, c, catalog);
 
       // get the PSF magnitude for thie measurement, with airmass slope applied
@@ -1084,5 +1071,5 @@
 }
 
-StatType statsImageN (Catalog *catalog, FlatCorrectionTable *flatcorr) {
+StatType statsImageN (Catalog *catalog) {
 
   off_t i, j, m, c, n, N;
Index: /branches/eam_branches/relphot.20210521/src/MagResidSave.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/MagResidSave.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/MagResidSave.c	(revision 41606)
@@ -235,5 +235,5 @@
     // the flat-correction.  NOTE the sign of Mflat (Image.Mcal = Measure.Mcal - Mflat)
 
-    // float Mflat = getMflat (m, c, flatcorr, catalog);
+    float Mflat = getMflat (m, c, catalog);
 
     // MrelPSF is the average magnitude for this star.  
@@ -248,8 +248,5 @@
     if (isnan(MsysPSF)) continue;
 
-    // XXX skip Mflat for now
-    // float Moff = Mcal + Mmos + Mgrp + Mgrid - Mflat;
-
-    float Moff = Mcal + Mmos + Mgrp + Mgrid;
+    float Moff = Mcal + Mmos + Mgrp + Mgrid - Mflat;
 
     // Mrel is the true average apparent magnitude of this star
Index: /branches/eam_branches/relphot.20210521/src/MosaicOps.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/MosaicOps.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/MosaicOps.c	(revision 41606)
@@ -1,5 +1,5 @@
 # include "relphot.h"
 off_t findMosaic (unsigned int *startTimes, off_t Nmosaic, unsigned int start);
-int save_test_mosaic_measures (FILE *fout, int Nmos, Catalog *catalog, FlatCorrectionTable *flatcorr);
+int save_test_mosaic_measures (FILE *fout, int Nmos, Catalog *catalog);
 
 // see discussion in ImagesOps.c re: IDX_T
@@ -818,11 +818,10 @@
   Catalog *catalog;
   Image *image;
-  FlatCorrectionTable *flatcorr;
   SetMmosInfo info;
 } ThreadInfo;
 
-int setMmos_mosaic (Mosaic *mosaic, off_t Nmos, Image *image, Catalog *catalog, SetMmosInfo *info, FlatCorrectionTable *flatcorr);
+int setMmos_mosaic (Mosaic *mosaic, off_t Nmos, Image *image, Catalog *catalog, SetMmosInfo *info);
 void *setMmos_worker (void *data);
-int setMmos_threaded (Catalog *catalog, FlatCorrectionTable *flatcorr);
+int setMmos_threaded (Catalog *catalog);
 
 void SetMmosInfoInit (SetMmosInfo *info, off_t Nmax, int allocLists) {
@@ -890,5 +889,5 @@
 }
 
-int setMmos (Catalog *catalog, FlatCorrectionTable *flatcorr) {
+int setMmos (Catalog *catalog) {
 
   off_t i, N, Nmax;
@@ -903,5 +902,5 @@
   // so do not run setMmos in threaded mode if PLOTSTUFF is set
   if (NTHREADS && !PLOTSTUFF) {
-    int status = setMmos_threaded (catalog, flatcorr);
+    int status = setMmos_threaded (catalog);
     return status;
   }
@@ -923,5 +922,5 @@
 
   for (i = 0; i < Nmosaic; i++) {
-    setMmos_mosaic (&mosaic[i], i, image, catalog, &info, flatcorr);
+    setMmos_mosaic (&mosaic[i], i, image, catalog, &info);
   }
   SetMmosInfoFree (&info);
@@ -940,5 +939,5 @@
   
 // 'mosaic' is a pointer to the current mosaic of interest (Nmos)
-int setMmos_mosaic (Mosaic *myMosaic, off_t Nmos, Image *image, Catalog *catalog, SetMmosInfo *info, FlatCorrectionTable *flatcorr) {
+int setMmos_mosaic (Mosaic *myMosaic, off_t Nmos, Image *image, Catalog *catalog, SetMmosInfo *info) {
 
   off_t j, NimageReal;
@@ -1021,5 +1020,5 @@
     snprintf (filename, 64, "test.%05d.%02d.dat", (int) Nmos, npass_output);
     fout = fopen (filename, "w");
-    save_test_mosaic_measures (fout, Nmos, catalog, flatcorr);
+    save_test_mosaic_measures (fout, Nmos, catalog);
     fclose (fout);
   }
@@ -1072,5 +1071,5 @@
     // the flat-correction.  NOTE the sign of Mflat (Image.Mcal = Measure.Mcal - Mflat)
 
-    float Mflat = getMflat (m, c, flatcorr, catalog);
+    float Mflat = getMflat (m, c, catalog);
 
     off_t n = catalog[c].measureT[m].averef;
@@ -1187,5 +1186,5 @@
 }
   
-int save_test_mosaic_measures (FILE *fout, int Nmos, Catalog *catalog, FlatCorrectionTable *flatcorr) {
+int save_test_mosaic_measures (FILE *fout, int Nmos, Catalog *catalog) {
 
   int Nsecfilt = GetPhotcodeNsecfilt ();
@@ -1201,5 +1200,5 @@
     float Mgrid    = getMgridTiny (&catalog[c].measureT[m]);
     float MrelPSF  = getMrel  (catalog, m, c, MAG_CLASS_PSF, MAG_SRC_CHP);
-    float Mflat    = getMflat (m, c, flatcorr, catalog);
+    float Mflat    = getMflat (m, c, catalog);
 
     off_t n = catalog[c].measureT[m].averef;
@@ -1215,5 +1214,5 @@
 }
 
-int setMmos_threaded (Catalog *catalog, FlatCorrectionTable *flatcorr) {
+int setMmos_threaded (Catalog *catalog) {
 
   int i;
@@ -1252,5 +1251,4 @@
     threadinfo[i].catalog  =  catalog;
     threadinfo[i].image    =    image;
-    threadinfo[i].flatcorr = flatcorr;
 
     // we do NOT allocate the arrays here, we only supply basic info (Nmax, Nloop) used in
@@ -1321,8 +1319,7 @@
 
     Catalog *catalog = threadinfo->catalog;
-    FlatCorrectionTable *flatcorr = threadinfo->flatcorr;
     Image *image = threadinfo->image;
 
-    setMmos_mosaic (&mosaic[i], i, image, catalog, &results, flatcorr);
+    setMmos_mosaic (&mosaic[i], i, image, catalog, &results);
     SetMmosInfoAccum (&threadinfo->info, &results);
   }
@@ -1599,5 +1596,5 @@
 }
 
-StatType statsMosaicN (Catalog *catalog, FlatCorrectionTable *flatcorr) {
+StatType statsMosaicN (Catalog *catalog) {
 
   off_t i, j, m, c, n, N;
Index: /branches/eam_branches/relphot.20210521/src/StarOps.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/StarOps.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/StarOps.c	(revision 41606)
@@ -8,5 +8,4 @@
   Catalog *catalog;
   int Ncatalog;
-  FlatCorrectionTable *flatcorr;
   SetMrelInfo summary;
 } ThreadInfo;
@@ -14,6 +13,6 @@
 // ** internal functions:
 void *setMrel_worker (void *data);
-int setMrel_threaded (Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr);
-int setMrel_catalog (Catalog *catalog, int Nc, int pass, FlatCorrectionTable *flatcorr, SetMrelInfo *results, int Nsecfilt);
+int setMrel_threaded (Catalog *catalog, int Ncatalog);
+int setMrel_catalog (Catalog *catalog, int Nc, int pass, SetMrelInfo *results, int Nsecfilt);
 int print_measure_set (Average *average, SecFilt *secfilt, Measure *measure);
 
@@ -298,10 +297,10 @@
 // * setMrelOutput updates average EXT flags (PS1 and 2MASS)
 
-int setMrel (Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr) {
+int setMrel (Catalog *catalog, int Ncatalog) {
 
   int i;
 
   if (NTHREADS) {
-    int status = setMrel_threaded (catalog, Ncatalog, flatcorr);
+    int status = setMrel_threaded (catalog, Ncatalog);
     return status;
   }
@@ -314,5 +313,5 @@
 
   for (i = 0; i < Ncatalog; i++) {
-    setMrel_catalog_alt (catalog, i, FALSE, flatcorr, &results, Nsecfilt);
+    setMrel_catalog_alt (catalog, i, FALSE, &results, Nsecfilt);
     SetMrelInfoAccum (&summary, &results);
   }
@@ -326,5 +325,5 @@
 
 // setMrelOutput is NOT threaded because we read/write catalogs one at a time (for now)
-int setMrelOutput (Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr) {
+int setMrelOutput (Catalog *catalog, int Ncatalog) {
 
   int i;
@@ -337,5 +336,5 @@
 
   for (i = 0; i < Ncatalog; i++) {
-    setMrel_catalog_alt (catalog, i, TRUE, flatcorr, &results, Nsecfilt);
+    setMrel_catalog_alt (catalog, i, TRUE, &results, Nsecfilt);
     SetMrelInfoAccum (&summary, &results);
   }
@@ -347,5 +346,5 @@
 }
 
-int setMrel_threaded (Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr) {
+int setMrel_threaded (Catalog *catalog, int Ncatalog) {
 
   int i;
@@ -374,5 +373,4 @@
     threadinfo[i].catalog  =  catalog;
     threadinfo[i].Ncatalog = Ncatalog;
-    threadinfo[i].flatcorr = flatcorr;
     SetMrelInfoInit (&threadinfo[i].summary, FALSE);
     pthread_create (&threads[i], NULL, setMrel_worker, &threadinfo[i]);
@@ -435,7 +433,6 @@
 
     Catalog *catalog = threadinfo->catalog;
-    FlatCorrectionTable *flatcorr = threadinfo->flatcorr;
-
-    setMrel_catalog_alt (catalog, i, FALSE, flatcorr, &results, Nsecfilt);
+
+    setMrel_catalog_alt (catalog, i, FALSE, &results, Nsecfilt);
     SetMrelInfoAccum (&threadinfo->summary, &results);
   }
@@ -474,5 +471,5 @@
 
 /* set measure.Mcal for all measures except ID_MEAS_NOCAL and ID_IMAGE_PHOTOM_NOCAL */
-int setMcalOutput (Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr) {
+int setMcalOutput (Catalog *catalog, int Ncatalog) {
 
   int i;
@@ -667,5 +664,5 @@
 # define NSIGMA_CLIP 3.0
 # define NSIGMA_REJECT 5.0
-void clean_measures (Catalog *catalog, int Ncatalog, int final, FlatCorrectionTable *flatcorr) {
+void clean_measures (Catalog *catalog, int Ncatalog, int final) {
 
   off_t j, k, m, Nmax, Ndel, Nave;
@@ -833,5 +830,5 @@
 }
 
-StatType statsStarN (Catalog *catalog, int Ncatalog, int Nsec, int seccode, FlatCorrectionTable *flatcorr) {
+StatType statsStarN (Catalog *catalog, int Ncatalog, int Nsec, int seccode) {
 
   off_t j, k, m, Ntot;
@@ -1106,5 +1103,5 @@
       float MrelPSF  = getMrel  (catalog, m, c, MAG_CLASS_PSF, MAG_SRC_CHP); // average magnitude
       // float Mgrid    = getMgridTiny (&catalog[c].measureT[m]);                    // camera offset (deprecated?)
-      // float Mflat    = getMflat (m, c, flatcorr, catalog); // flat-field correction
+      // float Mflat    = getMflat (m, c, catalog); // flat-field correction
 
       off_t n = catalog[c].measureT[m].averef;
@@ -1121,2 +1118,11 @@
   fclose (fout);
 }
+
+// maybe make this a macro
+float getMflat (off_t meas, int cat, Catalog *catalog) {
+  float offset = catalog[cat].measureT[meas].Mflat;
+  if (!isfinite(offset)) {
+    offset = 0.0;
+  }
+  return (offset);
+}
Index: /branches/eam_branches/relphot.20210521/src/TGroupOps.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/TGroupOps.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/TGroupOps.c	(revision 41606)
@@ -2,5 +2,5 @@
 
 void assignMosaicsToTGroups (void);
-int save_test_night_measures (FILE *fout, TGroup *myTGroup, Catalog *catalog, FlatCorrectionTable *flatcorr);
+int save_test_night_measures (FILE *fout, TGroup *myTGroup, Catalog *catalog);
 
 // tgroupTimes carries the times of the tgroups (initially, just the photometric nights)
@@ -647,11 +647,10 @@
   Catalog *catalog;
   Image *image;
-  FlatCorrectionTable *flatcorr;
   SetMgrpInfo info;
 } ThreadInfo;
 
-int   setMgrp_tgroup (TGroup *tgroup, off_t Nmos, Image *image, Catalog *catalog, SetMgrpInfo *info, FlatCorrectionTable *flatcorr);
+int   setMgrp_tgroup (TGroup *tgroup, off_t Nmos, Image *image, Catalog *catalog, SetMgrpInfo *info);
 void *setMgrp_worker (void *data);
-int   setMgrp_threaded (Catalog *catalog, FlatCorrectionTable *flatcorr);
+int   setMgrp_threaded (Catalog *catalog);
 
 void SetMgrpInfoInit (SetMgrpInfo *info, off_t Nmax, int allocLists) {
@@ -727,5 +726,5 @@
 }
 
-int setMgrp (Catalog *catalog, FlatCorrectionTable *flatcorr) {
+int setMgrp (Catalog *catalog) {
 
   off_t N;
@@ -738,5 +737,5 @@
   // so do not run setMgrp in threaded mode if PLOTSTUFF is set
   if (NTHREADS && !PLOTSTUFF) {
-    int status = setMgrp_threaded (catalog, flatcorr);
+    int status = setMgrp_threaded (catalog);
     return status;
   }
@@ -758,5 +757,5 @@
     TGroup *tgroup = tgroupTimes[i][0].byCode;
     for (off_t j = 0; j < tgroupTimes[i][0].nCode; j++) {
-      setMgrp_tgroup (&tgroup[j], i, image, catalog, &info, flatcorr);
+      setMgrp_tgroup (&tgroup[j], i, image, catalog, &info);
       // fprintf (stderr, "TGROUP time %.0f photcode %d Mcal: %f, dK: %f, dMcal: %f, sigma: %f, chisq: %f, %d of %d, limiting negative clouds to %f\n",
       // ohana_sec_to_mjd(tgroupTimes[i][0].start), tgroup[j].photcode, tgroup[j].McalPSF, tgroup[j].dKlam, tgroup[j].dMcal, tgroup[j].stdev, tgroup[j].McalChiSq, tgroup[j].nFitPhotom, tgroup[j].nValPhotom, CLOUD_TOLERANCE);
@@ -781,5 +780,5 @@
 
 // 'tgroup' is a pointer to the current tgroup of interest (entry Ngrp)
-int setMgrp_tgroup (TGroup *myTGroup, off_t Ngrp, Image *image, Catalog *catalog, SetMgrpInfo *info, FlatCorrectionTable *flatcorr) {
+int setMgrp_tgroup (TGroup *myTGroup, off_t Ngrp, Image *image, Catalog *catalog, SetMgrpInfo *info) {
 
   off_t j;
@@ -826,5 +825,5 @@
     fout = fopen (filename, "w");
     fprintf (fout, "# tgroup %s (%.0f)\n", ohana_sec_to_date(tgroup->start), mjdStart);
-    save_test_night_measures (fout, myTGroup, catalog, flatcorr);
+    save_test_night_measures (fout, myTGroup, catalog);
     fclose (fout);
   }
@@ -877,5 +876,5 @@
     // the flat-correction.  NOTE the sign of Mflat (Image.Mcal = Measure.Mcal - Mflat)
 
-    float Mflat = getMflat (m, c, flatcorr, catalog);
+    float Mflat = getMflat (m, c, catalog);
 
     off_t n = catalog[c].measureT[m].averef;
@@ -1000,5 +999,5 @@
 }
   
-int save_test_night_measures (FILE *fout, TGroup *myTGroup, Catalog *catalog, FlatCorrectionTable *flatcorr) {
+int save_test_night_measures (FILE *fout, TGroup *myTGroup, Catalog *catalog) {
 
   int Nsecfilt = GetPhotcodeNsecfilt ();
@@ -1015,5 +1014,5 @@
     float Mgrid    = getMgridTiny (&catalog[c].measureT[m]);                    // camera offset (deprecated?)
     float MrelPSF  = getMrel  (catalog, m, c, MAG_CLASS_PSF, MAG_SRC_CHP); // average magnitude
-    float Mflat    = getMflat (m, c, flatcorr, catalog); // flat-field correction
+    float Mflat    = getMflat (m, c, catalog); // flat-field correction
 
     off_t n = catalog[c].measureT[m].averef;
@@ -1037,5 +1036,5 @@
 }
 
-int setMgrp_threaded (Catalog *catalog, FlatCorrectionTable *flatcorr) {
+int setMgrp_threaded (Catalog *catalog) {
 
   int i;
@@ -1075,5 +1074,4 @@
     threadinfo[i].catalog  =  catalog;
     threadinfo[i].image    =    image;
-    threadinfo[i].flatcorr = flatcorr;
 
     // we do NOT allocate the arrays here, we only supply basic info used in the threads
@@ -1147,10 +1145,9 @@
 
     Catalog *catalog = threadinfo->catalog;
-    FlatCorrectionTable *flatcorr = threadinfo->flatcorr;
     Image *image = threadinfo->image;
 
     TGroup *tgroup = tgroupTimes[i][0].byCode;
     for (int j = 0; j < tgroupTimes[i][0].nCode; j++) {
-      setMgrp_tgroup (&tgroup[j], i, image, catalog, &results, flatcorr);
+      setMgrp_tgroup (&tgroup[j], i, image, catalog, &results);
       SetMgrpInfoAccum (&threadinfo->info, &results);
     }
@@ -1506,5 +1503,5 @@
 	float MrelPSF  = getMrel  (catalog, m, c, MAG_CLASS_PSF, MAG_SRC_CHP); // average magnitude
 	// float Mgrid    = getMgridTiny (&catalog[c].measureT[m]); // camera offset (deprecated?)
-	// float Mflat    = getMflat (m, c, flatcorr, catalog); // flat-field correction
+	// float Mflat    = getMflat (m, c, catalog); // flat-field correction
 
 	off_t n = catalog[c].measureT[m].averef;
Index: /branches/eam_branches/relphot.20210521/src/global_stats.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/global_stats.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/global_stats.c	(revision 41606)
@@ -1,5 +1,5 @@
 # include "relphot.h"
 
-void global_stats (Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr, int nloop) {
+void global_stats (Catalog *catalog, int Ncatalog, int nloop) {
 
   StatType stN, stX, stS, imN, imX, imM, imD, msM, msX, msN, msD, tgM, tgX, tgD;
@@ -33,5 +33,5 @@
     int seccode = photcodes[Ns][0].code;
 
-    stN = statsStarN (catalog, Ncatalog, Nsec, seccode, flatcorr);
+    stN = statsStarN (catalog, Ncatalog, Nsec, seccode);
     stX = statsStarX (catalog, Ncatalog, Nsec);
     stS = statsStarS (catalog, Ncatalog, Nsec);
@@ -43,10 +43,10 @@
   }
   
-  imN = statsImageN (catalog, flatcorr);
+  imN = statsImageN (catalog);
   imX = statsImageX (catalog);
   imM = statsImageM (catalog);
   imD = statsImagedM (catalog);
   
-  msN = statsMosaicN (catalog, flatcorr);
+  msN = statsMosaicN (catalog);
   msM = statsMosaicM (catalog);
   msD = statsMosaicdM (catalog);
@@ -58,10 +58,10 @@
   
   fprintf (stderr, "meas / image:   %7.0f  %7.0f  %7.0f  %7.0f  %7.0f  %6d\n",   imN.median, imN.mean, imN.sigma, imN.min, imN.max, imN.Nmeas);
-  fprintf (stderr, "Mcal image:     %7.4f  %7.4f  %7.4f  %7.4f  %7.4f  %6d\n",   imM.median, imM.mean, imM.sigma, imM.min, imM.max, imM.Nmeas);
+  fprintf (stderr, "Mcal  image:    %7.4f  %7.4f  %7.4f  %7.4f  %7.4f  %6d\n",   imM.median, imM.mean, imM.sigma, imM.min, imM.max, imM.Nmeas);
   fprintf (stderr, "dMcal image:    %7.4f  %7.4f  %7.4f  %7.4f  %7.4f  %6d\n",   imD.median, imD.mean, imD.sigma, imD.min, imD.max, imD.Nmeas);
   fprintf (stderr, "chisq image:    %7.1f  %7.1f  %7.1f  %7.1f  %7.1f  %6d\n",   imX.median, imX.mean, imX.sigma, imX.min, imX.max, imX.Nmeas);
 
   fprintf (stderr, "meas / mosaic:  %7.0f  %7.0f  %7.0f  %7.0f  %7.0f  %6d\n",   msN.median, msN.mean, msN.sigma, msN.min, msN.max, msN.Nmeas);
-  fprintf (stderr, "Mcal mosaic:    %7.4f  %7.4f  %7.4f  %7.4f  %7.4f  %6d\n",   msM.median, msM.mean, msM.sigma, msM.min, msM.max, msM.Nmeas);
+  fprintf (stderr, "Mcal  mosaic:   %7.4f  %7.4f  %7.4f  %7.4f  %7.4f  %6d\n",   msM.median, msM.mean, msM.sigma, msM.min, msM.max, msM.Nmeas);
   fprintf (stderr, "dMcal mosaic:   %7.4f  %7.4f  %7.4f  %7.4f  %7.4f  %6d\n",   msD.median, msD.mean, msD.sigma, msD.min, msD.max, msD.Nmeas);
   fprintf (stderr, "chisq mosaic:   %7.1f  %7.1f  %7.1f  %7.1f  %7.1f  %6d\n",   msX.median, msX.mean, msX.sigma, msX.min, msX.max, msX.Nmeas);
Index: /branches/eam_branches/relphot.20210521/src/plot_scatter.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/plot_scatter.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/plot_scatter.c	(revision 41606)
@@ -1,5 +1,5 @@
 # include "relphot.h"
    
-void plot_scatter (Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr) {
+void plot_scatter (Catalog *catalog, int Ncatalog) {
 
   off_t i, j, k, m, N, Ntot;
Index: /branches/eam_branches/relphot.20210521/src/reload_catalogs.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/reload_catalogs.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/reload_catalogs.c	(revision 41606)
@@ -9,5 +9,5 @@
     gettimeofday (&start, (void *) NULL);
 
-void reload_catalogs (SkyList *skylist, FlatCorrectionTable *flatcorr, int hostID, char *hostpath) {
+void reload_catalogs (SkyList *skylist, int hostID, char *hostpath) {
 
   int i;
@@ -100,5 +100,5 @@
 
     initMrel (&catalog, 1);
-    setMrelFinal (&catalog, flatcorr, FALSE);
+    setMrelFinal (&catalog, FALSE);
     TIMESTAMP(time5);
 
Index: /branches/eam_branches/relphot.20210521/src/relphot.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/relphot.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/relphot.c	(revision 41606)
@@ -72,5 +72,5 @@
 	exit (2);
       }
-      reload_catalogs (skylist, NULL, 0, NULL);
+      reload_catalogs (skylist, 0, NULL);
       relphot_free (sky, skylist);
       exit (0);
Index: /branches/eam_branches/relphot.20210521/src/relphot_client.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/relphot_client.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/relphot_client.c	(revision 41606)
@@ -80,7 +80,5 @@
       initImagesSubset (image, NULL, Nimage);
 
-      // load the flat-field correction table from CATDIR
-      FlatCorrectionTable *flatcorr = NULL;
-      reload_catalogs (skylist, flatcorr, HOST_ID, HOSTDIR);
+      reload_catalogs (skylist, HOST_ID, HOSTDIR);
       freeImages ((char *)image);
       free (image);
Index: /branches/eam_branches/relphot.20210521/src/relphot_images.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/relphot_images.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/relphot_images.c	(revision 41606)
@@ -45,6 +45,4 @@
   if (!UPDATE) dvo_image_unlock (&db); 
 
-  FlatCorrectionTable *flatcorr = NULL; // no longer used here 
-
   initGridBins (); // allocates the empty array of corrections (elements are build below)
 
@@ -80,5 +78,5 @@
     setExclusions (catalog, Ncatalog, TRUE);
 
-    global_stats (catalog, Ncatalog, flatcorr, 0);
+    global_stats (catalog, Ncatalog, 0);
 
     if (PLOTSTUFF) {
@@ -91,9 +89,9 @@
       SetZptIteration (i);
 
-      setMrel  (catalog, Ncatalog, flatcorr); // threaded
+      setMrel  (catalog, Ncatalog); // threaded
 
-      setMcal  (catalog, flatcorr);
-      setMmos  (catalog, flatcorr);
-      setMgrp  (catalog, flatcorr);
+      setMcal  (catalog);
+      setMmos  (catalog);
+      setMgrp  (catalog);
 
       setMgrid (catalog, Ncatalog);
@@ -101,5 +99,5 @@
     
       if (PLOTSTUFF) {
-	plot_scatter (catalog, Ncatalog, flatcorr); 
+	plot_scatter (catalog, Ncatalog); 
 	plot_mosaics ();
 	plot_images ();
@@ -108,5 +106,5 @@
       }
 
-      global_stats (catalog, Ncatalog, flatcorr, i);
+      global_stats (catalog, Ncatalog, i);
       SetZeroPointModes ();
 
@@ -116,5 +114,5 @@
 
     if (PLOTSTUFF) {
-      plot_scatter (catalog, Ncatalog, flatcorr); 
+      plot_scatter (catalog, Ncatalog); 
       plot_mosaics ();
       plot_images ();
@@ -162,5 +160,5 @@
      clients */
   if (!CALIBRATE_STACKS_AND_WARPS) {
-    reload_catalogs (skylist, flatcorr, 0, NULL);
+    reload_catalogs (skylist, 0, NULL);
     MARKTIME("-- updated all catalogs: %f sec\n", dtime);
   }
Index: /branches/eam_branches/relphot.20210521/src/relphot_objects.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/relphot_objects.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/relphot_objects.c	(revision 41606)
@@ -126,5 +126,5 @@
 
     initMrel (&catalog, 1);
-    setMrelFinal (&catalog, NULL, TRUE);
+    setMrelFinal (&catalog, TRUE);
 
     // uncomment for extra verbosity
Index: /branches/eam_branches/relphot.20210521/src/relphot_parallel_images.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/relphot_parallel_images.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/relphot_parallel_images.c	(revision 41606)
@@ -40,13 +40,4 @@
   initImages (image, NULL, Nimage);
 
-  // load the flat correction table (if defined)
-  // we no longer need to do this: the flatcorrection is now saved in measure.Mflat
-# if (0)
-  char flatcorrfile[256];
-  sprintf (flatcorrfile, "%s/flatcorr.fits", CATDIR);
-  FlatCorrectionTable *flatcorr = FlatCorrectionLoad (flatcorrfile, VERBOSE);
-# endif
-  FlatCorrectionTable *flatcorr = NULL;
-
   // UserPatch.Rmin,Rmax may have range from a few degrees < 0.0 to few degrees > 360.0.
   // the following function correctly chooses the sky regions on the 0,360 boundary
@@ -88,5 +79,5 @@
   setExclusions (catalog, Ncatalog, TRUE);
 
-  global_stats (catalog, Ncatalog, flatcorr, 0);
+  global_stats (catalog, Ncatalog, 0);
 
   if (PLOTSTUFF) {
@@ -101,5 +92,5 @@
 
     // set the mean stellar mags given the measurements and the image calibrations
-    setMrel  (catalog, Ncatalog, flatcorr);
+    setMrel  (catalog, Ncatalog);
 
     // share mean mags for objects at the boundary (number of unowned meas > 0)
@@ -112,7 +103,7 @@
 
     // set the image (Mcal) and mosaic (Mmos) zero point offsets given the mean mags and measurements
-    setMcal  (catalog, flatcorr);
-    setMmos  (catalog, flatcorr);
-    // setMgrp  (catalog, FALSE, flatcorr); XXX think this through: this may not make sense for tgroups
+    setMcal  (catalog);
+    setMmos  (catalog);
+    // setMgrp  (catalog, FALSE); XXX think this through: this may not make sense for tgroups
     MARKTIME("-- set Mrel, Mcal, Mmos, Mgrid : %f sec\n", dtime);
     
@@ -124,5 +115,5 @@
     client_logger_message ("slurped image data : loop %d \n", i);
 
-    global_stats (catalog, Ncatalog, flatcorr, i);
+    global_stats (catalog, Ncatalog, i);
 
     SetZeroPointModes ();
Index: /branches/eam_branches/relphot.20210521/src/relphot_parallel_regions.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/relphot_parallel_regions.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/relphot_parallel_regions.c	(revision 41606)
@@ -14,12 +14,4 @@
     exit (2);
   }
-
-  // load the flat correction table (if defined)
-# if (0)
-  char flatcorrfile[256];
-  sprintf (flatcorrfile, "%s/flatcorr.fits", CATDIR);
-  FlatCorrectionTable *flatcorr = FlatCorrectionLoad (flatcorrfile, VERBOSE);
-# endif
-  FlatCorrectionTable *flatcorr = NULL;
 
   // register database handle with shutdown procedure
@@ -81,5 +73,5 @@
 
   /* update catalogs (in parallel) */
-  reload_catalogs (skylist, flatcorr, 0, NULL);
+  reload_catalogs (skylist, 0, NULL);
 
   // save the changes to the image parameters
Index: /branches/eam_branches/relphot.20210521/src/setMrelCatalog.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/setMrelCatalog.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/setMrelCatalog.c	(revision 41606)
@@ -60,5 +60,5 @@
 int useOLS = TRUE; // chosen based on iteration below
 
-int setMrel_catalog_alt (Catalog *catalog, int Nc, int isSetMrelFinal, FlatCorrectionTable *flatcorr, SetMrelInfo *results, int Nsecfilt) {
+int setMrel_catalog_alt (Catalog *catalog, int Nc, int isSetMrelFinal, SetMrelInfo *results, int Nsecfilt) {
 
   off_t j;
@@ -75,15 +75,15 @@
 
     if (STAGES & STAGE_CHIP) {
-      setMrelAverageExposure (&catalog[Nc], Nc, j, Nsecfilt, isSetMrelFinal, flatcorr, results);
+      setMrelAverageExposure (&catalog[Nc], Nc, j, Nsecfilt, isSetMrelFinal, results);
     }
 
     // only apply Stack operation on setMrelFinal in first pass 
     if (isSetMrelFinal && (STAGES & STAGE_STACK) && !IS_DIFF_DB) {
-      setMrelAverageStack (&catalog[Nc], Nc, j, Nsecfilt, flatcorr);
+      setMrelAverageStack (&catalog[Nc], Nc, j, Nsecfilt);
     }
 
     // only measure force-warp mean values if issetMrelFinal (make it optional?)
     if (isSetMrelFinal && (STAGES & STAGE_WARP)) {
-      setMrelAverageForcedWarp (&catalog[Nc], Nc, j, Nsecfilt, flatcorr, results);
+      setMrelAverageForcedWarp (&catalog[Nc], Nc, j, Nsecfilt, results);
     }
   }
@@ -113,5 +113,5 @@
 
 // set mean of chip measurements (selected by photcode range for now):
-int setMrelAverageExposure (Catalog *catalog, int cat, off_t ave, int Nsecfilt, int isSetMrelFinal, FlatCorrectionTable *flatcorr, SetMrelInfo *results) {
+int setMrelAverageExposure (Catalog *catalog, int cat, off_t ave, int Nsecfilt, int isSetMrelFinal, SetMrelInfo *results) {
 
   int Nsec;
@@ -270,5 +270,5 @@
 
     // XXX I am not convinced the sign on Mflat here is correct
-    float Moff =  Mflat + Mcal + Mmos + Mgrp + Mgrid;
+    float Moff =  Mcal + Mmos + Mgrp + Mgrid - Mflat;
 
     if (isSetMrelFinal) {
@@ -552,5 +552,5 @@
 // measure->McalAPER to image->McalPSF for chips and warps, but not stacks
 
-int setMrelAverageStack (Catalog *catalog, int cat, off_t ave, int Nsecfilt, FlatCorrectionTable *flatcorr) {
+int setMrelAverageStack (Catalog *catalog, int cat, off_t ave, int Nsecfilt) {
 
   // we are guaranteed to have average, measure, secfilt
@@ -884,6 +884,5 @@
 // chips and warps, but not stacks
 
-int setMrelAverageForcedWarp (Catalog *catalog, int cat, off_t ave, int Nsecfilt, FlatCorrectionTable *flatcorr, SetMrelInfo *results) {
-  OHANA_UNUSED_PARAM(flatcorr);
+int setMrelAverageForcedWarp (Catalog *catalog, int cat, off_t ave, int Nsecfilt, SetMrelInfo *results) {
 
   // we are guaranteed to have average, measure, secfilt
Index: /branches/eam_branches/relphot.20210521/src/setMrelFinal.c
===================================================================
--- /branches/eam_branches/relphot.20210521/src/setMrelFinal.c	(revision 41605)
+++ /branches/eam_branches/relphot.20210521/src/setMrelFinal.c	(revision 41606)
@@ -5,5 +5,5 @@
 // output dbFlags values
 
-void setMrelFinal (Catalog *catalog, FlatCorrectionTable *flatcorr, int simpleAverage) {
+void setMrelFinal (Catalog *catalog, int simpleAverage) {
 
   off_t i;
@@ -103,10 +103,10 @@
   // XXX make this optional? (do not clean for -averages?)
   // XXX : for the moment, disable clean_measures
-  if (!simpleAverage && FALSE) clean_measures (catalog, 1, TRUE, flatcorr);    /* mark outliers ID_MEAS_POOR_PHOTOM */
+  if (!simpleAverage && FALSE) clean_measures (catalog, 1, TRUE);    /* mark outliers ID_MEAS_POOR_PHOTOM */
 
   ALLOCATE (catalog[0].measureRank, char, catalog[0].Nmeasure);
   setMeasureRank (catalog);
-  setMrelOutput (catalog, 1, flatcorr); // sets the values secfilt.MpsfChp = <measure.M + measure.Mflat - image.Mcal>
-  setMcalOutput (catalog, 1, flatcorr); // sets measure.Mcal = image.Mcal
+  setMrelOutput (catalog, 1); // sets the values secfilt.MpsfChp = <measure.M + measure.Mflat - image.Mcal>
+  setMcalOutput (catalog, 1); // sets measure.Mcal = image.Mcal
 
   /* clear ID_OBJ_POOR, ID_OBJ_FEW values before writing ??? */
@@ -163,5 +163,5 @@
 int print_measure_set (Average *average, SecFilt *secfilt, Measure *measure);
 
-void skip_measurements (Catalog *catalog, int pass, FlatCorrectionTable *flatcorr) {
+void skip_measurements (Catalog *catalog, int pass) {
 
   off_t i, k, m;
