IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 38530


Ignore:
Timestamp:
Jun 24, 2015, 8:48:47 AM (11 years ago)
Author:
eugene
Message:

updated all ReadStarsFITS convert functions to emit a catalog

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20150616/Ohana/src/addstar/src/ReadStarsFITS.c

    r38525 r38530  
    6969
    7070  Catalog *catalog = NULL;
    71 # if (0)
    7271  if (!strcmp (type, "SMPDATA")) {
    73     stars = Convert_SMPDATA (&table, &Nstars);
     72    catalog = Convert_SMPDATA (&table);
    7473  }
    7574  if (!strcmp (type, "PS1_DEV_0")) {
    76     stars = Convert_PS1_DEV_0 (&table, &Nstars);
     75    catalog = Convert_PS1_DEV_0 (&table);
    7776  }
    7877  if (!strcmp (type, "PS1_DEV_1")) {
    79     stars = Convert_PS1_DEV_1 (&table, &Nstars);
     78    catalog = Convert_PS1_DEV_1 (&table);
    8079  }
    8180  if (!strcmp (type, "PS1_V1")) {
    82     stars = Convert_PS1_V1 (&table, &Nstars);
     81    catalog = Convert_PS1_V1 (&table);
    8382  }
    8483  if (!strcmp (type, "PS1_V2")) {
     
    8786      return (NULL);
    8887    }
    89     stars = Convert_PS1_V2 (&table, &Nstars);
     88    catalog = Convert_PS1_V2 (&table);
    9089  }
    9190  if (!strcmp (type, "PS1_V3")) {
    92     stars = Convert_PS1_V3 (&table, &Nstars);
     91    catalog = Convert_PS1_V3 (&table);
    9392  }
    9493  if (!strcmp (type, "PS1_V4")) {
    95     stars = Convert_PS1_V4 (&table, &Nstars);
    96   }
    97 # endif
     94    catalog = Convert_PS1_V4 (&table);
     95  }
    9896  if (!strcmp (type, "PS1_V5")) {
    9997    switch (table.header[0].Naxis[0]) {
    10098      case 232:
    101         catalog = Convert_PS1_V5 (&table);
    102         break;
    103 # if (0)
     99        catalog = Convert_PS1_V5 (&table);
     100        break;
    104101      case 312:
    105         stars = Convert_PS1_V5_R0_Lensing (&table, &Nstars);
    106         break;
     102        catalog = Convert_PS1_V5_R0_Lensing (&table);
     103        break;
    107104      case 320:
    108         stars = Convert_PS1_V5_R1_Lensing (&table, &Nstars);
    109         break;
     105        catalog = Convert_PS1_V5_R1_Lensing (&table);
     106        break;
    110107      case 328:
    111         stars = Convert_PS1_V5_R2_Lensing (&table, &Nstars);
    112         break;
    113 # endif
     108        catalog = Convert_PS1_V5_R2_Lensing (&table);
     109        break;
    114110      default:
    115         fprintf (stderr, "invalid PS1_V5 table size %d\n", (int) table.header[0].Naxis[0]);
    116         return NULL;
    117     }
    118   }
    119 # if (0)
     111        fprintf (stderr, "invalid PS1_V5 table size %d\n", (int) table.header[0].Naxis[0]);
     112        return NULL;
     113    }
     114  }
    120115  if (!strcmp (type, "PS1_SV1")) {
    121     stars = Convert_PS1_SV1 (&table, &Nstars);
     116    catalog = Convert_PS1_SV1 (&table);
    122117  }
    123118  if (!strcmp (type, "PS1_SV2")) {
    124     stars = Convert_PS1_SV2 (&table, &Nstars);
     119    catalog = Convert_PS1_SV2 (&table);
    125120  }
    126121  if (!strcmp (type, "PS1_SV3")) {
    127     stars = Convert_PS1_SV3 (&table, &Nstars);
     122    catalog = Convert_PS1_SV3 (&table);
    128123  }
    129124  if (!strcmp (type, "PS1_SV4")) {
    130     stars = Convert_PS1_SV4 (&table, &Nstars);
     125    catalog = Convert_PS1_SV4 (&table);
    131126  }
    132127  if (!strcmp (type, "PS1_DV3")) {
    133     stars = Convert_PS1_DV3 (&table, &Nstars);
     128    catalog = Convert_PS1_DV3 (&table);
    134129  }
    135130  if (!strcmp (type, "PS1_DV4")) {
    136     stars = Convert_PS1_DV4 (&table, &Nstars);
     131    catalog = Convert_PS1_DV4 (&table);
    137132  }
    138133  if (!strcmp (type, "PS1_DV5")) {
    139     stars = Convert_PS1_DV5 (&table, &Nstars);
    140   }
    141 # endif
     134    catalog = Convert_PS1_DV5 (&table);
     135  }
    142136  if (catalog == NULL) {
    143137    fprintf (stderr, "invalid table type %s\n", type);
     
    166160}
    167161
    168 # if (0)
    169 
    170 Stars *Convert_SMPDATA (FTable *table, unsigned int *nstars) {
     162Catalog *Convert_SMPDATA (FTable *table) {
    171163
    172164  off_t Nstars;
    173165  unsigned int i;
    174166  double ZeroPt;
    175   Stars *stars = NULL;
    176167  SMPData *smpdata = NULL;
    177168
     
    183174  ZeroPt = GetZeroPoint();
    184175
    185   ALLOCATE (stars, Stars, Nstars);
    186   for (i = 0; i < Nstars; i++) {
    187     InitStar (&stars[i]);
    188 
    189     stars[i].measure.Xccd       = smpdata[i].X;
    190     stars[i].measure.Yccd       = smpdata[i].Y;
    191     stars[i].measure.dXccd      = NAN_S_SHORT; // not provided by SMPDATA:
    192     stars[i].measure.dYccd      = NAN_S_SHORT; // not provided by SMPDATA:
     176  Catalog *catalog = addstar_catalog_init (Nstars);
     177
     178  for (i = 0; i < Nstars; i++) {
     179    catalog->measure[i].Xccd       = smpdata[i].X;
     180    catalog->measure[i].Yccd       = smpdata[i].Y;
     181    catalog->measure[i].dXccd      = NAN_S_SHORT; // not provided by SMPDATA:
     182    catalog->measure[i].dYccd      = NAN_S_SHORT; // not provided by SMPDATA:
    193183   
    194     stars[i].measure.posangle   = NAN_S_SHORT; // not provided by SMPDATA:
    195     stars[i].measure.pltscale   = NAN;         // not provided by SMPDATA:
     184    catalog->measure[i].posangle   = NAN_S_SHORT; // not provided by SMPDATA:
     185    catalog->measure[i].pltscale   = NAN;         // not provided by SMPDATA:
    196186
    197187    if ((smpdata[i].M >= ZeroPt) || isnan(smpdata[i].M)) {
    198       stars[i].measure.M        = NAN;
    199       stars[i].measure.Map      = NAN;
    200       stars[i].measure.FluxPSF  = NAN;
    201       stars[i].measure.dFluxPSF = NAN;
    202     } else {
    203       stars[i].measure.M        = smpdata[i].M;
    204       stars[i].measure.Map      = smpdata[i].M;
    205       stars[i].measure.FluxPSF  = pow(10.0, -0.4*smpdata[i].M);
    206       stars[i].measure.dFluxPSF = stars[i].measure.FluxPSF * smpdata[i].dM;
    207     }
    208     stars[i].measure.dM         = smpdata[i].dM*0.001;
    209     stars[i].measure.dMcal      = NAN; // not provided by SMPDATA:
    210 
    211     stars[i].measure.Mkron      = NAN; // not provided by SMPDATA:
    212     stars[i].measure.dMkron     = NAN; // not provided by SMPDATA:
    213     stars[i].measure.FluxKron   = NAN; // not provided by SMPDATA:
    214     stars[i].measure.dFluxKron  = NAN; // not provided by SMPDATA:
    215 
    216     stars[i].measure.Sky        = NAN; // not provided by SMPDATA:
    217     stars[i].measure.dSky       = NAN; // not provided by SMPDATA:
    218 
    219     stars[i].measure.psfChisq   = NAN;       // not provided by SMPDATA:
    220     stars[i].measure.psfQF      = NAN;       // not provided by SMPDATA:
    221     stars[i].measure.psfNdof    = NAN_S_INT; // not provided by SMPDATA:
    222     stars[i].measure.psfNpix    = NAN_S_INT; // not provided by SMPDATA:
    223     stars[i].measure.extNsigma  = NAN;       // not provided by SMPDATA:
    224 
    225     stars[i].measure.FWx        = ToShortPixels (smpdata[i].fx);
    226     stars[i].measure.FWy        = ToShortPixels (smpdata[i].fy);
    227     stars[i].measure.theta      = ToShortDegrees (smpdata[i].df);
    228 
    229     stars[i].measure.Mxx        = NAN_S_SHORT; // not provided by SMPDATA:
    230     stars[i].measure.Mxy        = NAN_S_SHORT; // not provided by SMPDATA:
    231     stars[i].measure.Myy        = NAN_S_SHORT; // not provided by SMPDATA:
     188      catalog->measure[i].M        = NAN;
     189      catalog->measure[i].Map      = NAN;
     190      catalog->measure[i].FluxPSF  = NAN;
     191      catalog->measure[i].dFluxPSF = NAN;
     192    } else {
     193      catalog->measure[i].M        = smpdata[i].M;
     194      catalog->measure[i].Map      = smpdata[i].M;
     195      catalog->measure[i].FluxPSF  = pow(10.0, -0.4*smpdata[i].M);
     196      catalog->measure[i].dFluxPSF = catalog->measure[i].FluxPSF * smpdata[i].dM;
     197    }
     198    catalog->measure[i].dM         = smpdata[i].dM*0.001;
     199    catalog->measure[i].dMcal      = NAN; // not provided by SMPDATA:
     200
     201    catalog->measure[i].Mkron      = NAN; // not provided by SMPDATA:
     202    catalog->measure[i].dMkron     = NAN; // not provided by SMPDATA:
     203    catalog->measure[i].FluxKron   = NAN; // not provided by SMPDATA:
     204    catalog->measure[i].dFluxKron  = NAN; // not provided by SMPDATA:
     205
     206    catalog->measure[i].Sky        = NAN; // not provided by SMPDATA:
     207    catalog->measure[i].dSky       = NAN; // not provided by SMPDATA:
     208
     209    catalog->measure[i].psfChisq   = NAN;       // not provided by SMPDATA:
     210    catalog->measure[i].psfQF      = NAN;       // not provided by SMPDATA:
     211    catalog->measure[i].psfNdof    = NAN_S_INT; // not provided by SMPDATA:
     212    catalog->measure[i].psfNpix    = NAN_S_INT; // not provided by SMPDATA:
     213    catalog->measure[i].extNsigma  = NAN;       // not provided by SMPDATA:
     214
     215    catalog->measure[i].FWx        = ToShortPixels (smpdata[i].fx);
     216    catalog->measure[i].FWy        = ToShortPixels (smpdata[i].fy);
     217    catalog->measure[i].theta      = ToShortDegrees (smpdata[i].df);
     218
     219    catalog->measure[i].Mxx        = NAN_S_SHORT; // not provided by SMPDATA:
     220    catalog->measure[i].Mxy        = NAN_S_SHORT; // not provided by SMPDATA:
     221    catalog->measure[i].Myy        = NAN_S_SHORT; // not provided by SMPDATA:
    232222                       
    233223    // the dophot type information gets pushed into the upper 2 bytes of photFlags
    234     stars[i].measure.photFlags  = (smpdata[i].dophot << 16);
    235   }   
    236   *nstars = Nstars;
    237   return (stars);
    238 }
    239 
    240 Stars *Convert_PS1_DEV_0 (FTable *table, unsigned int *nstars) {
     224    catalog->measure[i].photFlags  = (smpdata[i].dophot << 16);
     225  }   
     226  return catalog;
     227}
     228
     229Catalog *Convert_PS1_DEV_0 (FTable *table) {
    241230
    242231  off_t Nstars;
    243232  unsigned int i;
    244233  double ZeroPt;
    245   Stars *stars;
    246234  PS1_DEV_0 *ps1data;
    247235
     
    253241  ZeroPt = GetZeroPoint();
    254242
    255   ALLOCATE (stars, Stars, Nstars);
    256   for (i = 0; i < Nstars; i++) {
    257     InitStar (&stars[i]);
    258     stars[i].measure.Xccd       = ps1data[i].X;
    259     stars[i].measure.Yccd       = ps1data[i].Y;
    260     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    261     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
     243  Catalog *catalog = addstar_catalog_init (Nstars);
     244
     245  for (i = 0; i < Nstars; i++) {
     246    catalog->measure[i].Xccd       = ps1data[i].X;
     247    catalog->measure[i].Yccd       = ps1data[i].Y;
     248    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     249    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
    262250   
    263     stars[i].measure.posangle   = NAN_S_SHORT; // not provided by PS1_DEV_0:
    264     stars[i].measure.pltscale   = NAN;         // not provided by PS1_DEV_0:
     251    catalog->measure[i].posangle   = NAN_S_SHORT; // not provided by PS1_DEV_0:
     252    catalog->measure[i].pltscale   = NAN;         // not provided by PS1_DEV_0:
    265253
    266254    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    267       stars[i].measure.M        = NAN;
    268       stars[i].measure.FluxPSF  = NAN;
    269       stars[i].measure.dFluxPSF = NAN;
    270     } else {
    271       stars[i].measure.M        = ps1data[i].M + ZeroPt;
    272       stars[i].measure.FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
    273       stars[i].measure.dFluxPSF = stars[i].measure.FluxPSF * ps1data[i].dM;
    274     }
    275     stars[i].measure.dM         = ps1data[i].dM;
    276     stars[i].measure.dMcal      = NAN; // not provided by PS1_DEV_0:
    277     stars[i].measure.Map        = NAN; // not provided by PS1_DEV_0:
    278 
    279     stars[i].measure.Mkron      = NAN; // not provided by PS1_DEV_0:
    280     stars[i].measure.dMkron     = NAN; // not provided by PS1_DEV_0:
    281     stars[i].measure.FluxKron   = NAN; // not provided by PS1_DEV_0:
    282     stars[i].measure.dFluxKron  = NAN; // not provided by PS1_DEV_0:
    283 
    284     stars[i].measure.Sky        = ps1data[i].sky;
    285     stars[i].measure.dSky       = ps1data[i].dSky;
    286 
    287     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    288     stars[i].measure.psfQF      = ps1data[i].psfQF;
    289     stars[i].measure.psfNdof    = NAN_S_INT; // not provided by PS1_DEV_0:
    290     stars[i].measure.psfNpix    = NAN_S_INT; // not provided by PS1_DEV_0:
    291     stars[i].measure.extNsigma  = NAN;        // not provided by PS1_DEV_0:
    292 
    293     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    294     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    295     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    296 
    297     stars[i].measure.Mxx        = NAN_S_SHORT; // not provided by PS1_DEV_0:
    298     stars[i].measure.Mxy        = NAN_S_SHORT; // not provided by PS1_DEV_0:
    299     stars[i].measure.Myy        = NAN_S_SHORT; // not provided by PS1_DEV_0:
    300                        
    301     stars[i].measure.photFlags  = 0; // not provided by PS1_DEV_0:
    302 
    303     stars[i].measure.detID      = ps1data[i].detID;
    304   }   
    305   *nstars = Nstars;
    306   return (stars);
     255      catalog->measure[i].M        = NAN;
     256      catalog->measure[i].FluxPSF  = NAN;
     257      catalog->measure[i].dFluxPSF = NAN;
     258    } else {
     259      catalog->measure[i].M        = ps1data[i].M + ZeroPt;
     260      catalog->measure[i].FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
     261      catalog->measure[i].dFluxPSF = catalog->measure[i].FluxPSF * ps1data[i].dM;
     262    }
     263    catalog->measure[i].dM         = ps1data[i].dM;
     264    catalog->measure[i].dMcal      = NAN; // not provided by PS1_DEV_0:
     265    catalog->measure[i].Map        = NAN; // not provided by PS1_DEV_0:
     266
     267    catalog->measure[i].Mkron      = NAN; // not provided by PS1_DEV_0:
     268    catalog->measure[i].dMkron     = NAN; // not provided by PS1_DEV_0:
     269    catalog->measure[i].FluxKron   = NAN; // not provided by PS1_DEV_0:
     270    catalog->measure[i].dFluxKron  = NAN; // not provided by PS1_DEV_0:
     271
     272    catalog->measure[i].Sky        = ps1data[i].sky;
     273    catalog->measure[i].dSky       = ps1data[i].dSky;
     274
     275    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     276    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     277    catalog->measure[i].psfNdof    = NAN_S_INT; // not provided by PS1_DEV_0:
     278    catalog->measure[i].psfNpix    = NAN_S_INT; // not provided by PS1_DEV_0:
     279    catalog->measure[i].extNsigma  = NAN;        // not provided by PS1_DEV_0:
     280
     281    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     282    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     283    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     284
     285    catalog->measure[i].Mxx        = NAN_S_SHORT; // not provided by PS1_DEV_0:
     286    catalog->measure[i].Mxy        = NAN_S_SHORT; // not provided by PS1_DEV_0:
     287    catalog->measure[i].Myy        = NAN_S_SHORT; // not provided by PS1_DEV_0:
     288                       
     289    catalog->measure[i].photFlags  = 0; // not provided by PS1_DEV_0:
     290
     291    catalog->measure[i].detID      = ps1data[i].detID;
     292  }   
     293  return catalog;
    307294}
    308295
    309296// XXX I need to make the IPP I/O functions and these functions
    310297// consistent wrt ZERO_POINT....
    311 Stars *Convert_PS1_DEV_1 (FTable *table, unsigned int *nstars) {
     298Catalog *Convert_PS1_DEV_1 (FTable *table) {
    312299
    313300  off_t Nstars;
    314301  unsigned int i;
    315302  double ZeroPt;
    316   Stars *stars;
    317303  PS1_DEV_1 *ps1data;
    318304
     
    324310  ZeroPt = GetZeroPoint();
    325311
    326   ALLOCATE (stars, Stars, Nstars);
    327   for (i = 0; i < Nstars; i++) {
    328     InitStar (&stars[i]);
    329     stars[i].measure.Xccd       = ps1data[i].X;
    330     stars[i].measure.Yccd       = ps1data[i].Y;
    331     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    332     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    333 
    334     stars[i].measure.posangle   = NAN_S_SHORT; // not provided by PS1_DEV_1:
    335     stars[i].measure.pltscale   = NAN;         // not provided by PS1_DEV_1:
     312  Catalog *catalog = addstar_catalog_init (Nstars);
     313
     314  for (i = 0; i < Nstars; i++) {
     315    catalog->measure[i].Xccd       = ps1data[i].X;
     316    catalog->measure[i].Yccd       = ps1data[i].Y;
     317    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     318    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     319
     320    catalog->measure[i].posangle   = NAN_S_SHORT; // not provided by PS1_DEV_1:
     321    catalog->measure[i].pltscale   = NAN;         // not provided by PS1_DEV_1:
    336322
    337323    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    338       stars[i].measure.M      = NAN;
    339       stars[i].measure.FluxPSF  = NAN;
    340       stars[i].measure.dFluxPSF = NAN;
    341     } else {
    342       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    343       stars[i].measure.FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
    344       stars[i].measure.dFluxPSF = stars[i].measure.FluxPSF * ps1data[i].dM;
    345     }
    346     stars[i].measure.dM         = ps1data[i].dM;
    347     stars[i].measure.dMcal      = NAN; // not provided by PS1_DEV_1:
    348     stars[i].measure.Map        = NAN; // not provided by PS1_DEV_1:
    349 
    350     stars[i].measure.Mkron      = NAN; // not provided by PS1_DEV_1:
    351     stars[i].measure.dMkron     = NAN; // not provided by PS1_DEV_1:
    352     stars[i].measure.FluxKron   = NAN; // not provided by PS1_DEV_1:
    353     stars[i].measure.dFluxKron  = NAN; // not provided by PS1_DEV_1:
    354 
    355     stars[i].measure.Sky        = ps1data[i].sky;
    356     stars[i].measure.dSky       = ps1data[i].dSky;
    357 
    358     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    359     stars[i].measure.psfQF      = ps1data[i].psfQF;
    360     stars[i].measure.psfNdof    = NAN_S_INT; // not provided by PS1_DEV_1:
    361     stars[i].measure.psfNpix    = NAN_S_INT; // not provided by PS1_DEV_1:
    362     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    363 
    364     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    365     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    366     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    367 
    368     stars[i].measure.Mxx        = NAN_S_SHORT; // not provided by PS1_DEV_1:
    369     stars[i].measure.Mxy        = NAN_S_SHORT; // not provided by PS1_DEV_1:
    370     stars[i].measure.Myy        = NAN_S_SHORT; // not provided by PS1_DEV_1:
    371                        
    372     stars[i].measure.photFlags  = ps1data[i].flags;
    373 
    374     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    375     stars[i].measure.detID      = ps1data[i].detID;
    376   }   
    377   *nstars = Nstars;
    378   return (stars);
    379 }
    380 
    381 Stars *Convert_PS1_V1 (FTable *table, unsigned int *nstars) {
     324      catalog->measure[i].M      = NAN;
     325      catalog->measure[i].FluxPSF  = NAN;
     326      catalog->measure[i].dFluxPSF = NAN;
     327    } else {
     328      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     329      catalog->measure[i].FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
     330      catalog->measure[i].dFluxPSF = catalog->measure[i].FluxPSF * ps1data[i].dM;
     331    }
     332    catalog->measure[i].dM         = ps1data[i].dM;
     333    catalog->measure[i].dMcal      = NAN; // not provided by PS1_DEV_1:
     334    catalog->measure[i].Map        = NAN; // not provided by PS1_DEV_1:
     335
     336    catalog->measure[i].Mkron      = NAN; // not provided by PS1_DEV_1:
     337    catalog->measure[i].dMkron     = NAN; // not provided by PS1_DEV_1:
     338    catalog->measure[i].FluxKron   = NAN; // not provided by PS1_DEV_1:
     339    catalog->measure[i].dFluxKron  = NAN; // not provided by PS1_DEV_1:
     340
     341    catalog->measure[i].Sky        = ps1data[i].sky;
     342    catalog->measure[i].dSky       = ps1data[i].dSky;
     343
     344    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     345    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     346    catalog->measure[i].psfNdof    = NAN_S_INT; // not provided by PS1_DEV_1:
     347    catalog->measure[i].psfNpix    = NAN_S_INT; // not provided by PS1_DEV_1:
     348    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     349
     350    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     351    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     352    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     353
     354    catalog->measure[i].Mxx        = NAN_S_SHORT; // not provided by PS1_DEV_1:
     355    catalog->measure[i].Mxy        = NAN_S_SHORT; // not provided by PS1_DEV_1:
     356    catalog->measure[i].Myy        = NAN_S_SHORT; // not provided by PS1_DEV_1:
     357                       
     358    catalog->measure[i].photFlags  = ps1data[i].flags;
     359
     360    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     361    catalog->measure[i].detID      = ps1data[i].detID;
     362  }   
     363  return catalog;
     364}
     365
     366Catalog *Convert_PS1_V1 (FTable *table) {
    382367
    383368  off_t Nstars;
    384369  unsigned int i;
    385370  double ZeroPt;
    386   Stars *stars;
    387371  CMF_PS1_V1 *ps1data;
    388372
     
    396380
    397381  if (table[0].header[0].Naxis[0] == 136) {
    398     stars = Convert_PS1_V1_Alt (table, nstars);
    399     return (stars);
     382    Catalog *catalog = Convert_PS1_V1_Alt (table);
     383    return catalog;
    400384  }
    401385
     
    407391  ZeroPt = GetZeroPoint();
    408392
    409   ALLOCATE (stars, Stars, Nstars);
    410   for (i = 0; i < Nstars; i++) {
    411     InitStar (&stars[i]);
    412     stars[i].measure.Xccd       = ps1data[i].X;
    413     stars[i].measure.Yccd       = ps1data[i].Y;
    414     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    415     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    416 
    417     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    418     stars[i].measure.pltscale   = ps1data[i].pltscale;
     393  Catalog *catalog = addstar_catalog_init (Nstars);
     394
     395  for (i = 0; i < Nstars; i++) {
     396    catalog->measure[i].Xccd       = ps1data[i].X;
     397    catalog->measure[i].Yccd       = ps1data[i].Y;
     398    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     399    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     400
     401    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     402    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    419403
    420404    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    421       stars[i].measure.M      = NAN;
    422       stars[i].measure.FluxPSF  = NAN;
    423       stars[i].measure.dFluxPSF = NAN;
    424     } else {
    425       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    426       stars[i].measure.FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
    427       stars[i].measure.dFluxPSF = stars[i].measure.FluxPSF * ps1data[i].dM;
    428     }
    429     stars[i].measure.dM         = ps1data[i].dM;
    430     stars[i].measure.dMcal      = ps1data[i].dMcal;
    431     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    432     stars[i].measure.dMap       = ps1data[i].dM; // a proxy measure
    433                        
    434     stars[i].measure.Mkron      = NAN; // not provided by PS1_V1:
    435     stars[i].measure.dMkron     = NAN; // not provided by PS1_V1:
    436     stars[i].measure.FluxKron   = NAN; // not provided by PS1_V1:
    437     stars[i].measure.dFluxKron  = NAN; // not provided by PS1_V1:
    438 
    439     stars[i].measure.Sky        = ps1data[i].sky;
    440     stars[i].measure.dSky       = ps1data[i].dSky;
    441                        
    442     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    443     stars[i].measure.psfQF      = ps1data[i].psfQF;
    444     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    445     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    446     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    447 
    448     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    449     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    450     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    451 
    452     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    453     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    454     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    455                        
    456     stars[i].measure.photFlags  = ps1data[i].flags;
    457 
    458     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    459     stars[i].measure.detID      = ps1data[i].detID;
     405      catalog->measure[i].M      = NAN;
     406      catalog->measure[i].FluxPSF  = NAN;
     407      catalog->measure[i].dFluxPSF = NAN;
     408    } else {
     409      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     410      catalog->measure[i].FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
     411      catalog->measure[i].dFluxPSF = catalog->measure[i].FluxPSF * ps1data[i].dM;
     412    }
     413    catalog->measure[i].dM         = ps1data[i].dM;
     414    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     415    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     416    catalog->measure[i].dMap       = ps1data[i].dM; // a proxy measure
     417                       
     418    catalog->measure[i].Mkron      = NAN; // not provided by PS1_V1:
     419    catalog->measure[i].dMkron     = NAN; // not provided by PS1_V1:
     420    catalog->measure[i].FluxKron   = NAN; // not provided by PS1_V1:
     421    catalog->measure[i].dFluxKron  = NAN; // not provided by PS1_V1:
     422
     423    catalog->measure[i].Sky        = ps1data[i].sky;
     424    catalog->measure[i].dSky       = ps1data[i].dSky;
     425                       
     426    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     427    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     428    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     429    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     430    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     431
     432    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     433    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     434    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     435
     436    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     437    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     438    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     439                       
     440    catalog->measure[i].photFlags  = ps1data[i].flags;
     441
     442    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     443    catalog->measure[i].detID      = ps1data[i].detID;
    460444
    461445    // the Average fields and the following Measure fields are set in FilterStars after
     
    465449    // the following fields are currently not being set anywhere: t_msec
    466450  }   
    467   *nstars = Nstars;
    468   return (stars);
    469 }
    470 
    471 Stars *Convert_PS1_V1_Alt (FTable *table, unsigned int *nstars) {
     451  return catalog;
     452}
     453
     454Catalog *Convert_PS1_V1_Alt (FTable *table) {
    472455
    473456  off_t Nstars;
    474457  unsigned int i;
    475458  double ZeroPt;
    476   Stars *stars;
    477459  CMF_PS1_V2 *ps1data;
    478460
     
    485467  // call a special conversion function if it is found.
    486468
    487   ps1data = gfits_table_get_CMF_PS1_V1_Alt (table, &Nstars, NULL);
     469  ps1data = gfits_table_get_CMF_PS1_V1_Alt (table, &Nstars, NULL); 
    488470  if (!ps1data) {
    489471    fprintf (stderr, "skipping inconsistent entry\n");
     
    492474  ZeroPt = GetZeroPoint();
    493475
    494   ALLOCATE (stars, Stars, Nstars);
    495   for (i = 0; i < Nstars; i++) {
    496     InitStar (&stars[i]);
    497     stars[i].measure.Xccd       = ps1data[i].X;
    498     stars[i].measure.Yccd       = ps1data[i].Y;
    499     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    500     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    501 
    502     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    503     stars[i].measure.pltscale   = ps1data[i].pltscale;
     476  Catalog *catalog = addstar_catalog_init (Nstars);
     477
     478  for (i = 0; i < Nstars; i++) {
     479    catalog->measure[i].Xccd       = ps1data[i].X;
     480    catalog->measure[i].Yccd       = ps1data[i].Y;
     481    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     482    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     483
     484    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     485    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    504486
    505487    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    506       stars[i].measure.M      = NAN;
    507       stars[i].measure.FluxPSF  = NAN;
    508       stars[i].measure.dFluxPSF = NAN;
    509     } else {
    510       stars[i].measure.M        = ps1data[i].M + ZeroPt;
    511       stars[i].measure.FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
    512       stars[i].measure.dFluxPSF = stars[i].measure.FluxPSF * ps1data[i].dM;
    513     }
    514     stars[i].measure.dM         = ps1data[i].dM;
    515     stars[i].measure.dMcal      = ps1data[i].dMcal;
    516     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    517     stars[i].measure.dMap       = ps1data[i].dM; // a proxy measure
    518                        
    519     stars[i].measure.Mkron      = NAN; // not provided by PS1_V1_Alt:
    520     stars[i].measure.dMkron     = NAN; // not provided by PS1_V1_Alt:
    521     stars[i].measure.FluxKron   = NAN; // not provided by PS1_V1_Alt:
    522     stars[i].measure.dFluxKron  = NAN; // not provided by PS1_V1_Alt:
    523 
    524     stars[i].measure.Sky        = ps1data[i].sky;
    525     stars[i].measure.dSky       = ps1data[i].dSky;
    526                        
    527     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    528     stars[i].measure.psfQF      = ps1data[i].psfQF;
    529     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    530     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    531     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    532 
    533     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    534     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    535     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    536 
    537     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    538     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    539     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    540                        
    541     stars[i].measure.photFlags  = ps1data[i].flags;
    542 
    543     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    544     stars[i].measure.detID      = ps1data[i].detID;
     488      catalog->measure[i].M      = NAN;
     489      catalog->measure[i].FluxPSF  = NAN;
     490      catalog->measure[i].dFluxPSF = NAN;
     491    } else {
     492      catalog->measure[i].M        = ps1data[i].M + ZeroPt;
     493      catalog->measure[i].FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
     494      catalog->measure[i].dFluxPSF = catalog->measure[i].FluxPSF * ps1data[i].dM;
     495    }
     496    catalog->measure[i].dM         = ps1data[i].dM;
     497    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     498    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     499    catalog->measure[i].dMap       = ps1data[i].dM; // a proxy measure
     500                       
     501    catalog->measure[i].Mkron      = NAN; // not provided by PS1_V1_Alt:
     502    catalog->measure[i].dMkron     = NAN; // not provided by PS1_V1_Alt:
     503    catalog->measure[i].FluxKron   = NAN; // not provided by PS1_V1_Alt:
     504    catalog->measure[i].dFluxKron  = NAN; // not provided by PS1_V1_Alt:
     505
     506    catalog->measure[i].Sky        = ps1data[i].sky;
     507    catalog->measure[i].dSky       = ps1data[i].dSky;
     508                       
     509    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     510    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     511    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     512    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     513    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     514
     515    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     516    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     517    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     518
     519    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     520    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     521    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     522                       
     523    catalog->measure[i].photFlags  = ps1data[i].flags;
     524
     525    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     526    catalog->measure[i].detID      = ps1data[i].detID;
    545527
    546528    // the Average fields and the following Measure fields are set in FilterStars after
     
    550532    // the following fields are currently not being set anywhere: t_msec
    551533  }   
    552   *nstars = Nstars;
    553   return (stars);
    554 }
    555 
    556 Stars *Convert_PS1_V2 (FTable *table, unsigned int *nstars) {
     534  return catalog;
     535}
     536
     537Catalog *Convert_PS1_V2 (FTable *table) {
    557538
    558539  off_t Nstars;
    559540  unsigned int i;
    560541  double ZeroPt;
    561   Stars *stars;
    562542  CMF_PS1_V2 *ps1data;
    563543
     
    569549  ZeroPt = GetZeroPoint();
    570550
    571   ALLOCATE (stars, Stars, Nstars);
    572   for (i = 0; i < Nstars; i++) {
    573     InitStar (&stars[i]);
    574     stars[i].measure.Xccd       = ps1data[i].X;
    575     stars[i].measure.Yccd       = ps1data[i].Y;
    576     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    577     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    578 
    579     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    580     stars[i].measure.pltscale   = ps1data[i].pltscale;
     551  Catalog *catalog = addstar_catalog_init (Nstars);
     552
     553  for (i = 0; i < Nstars; i++) {
     554    catalog->measure[i].Xccd       = ps1data[i].X;
     555    catalog->measure[i].Yccd       = ps1data[i].Y;
     556    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     557    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     558
     559    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     560    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    581561
    582562    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    583       stars[i].measure.M        = NAN;
    584       stars[i].measure.FluxPSF  = NAN;
    585       stars[i].measure.dFluxPSF = NAN;
    586     } else {
    587       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    588       stars[i].measure.FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
    589       stars[i].measure.dFluxPSF = stars[i].measure.FluxPSF * ps1data[i].dM;
    590     }
    591     stars[i].measure.dM         = ps1data[i].dM;
    592     stars[i].measure.dMcal      = ps1data[i].dMcal;
    593     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    594     stars[i].measure.dMap       = ps1data[i].dM; // a proxy measure
    595                        
    596     stars[i].measure.Mkron      = NAN; // not provided by PS1_V2:
    597     stars[i].measure.dMkron     = NAN; // not provided by PS1_V2:
    598     stars[i].measure.FluxKron   = NAN; // not provided by PS1_V2:
    599     stars[i].measure.dFluxKron  = NAN; // not provided by PS1_V2:
    600 
    601     stars[i].measure.Sky        = ps1data[i].sky;
    602     stars[i].measure.dSky       = ps1data[i].dSky;
    603                        
    604     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    605     stars[i].measure.psfQF      = ps1data[i].psfQF;
    606     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    607     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    608     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    609 
    610     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    611     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    612     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    613 
    614     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    615     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    616     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    617                        
    618     stars[i].measure.photFlags  = ps1data[i].flags;
    619 
    620     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    621     stars[i].measure.detID      = ps1data[i].detID;
     563      catalog->measure[i].M        = NAN;
     564      catalog->measure[i].FluxPSF  = NAN;
     565      catalog->measure[i].dFluxPSF = NAN;
     566    } else {
     567      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     568      catalog->measure[i].FluxPSF  = pow(10.0, -0.4*ps1data[i].M);
     569      catalog->measure[i].dFluxPSF = catalog->measure[i].FluxPSF * ps1data[i].dM;
     570    }
     571    catalog->measure[i].dM         = ps1data[i].dM;
     572    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     573    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     574    catalog->measure[i].dMap       = ps1data[i].dM; // a proxy measure
     575                       
     576    catalog->measure[i].Mkron      = NAN; // not provided by PS1_V2:
     577    catalog->measure[i].dMkron     = NAN; // not provided by PS1_V2:
     578    catalog->measure[i].FluxKron   = NAN; // not provided by PS1_V2:
     579    catalog->measure[i].dFluxKron  = NAN; // not provided by PS1_V2:
     580
     581    catalog->measure[i].Sky        = ps1data[i].sky;
     582    catalog->measure[i].dSky       = ps1data[i].dSky;
     583                       
     584    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     585    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     586    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     587    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     588    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     589
     590    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     591    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     592    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     593
     594    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     595    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     596    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     597                       
     598    catalog->measure[i].photFlags  = ps1data[i].flags;
     599
     600    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     601    catalog->measure[i].detID      = ps1data[i].detID;
    622602
    623603    // the Average fields and the following Measure fields are set in FilterStars after
     
    627607    // the following fields are currently not being set anywhere: t_msec
    628608  }   
    629   *nstars = Nstars;
    630   return (stars);
    631 }
    632 
    633 Stars *Convert_PS1_V3 (FTable *table, unsigned int *nstars) {
     609  return catalog;
     610}
     611
     612Catalog *Convert_PS1_V3 (FTable *table) {
    634613
    635614  off_t Nstars;
    636615  unsigned int i;
    637616  double ZeroPt;
    638   Stars *stars;
    639617  CMF_PS1_V3 *ps1data;
    640618
     
    646624  ZeroPt = GetZeroPoint();
    647625
    648   ALLOCATE (stars, Stars, Nstars);
    649   for (i = 0; i < Nstars; i++) {
    650     InitStar (&stars[i]);
    651     stars[i].measure.Xccd       = ps1data[i].X;
    652     stars[i].measure.Yccd       = ps1data[i].Y;
    653     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    654     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    655 
    656     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    657     stars[i].measure.pltscale   = ps1data[i].pltscale;
     626  Catalog *catalog = addstar_catalog_init (Nstars);
     627
     628  for (i = 0; i < Nstars; i++) {
     629    catalog->measure[i].Xccd       = ps1data[i].X;
     630    catalog->measure[i].Yccd       = ps1data[i].Y;
     631    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     632    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     633
     634    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     635    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    658636
    659637    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    660       stars[i].measure.M      = NAN;
    661     } else {
    662       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    663     }
    664     stars[i].measure.dM         = ps1data[i].dM;
    665     stars[i].measure.dMcal      = ps1data[i].dMcal;
    666     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    667     stars[i].measure.dMap       = ps1data[i].dM; // a proxy measure
    668                        
    669     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    670     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     638      catalog->measure[i].M      = NAN;
     639    } else {
     640      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     641    }
     642    catalog->measure[i].dM         = ps1data[i].dM;
     643    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     644    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     645    catalog->measure[i].dMap       = ps1data[i].dM; // a proxy measure
     646                       
     647    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     648    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    671649                       
    672650    // these fluxes are converted from counts to counts/sec in FilterStars.c
    673     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    674     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    675     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    676     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    677     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (NAN, ps1data[i].Map);
    678     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (NAN, stars[i].measure.FluxAp, stars[i].measure.dMap);
    679 
    680     stars[i].measure.Sky        = ps1data[i].sky;
    681     stars[i].measure.dSky       = ps1data[i].dSky;
    682                        
    683     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    684     stars[i].measure.psfQF      = ps1data[i].psfQF;
    685     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    686     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    687     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    688     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    689 
    690     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    691     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    692     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    693 
    694     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    695     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    696     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    697                        
    698     stars[i].measure.photFlags  = ps1data[i].flags;
    699     stars[i].measure.photFlags2 = ps1data[i].flags2;
    700 
    701     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    702     stars[i].measure.detID      = ps1data[i].detID;
     651    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     652    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     653    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     654    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     655    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (NAN, ps1data[i].Map);
     656    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (NAN, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     657
     658    catalog->measure[i].Sky        = ps1data[i].sky;
     659    catalog->measure[i].dSky       = ps1data[i].dSky;
     660                       
     661    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     662    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     663    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     664    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     665    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     666    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     667
     668    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     669    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     670    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     671
     672    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     673    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     674    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     675                       
     676    catalog->measure[i].photFlags  = ps1data[i].flags;
     677    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     678
     679    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     680    catalog->measure[i].detID      = ps1data[i].detID;
    703681
    704682    // the Average fields and the following Measure fields are set in FilterStars after
     
    711689    // the following fields are currently not being set anywhere: t_msec
    712690  }   
    713   *nstars = Nstars;
    714   return (stars);
    715 }
    716 
    717 Stars *Convert_PS1_V4 (FTable *table, unsigned int *nstars) {
     691  return catalog;
     692}
     693
     694Catalog *Convert_PS1_V4 (FTable *table) {
    718695
    719696  off_t Nstars;
    720697  unsigned int i;
    721698  double ZeroPt;
    722   Stars *stars;
    723699  CMF_PS1_V4 *ps1data;
    724700
    725701  ps1data = gfits_table_get_CMF_PS1_V4 (table, &Nstars, NULL, NULL);
    726   if (!ps1data) {
    727     fprintf (stderr, "skipping inconsistent entry\n");
    728     return (NULL);
    729   }
    730   ZeroPt = GetZeroPoint();
    731 
    732   ALLOCATE (stars, Stars, Nstars);
    733   for (i = 0; i < Nstars; i++) {
    734     InitStar (&stars[i]);
    735     stars[i].measure.Xccd       = ps1data[i].X;
    736     stars[i].measure.Yccd       = ps1data[i].Y;
    737     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    738     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    739 
    740     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    741     stars[i].measure.pltscale   = ps1data[i].pltscale;
    742 
    743     if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    744       stars[i].measure.M      = NAN;
    745     } else {
    746       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    747     }
    748     stars[i].measure.dM         = ps1data[i].dM;
    749     stars[i].measure.dMcal      = ps1data[i].dMcal;
    750     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    751     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    752                        
    753     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    754     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    755                        
    756     // these fluxes are converted from counts to counts/sec in FilterStars.c
    757     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    758     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    759     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    760     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    761     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    762     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    763 
    764     stars[i].measure.Sky        = ps1data[i].sky;
    765     stars[i].measure.dSky       = ps1data[i].dSky;
    766                        
    767     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    768     stars[i].measure.psfQF      = ps1data[i].psfQF;
    769     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    770 
    771     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    772     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    773     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    774 
    775     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    776     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    777     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    778 
    779     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    780     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    781     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    782                        
    783     stars[i].measure.photFlags  = ps1data[i].flags;
    784     stars[i].measure.photFlags2 = ps1data[i].flags2;
    785 
    786     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    787     stars[i].measure.detID      = ps1data[i].detID;
    788 
    789     // the Average fields and the following Measure fields are set in FilterStars after
    790     // the image metadata is in hand:  dR, dD, Mcal, dt, airmass, az, t, imageID, extID.
    791 
    792     // averef is set in find_matches
    793 
    794     // dbFlags is zero on ingest.
    795 
    796     // the following fields are currently not being set anywhere: t_msec
    797   }   
    798   *nstars = Nstars;
    799   return (stars);
    800 }
    801 
    802 # endif
    803 
    804 Catalog *Convert_PS1_V5 (FTable *table) {
    805 
    806   off_t Nstars;
    807   unsigned int i;
    808   double ZeroPt;
    809   CMF_PS1_V5 *ps1data;
    810 
    811   ps1data = gfits_table_get_CMF_PS1_V5 (table, &Nstars, NULL);
    812702  if (!ps1data) {
    813703    fprintf (stderr, "skipping inconsistent entry\n");
     
    882772    // the following fields are currently not being set anywhere: t_msec
    883773  }   
    884   return (catalog);
    885 }
    886 
    887 # if (0)
    888 
    889 Stars *Convert_PS1_V5_R0_Lensing (FTable *table, unsigned int *nstars) {
     774  return catalog;
     775}
     776
     777Catalog *Convert_PS1_V5 (FTable *table) {
    890778
    891779  off_t Nstars;
    892780  unsigned int i;
    893781  double ZeroPt;
    894   Stars *stars;
     782  CMF_PS1_V5 *ps1data;
     783
     784  ps1data = gfits_table_get_CMF_PS1_V5 (table, &Nstars, NULL);
     785  if (!ps1data) {
     786    fprintf (stderr, "skipping inconsistent entry\n");
     787    return (NULL);
     788  }
     789  ZeroPt = GetZeroPoint();
     790
     791  Catalog *catalog = addstar_catalog_init (Nstars);
     792
     793  for (i = 0; i < Nstars; i++) {
     794    catalog->measure[i].Xccd       = ps1data[i].X;
     795    catalog->measure[i].Yccd       = ps1data[i].Y;
     796    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     797    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     798
     799    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     800    catalog->measure[i].pltscale   = ps1data[i].pltscale;
     801
     802    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
     803      catalog->measure[i].M      = NAN;
     804    } else {
     805      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     806    }
     807    catalog->measure[i].dM         = ps1data[i].dM;
     808    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     809    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     810    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     811                       
     812    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     813    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     814                       
     815    // these fluxes are converted from counts to counts/sec in FilterStars.c
     816    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     817    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     818    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     819    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     820    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     821    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     822
     823    catalog->measure[i].Sky        = ps1data[i].sky;
     824    catalog->measure[i].dSky       = ps1data[i].dSky;
     825                       
     826    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     827    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     828    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     829
     830    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     831    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     832    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     833
     834    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     835    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     836    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     837
     838    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     839    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     840    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     841                       
     842    catalog->measure[i].photFlags  = ps1data[i].flags;
     843    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     844
     845    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     846    catalog->measure[i].detID      = ps1data[i].detID;
     847
     848    // the Average fields and the following Measure fields are set in FilterStars after
     849    // the image metadata is in hand:  dR, dD, Mcal, dt, airmass, az, t, imageID, extID.
     850
     851    // averef is set in find_matches
     852
     853    // dbFlags is zero on ingest.
     854
     855    // the following fields are currently not being set anywhere: t_msec
     856  }   
     857  return catalog;
     858}
     859
     860Catalog *Convert_PS1_V5_R0_Lensing (FTable *table) {
     861
     862  off_t Nstars;
     863  unsigned int i;
     864  double ZeroPt;
    895865  CMF_PS1_V5_R0_Lensing *ps1data;
    896866
     
    902872  ZeroPt = GetZeroPoint();
    903873
    904   ALLOCATE (stars, Stars, Nstars);
    905   for (i = 0; i < Nstars; i++) {
    906     InitStar (&stars[i]);
    907     stars[i].measure.Xccd       = ps1data[i].X;
    908     stars[i].measure.Yccd       = ps1data[i].Y;
    909     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    910     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    911 
    912     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    913     stars[i].measure.pltscale   = ps1data[i].pltscale;
     874  Catalog *catalog = addstar_catalog_init (Nstars);
     875  ALLOCATE (catalog->lensing, Lensing, Nstars);
     876
     877  for (i = 0; i < Nstars; i++) {
     878    catalog->measure[i].Xccd       = ps1data[i].X;
     879    catalog->measure[i].Yccd       = ps1data[i].Y;
     880    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     881    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     882
     883    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     884    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    914885
    915886    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    916       stars[i].measure.M      = NAN;
    917     } else {
    918       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    919     }
    920     stars[i].measure.dM         = ps1data[i].dM;
    921     stars[i].measure.dMcal      = ps1data[i].dMcal;
    922     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    923     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    924                        
    925     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    926     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     887      catalog->measure[i].M      = NAN;
     888    } else {
     889      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     890    }
     891    catalog->measure[i].dM         = ps1data[i].dM;
     892    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     893    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     894    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     895                       
     896    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     897    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    927898                       
    928899    // these fluxes are converted from counts to counts/sec in FilterStars.c
    929     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    930     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    931     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    932     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    933     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    934     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    935 
    936     stars[i].measure.Sky        = ps1data[i].sky;
    937     stars[i].measure.dSky       = ps1data[i].dSky;
    938                        
    939     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    940     stars[i].measure.psfQF      = ps1data[i].psfQF;
    941     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    942 
    943     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    944     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    945     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    946 
    947     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    948     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    949     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    950 
    951     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    952     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    953     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    954                        
    955     stars[i].measure.photFlags  = ps1data[i].flags;
    956     stars[i].measure.photFlags2 = ps1data[i].flags2;
    957 
    958     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    959     stars[i].measure.detID      = ps1data[i].detID;
    960 
    961     ALLOCATE (stars[i].lensing, Lensing, 1);
    962     dvo_lensing_init (stars[i].lensing);
    963 
    964     stars[i].lensing->X11_sm_obj  = ps1data[i].X11_sm_obj;
    965     stars[i].lensing->X12_sm_obj  = ps1data[i].X12_sm_obj;
    966     stars[i].lensing->X22_sm_obj  = ps1data[i].X22_sm_obj;
    967     stars[i].lensing->E1_sm_obj   = ps1data[i].E1_sm_obj;
    968     stars[i].lensing->E2_sm_obj   = ps1data[i].E2_sm_obj;
    969 
    970     stars[i].lensing->X11_sh_obj  = ps1data[i].X11_sh_obj;
    971     stars[i].lensing->X12_sh_obj  = ps1data[i].X12_sh_obj;
    972     stars[i].lensing->X22_sh_obj  = ps1data[i].X22_sh_obj;
    973     stars[i].lensing->E1_sh_obj   = ps1data[i].E1_sh_obj;
    974     stars[i].lensing->E2_sh_obj   = ps1data[i].E2_sh_obj;
    975 
    976     stars[i].lensing->X11_sm_psf  = ps1data[i].X11_sm_psf;
    977     stars[i].lensing->X12_sm_psf  = ps1data[i].X12_sm_psf;
    978     stars[i].lensing->X22_sm_psf  = ps1data[i].X22_sm_psf;
    979     stars[i].lensing->E1_sm_psf   = ps1data[i].E1_sm_psf;
    980     stars[i].lensing->E2_sm_psf   = ps1data[i].E2_sm_psf;
    981 
    982     stars[i].lensing->X11_sh_psf  = ps1data[i].X11_sh_psf;
    983     stars[i].lensing->X12_sh_psf  = ps1data[i].X12_sh_psf;
    984     stars[i].lensing->X22_sh_psf  = ps1data[i].X22_sh_psf;
    985     stars[i].lensing->E1_sh_psf   = ps1data[i].E1_sh_psf;
    986     stars[i].lensing->E2_sh_psf   = ps1data[i].E2_sh_psf;
    987 
    988     // stars[i].lensing->F_ApR5    = ps1data[i].F_ApR5;
    989     // stars[i].lensing->dF_ApR5   = ps1data[i].dF_ApR5;
    990     // stars[i].lensing->sF_ApR5   = ps1data[i].sF_ApR5;
    991     // stars[i].lensing->fF_ApR5   = ps1data[i].fF_ApR5;
     900    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     901    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     902    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     903    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     904    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     905    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     906
     907    catalog->measure[i].Sky        = ps1data[i].sky;
     908    catalog->measure[i].dSky       = ps1data[i].dSky;
     909                       
     910    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     911    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     912    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     913
     914    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     915    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     916    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     917
     918    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     919    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     920    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     921
     922    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     923    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     924    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     925                       
     926    catalog->measure[i].photFlags  = ps1data[i].flags;
     927    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     928
     929    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     930    catalog->measure[i].detID      = ps1data[i].detID;
     931
     932    dvo_lensing_init (&catalog->lensing[i]);
     933
     934    catalog->lensing[i].X11_sm_obj  = ps1data[i].X11_sm_obj;
     935    catalog->lensing[i].X12_sm_obj  = ps1data[i].X12_sm_obj;
     936    catalog->lensing[i].X22_sm_obj  = ps1data[i].X22_sm_obj;
     937    catalog->lensing[i].E1_sm_obj   = ps1data[i].E1_sm_obj;
     938    catalog->lensing[i].E2_sm_obj   = ps1data[i].E2_sm_obj;
     939
     940    catalog->lensing[i].X11_sh_obj  = ps1data[i].X11_sh_obj;
     941    catalog->lensing[i].X12_sh_obj  = ps1data[i].X12_sh_obj;
     942    catalog->lensing[i].X22_sh_obj  = ps1data[i].X22_sh_obj;
     943    catalog->lensing[i].E1_sh_obj   = ps1data[i].E1_sh_obj;
     944    catalog->lensing[i].E2_sh_obj   = ps1data[i].E2_sh_obj;
     945
     946    catalog->lensing[i].X11_sm_psf  = ps1data[i].X11_sm_psf;
     947    catalog->lensing[i].X12_sm_psf  = ps1data[i].X12_sm_psf;
     948    catalog->lensing[i].X22_sm_psf  = ps1data[i].X22_sm_psf;
     949    catalog->lensing[i].E1_sm_psf   = ps1data[i].E1_sm_psf;
     950    catalog->lensing[i].E2_sm_psf   = ps1data[i].E2_sm_psf;
     951
     952    catalog->lensing[i].X11_sh_psf  = ps1data[i].X11_sh_psf;
     953    catalog->lensing[i].X12_sh_psf  = ps1data[i].X12_sh_psf;
     954    catalog->lensing[i].X22_sh_psf  = ps1data[i].X22_sh_psf;
     955    catalog->lensing[i].E1_sh_psf   = ps1data[i].E1_sh_psf;
     956    catalog->lensing[i].E2_sh_psf   = ps1data[i].E2_sh_psf;
     957
     958    // catalog->lensing[i].F_ApR5    = ps1data[i].F_ApR5;
     959    // catalog->lensing[i].dF_ApR5   = ps1data[i].dF_ApR5;
     960    // catalog->lensing[i].sF_ApR5   = ps1data[i].sF_ApR5;
     961    // catalog->lensing[i].fF_ApR5   = ps1data[i].fF_ApR5;
    992962    //
    993     // stars[i].lensing->F_ApR6    = ps1data[i].F_ApR6;
    994     // stars[i].lensing->dF_ApR6   = ps1data[i].dF_ApR6;
    995     // stars[i].lensing->sF_ApR6   = ps1data[i].sF_ApR6;
    996     // stars[i].lensing->fF_ApR6   = ps1data[i].fF_ApR6;
    997 
    998     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    999     stars[i].lensing->detID      = ps1data[i].detID;
     963    // catalog->lensing[i].F_ApR6    = ps1data[i].F_ApR6;
     964    // catalog->lensing[i].dF_ApR6   = ps1data[i].dF_ApR6;
     965    // catalog->lensing[i].sF_ApR6   = ps1data[i].sF_ApR6;
     966    // catalog->lensing[i].fF_ApR6   = ps1data[i].fF_ApR6;
     967
     968    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     969    catalog->lensing[i].detID      = ps1data[i].detID;
    1000970
    1001971    // the Average fields and the following Measure fields are set in FilterStars after
     
    1008978    // the following fields are currently not being set anywhere: t_msec
    1009979  }   
    1010   *nstars = Nstars;
    1011   return (stars);
    1012 }
    1013 
    1014 Stars *Convert_PS1_V5_R1_Lensing (FTable *table, unsigned int *nstars) {
     980  return catalog;
     981}
     982
     983Catalog *Convert_PS1_V5_R1_Lensing (FTable *table) {
    1015984
    1016985  off_t Nstars;
    1017986  unsigned int i;
    1018987  double ZeroPt;
    1019   Stars *stars;
    1020988  CMF_PS1_V5_R1_Lensing *ps1data;
    1021989
     
    1027995  ZeroPt = GetZeroPoint();
    1028996
    1029   ALLOCATE (stars, Stars, Nstars);
    1030   for (i = 0; i < Nstars; i++) {
    1031     InitStar (&stars[i]);
    1032     stars[i].measure.Xccd       = ps1data[i].X;
    1033     stars[i].measure.Yccd       = ps1data[i].Y;
    1034     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1035     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1036 
    1037     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1038     stars[i].measure.pltscale   = ps1data[i].pltscale;
     997  Catalog *catalog = addstar_catalog_init (Nstars);
     998  ALLOCATE (catalog->lensing, Lensing, Nstars);
     999
     1000  for (i = 0; i < Nstars; i++) {
     1001    catalog->measure[i].Xccd       = ps1data[i].X;
     1002    catalog->measure[i].Yccd       = ps1data[i].Y;
     1003    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1004    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1005
     1006    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1007    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    10391008
    10401009    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1041       stars[i].measure.M      = NAN;
    1042     } else {
    1043       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1044     }
    1045     stars[i].measure.dM         = ps1data[i].dM;
    1046     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1047     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1048     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    1049                        
    1050     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1051     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1010      catalog->measure[i].M      = NAN;
     1011    } else {
     1012      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1013    }
     1014    catalog->measure[i].dM         = ps1data[i].dM;
     1015    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1016    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1017    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     1018                       
     1019    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1020    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    10521021                       
    10531022    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1054     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1055     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1056     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1057     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1058     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    1059     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1060 
    1061     stars[i].measure.Sky        = ps1data[i].sky;
    1062     stars[i].measure.dSky       = ps1data[i].dSky;
    1063                        
    1064     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1065     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1066     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    1067 
    1068     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1069     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1070     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1071 
    1072     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1073     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1074     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1075 
    1076     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1077     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1078     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1079                        
    1080     stars[i].measure.photFlags  = ps1data[i].flags;
    1081     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1082 
    1083     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1084     stars[i].measure.detID      = ps1data[i].detID;
    1085 
    1086     ALLOCATE (stars[i].lensing, Lensing, 1);
    1087     dvo_lensing_init (stars[i].lensing);
    1088 
    1089     stars[i].lensing->X11_sm_obj  = ps1data[i].X11_sm_obj;
    1090     stars[i].lensing->X12_sm_obj  = ps1data[i].X12_sm_obj;
    1091     stars[i].lensing->X22_sm_obj  = ps1data[i].X22_sm_obj;
    1092     stars[i].lensing->E1_sm_obj   = ps1data[i].E1_sm_obj;
    1093     stars[i].lensing->E2_sm_obj   = ps1data[i].E2_sm_obj;
    1094 
    1095     stars[i].lensing->X11_sh_obj  = ps1data[i].X11_sh_obj;
    1096     stars[i].lensing->X12_sh_obj  = ps1data[i].X12_sh_obj;
    1097     stars[i].lensing->X22_sh_obj  = ps1data[i].X22_sh_obj;
    1098     stars[i].lensing->E1_sh_obj   = ps1data[i].E1_sh_obj;
    1099     stars[i].lensing->E2_sh_obj   = ps1data[i].E2_sh_obj;
    1100 
    1101     stars[i].lensing->X11_sm_psf  = ps1data[i].X11_sm_psf;
    1102     stars[i].lensing->X12_sm_psf  = ps1data[i].X12_sm_psf;
    1103     stars[i].lensing->X22_sm_psf  = ps1data[i].X22_sm_psf;
    1104     stars[i].lensing->E1_sm_psf   = ps1data[i].E1_sm_psf;
    1105     stars[i].lensing->E2_sm_psf   = ps1data[i].E2_sm_psf;
    1106 
    1107     stars[i].lensing->X11_sh_psf  = ps1data[i].X11_sh_psf;
    1108     stars[i].lensing->X12_sh_psf  = ps1data[i].X12_sh_psf;
    1109     stars[i].lensing->X22_sh_psf  = ps1data[i].X22_sh_psf;
    1110     stars[i].lensing->E1_sh_psf   = ps1data[i].E1_sh_psf;
    1111     stars[i].lensing->E2_sh_psf   = ps1data[i].E2_sh_psf;
    1112 
    1113     // stars[i].lensing->F_ApR5    = ps1data[i].F_ApR5;
    1114     // stars[i].lensing->dF_ApR5   = ps1data[i].dF_ApR5;
    1115     // stars[i].lensing->sF_ApR5   = ps1data[i].sF_ApR5;
    1116     // stars[i].lensing->fF_ApR5   = ps1data[i].fF_ApR5;
     1023    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1024    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1025    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1026    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1027    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     1028    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1029
     1030    catalog->measure[i].Sky        = ps1data[i].sky;
     1031    catalog->measure[i].dSky       = ps1data[i].dSky;
     1032                       
     1033    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1034    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1035    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     1036
     1037    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1038    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1039    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1040
     1041    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1042    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1043    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1044
     1045    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1046    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1047    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1048                       
     1049    catalog->measure[i].photFlags  = ps1data[i].flags;
     1050    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1051
     1052    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1053    catalog->measure[i].detID      = ps1data[i].detID;
     1054
     1055    dvo_lensing_init (&catalog->lensing[i]);
     1056
     1057    catalog->lensing[i].X11_sm_obj  = ps1data[i].X11_sm_obj;
     1058    catalog->lensing[i].X12_sm_obj  = ps1data[i].X12_sm_obj;
     1059    catalog->lensing[i].X22_sm_obj  = ps1data[i].X22_sm_obj;
     1060    catalog->lensing[i].E1_sm_obj   = ps1data[i].E1_sm_obj;
     1061    catalog->lensing[i].E2_sm_obj   = ps1data[i].E2_sm_obj;
     1062
     1063    catalog->lensing[i].X11_sh_obj  = ps1data[i].X11_sh_obj;
     1064    catalog->lensing[i].X12_sh_obj  = ps1data[i].X12_sh_obj;
     1065    catalog->lensing[i].X22_sh_obj  = ps1data[i].X22_sh_obj;
     1066    catalog->lensing[i].E1_sh_obj   = ps1data[i].E1_sh_obj;
     1067    catalog->lensing[i].E2_sh_obj   = ps1data[i].E2_sh_obj;
     1068
     1069    catalog->lensing[i].X11_sm_psf  = ps1data[i].X11_sm_psf;
     1070    catalog->lensing[i].X12_sm_psf  = ps1data[i].X12_sm_psf;
     1071    catalog->lensing[i].X22_sm_psf  = ps1data[i].X22_sm_psf;
     1072    catalog->lensing[i].E1_sm_psf   = ps1data[i].E1_sm_psf;
     1073    catalog->lensing[i].E2_sm_psf   = ps1data[i].E2_sm_psf;
     1074
     1075    catalog->lensing[i].X11_sh_psf  = ps1data[i].X11_sh_psf;
     1076    catalog->lensing[i].X12_sh_psf  = ps1data[i].X12_sh_psf;
     1077    catalog->lensing[i].X22_sh_psf  = ps1data[i].X22_sh_psf;
     1078    catalog->lensing[i].E1_sh_psf   = ps1data[i].E1_sh_psf;
     1079    catalog->lensing[i].E2_sh_psf   = ps1data[i].E2_sh_psf;
     1080
     1081    // catalog->lensing[i].F_ApR5    = ps1data[i].F_ApR5;
     1082    // catalog->lensing[i].dF_ApR5   = ps1data[i].dF_ApR5;
     1083    // catalog->lensing[i].sF_ApR5   = ps1data[i].sF_ApR5;
     1084    // catalog->lensing[i].fF_ApR5   = ps1data[i].fF_ApR5;
    11171085    //
    1118     // stars[i].lensing->F_ApR6    = ps1data[i].F_ApR6;
    1119     // stars[i].lensing->dF_ApR6   = ps1data[i].dF_ApR6;
    1120     // stars[i].lensing->sF_ApR6   = ps1data[i].sF_ApR6;
    1121     // stars[i].lensing->fF_ApR6   = ps1data[i].fF_ApR6;
    1122 
    1123     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1124     stars[i].lensing->detID      = ps1data[i].detID;
     1086    // catalog->lensing[i].F_ApR6    = ps1data[i].F_ApR6;
     1087    // catalog->lensing[i].dF_ApR6   = ps1data[i].dF_ApR6;
     1088    // catalog->lensing[i].sF_ApR6   = ps1data[i].sF_ApR6;
     1089    // catalog->lensing[i].fF_ApR6   = ps1data[i].fF_ApR6;
     1090
     1091    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1092    catalog->lensing[i].detID      = ps1data[i].detID;
    11251093
    11261094    // the Average fields and the following Measure fields are set in FilterStars after
     
    11331101    // the following fields are currently not being set anywhere: t_msec
    11341102  }   
    1135   *nstars = Nstars;
    1136   return (stars);
    1137 }
    1138 
    1139 Stars *Convert_PS1_V5_R2_Lensing (FTable *table, unsigned int *nstars) {
     1103  return catalog;
     1104}
     1105
     1106Catalog *Convert_PS1_V5_R2_Lensing (FTable *table) {
    11401107
    11411108  off_t Nstars;
    11421109  unsigned int i;
    11431110  double ZeroPt;
    1144   Stars *stars;
    11451111  CMF_PS1_V5_R2_Lensing *ps1data;
    11461112
     
    11521118  ZeroPt = GetZeroPoint();
    11531119
    1154   ALLOCATE (stars, Stars, Nstars);
    1155   for (i = 0; i < Nstars; i++) {
    1156     InitStar (&stars[i]);
    1157     stars[i].measure.Xccd       = ps1data[i].X;
    1158     stars[i].measure.Yccd       = ps1data[i].Y;
    1159     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1160     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1161 
    1162     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1163     stars[i].measure.pltscale   = ps1data[i].pltscale;
     1120  Catalog *catalog = addstar_catalog_init (Nstars);
     1121  ALLOCATE (catalog->lensing, Lensing, Nstars);
     1122
     1123  for (i = 0; i < Nstars; i++) {
     1124    catalog->measure[i].Xccd       = ps1data[i].X;
     1125    catalog->measure[i].Yccd       = ps1data[i].Y;
     1126    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1127    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1128
     1129    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1130    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    11641131
    11651132    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1166       stars[i].measure.M      = NAN;
    1167     } else {
    1168       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1169     }
    1170     stars[i].measure.dM         = ps1data[i].dM;
    1171     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1172     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1173     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    1174                        
    1175     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1176     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1133      catalog->measure[i].M      = NAN;
     1134    } else {
     1135      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1136    }
     1137    catalog->measure[i].dM         = ps1data[i].dM;
     1138    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1139    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1140    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     1141                       
     1142    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1143    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    11771144                       
    11781145    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1179     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1180     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1181     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1182     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1183     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    1184     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1185 
    1186     stars[i].measure.Sky        = ps1data[i].sky;
    1187     stars[i].measure.dSky       = ps1data[i].dSky;
    1188                        
    1189     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1190     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1191     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    1192 
    1193     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1194     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1195     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1196 
    1197     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1198     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1199     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1200 
    1201     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1202     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1203     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1204                        
    1205     stars[i].measure.photFlags  = ps1data[i].flags;
    1206     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1207 
    1208     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1209     stars[i].measure.detID      = ps1data[i].detID;
    1210 
    1211     ALLOCATE (stars[i].lensing, Lensing, 1);
    1212     dvo_lensing_init (stars[i].lensing);
    1213 
    1214     stars[i].lensing->X11_sm_obj  = ps1data[i].X11_sm_obj;
    1215     stars[i].lensing->X12_sm_obj  = ps1data[i].X12_sm_obj;
    1216     stars[i].lensing->X22_sm_obj  = ps1data[i].X22_sm_obj;
    1217     stars[i].lensing->E1_sm_obj   = ps1data[i].E1_sm_obj;
    1218     stars[i].lensing->E2_sm_obj   = ps1data[i].E2_sm_obj;
    1219 
    1220     stars[i].lensing->X11_sh_obj  = ps1data[i].X11_sh_obj;
    1221     stars[i].lensing->X12_sh_obj  = ps1data[i].X12_sh_obj;
    1222     stars[i].lensing->X22_sh_obj  = ps1data[i].X22_sh_obj;
    1223     stars[i].lensing->E1_sh_obj   = ps1data[i].E1_sh_obj;
    1224     stars[i].lensing->E2_sh_obj   = ps1data[i].E2_sh_obj;
    1225 
    1226     stars[i].lensing->X11_sm_psf  = ps1data[i].X11_sm_psf;
    1227     stars[i].lensing->X12_sm_psf  = ps1data[i].X12_sm_psf;
    1228     stars[i].lensing->X22_sm_psf  = ps1data[i].X22_sm_psf;
    1229     stars[i].lensing->E1_sm_psf   = ps1data[i].E1_sm_psf;
    1230     stars[i].lensing->E2_sm_psf   = ps1data[i].E2_sm_psf;
    1231 
    1232     stars[i].lensing->X11_sh_psf  = ps1data[i].X11_sh_psf;
    1233     stars[i].lensing->X12_sh_psf  = ps1data[i].X12_sh_psf;
    1234     stars[i].lensing->X22_sh_psf  = ps1data[i].X22_sh_psf;
    1235     stars[i].lensing->E1_sh_psf   = ps1data[i].E1_sh_psf;
    1236     stars[i].lensing->E2_sh_psf   = ps1data[i].E2_sh_psf;
    1237 
    1238     stars[i].lensing->E1_psf      = ps1data[i].E1_psf;
    1239     stars[i].lensing->E2_psf      = ps1data[i].E2_psf;
    1240 
    1241     // stars[i].lensing->F_ApR5    = ps1data[i].F_ApR5;
    1242     // stars[i].lensing->dF_ApR5   = ps1data[i].dF_ApR5;
    1243     // stars[i].lensing->sF_ApR5   = ps1data[i].sF_ApR5;
    1244     // stars[i].lensing->fF_ApR5   = ps1data[i].fF_ApR5;
     1146    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1147    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1148    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1149    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1150    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     1151    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1152
     1153    catalog->measure[i].Sky        = ps1data[i].sky;
     1154    catalog->measure[i].dSky       = ps1data[i].dSky;
     1155                       
     1156    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1157    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1158    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     1159
     1160    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1161    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1162    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1163
     1164    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1165    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1166    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1167
     1168    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1169    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1170    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1171                       
     1172    catalog->measure[i].photFlags  = ps1data[i].flags;
     1173    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1174
     1175    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1176    catalog->measure[i].detID      = ps1data[i].detID;
     1177
     1178    dvo_lensing_init (&catalog->lensing[i]);
     1179
     1180    catalog->lensing[i].X11_sm_obj  = ps1data[i].X11_sm_obj;
     1181    catalog->lensing[i].X12_sm_obj  = ps1data[i].X12_sm_obj;
     1182    catalog->lensing[i].X22_sm_obj  = ps1data[i].X22_sm_obj;
     1183    catalog->lensing[i].E1_sm_obj   = ps1data[i].E1_sm_obj;
     1184    catalog->lensing[i].E2_sm_obj   = ps1data[i].E2_sm_obj;
     1185
     1186    catalog->lensing[i].X11_sh_obj  = ps1data[i].X11_sh_obj;
     1187    catalog->lensing[i].X12_sh_obj  = ps1data[i].X12_sh_obj;
     1188    catalog->lensing[i].X22_sh_obj  = ps1data[i].X22_sh_obj;
     1189    catalog->lensing[i].E1_sh_obj   = ps1data[i].E1_sh_obj;
     1190    catalog->lensing[i].E2_sh_obj   = ps1data[i].E2_sh_obj;
     1191
     1192    catalog->lensing[i].X11_sm_psf  = ps1data[i].X11_sm_psf;
     1193    catalog->lensing[i].X12_sm_psf  = ps1data[i].X12_sm_psf;
     1194    catalog->lensing[i].X22_sm_psf  = ps1data[i].X22_sm_psf;
     1195    catalog->lensing[i].E1_sm_psf   = ps1data[i].E1_sm_psf;
     1196    catalog->lensing[i].E2_sm_psf   = ps1data[i].E2_sm_psf;
     1197
     1198    catalog->lensing[i].X11_sh_psf  = ps1data[i].X11_sh_psf;
     1199    catalog->lensing[i].X12_sh_psf  = ps1data[i].X12_sh_psf;
     1200    catalog->lensing[i].X22_sh_psf  = ps1data[i].X22_sh_psf;
     1201    catalog->lensing[i].E1_sh_psf   = ps1data[i].E1_sh_psf;
     1202    catalog->lensing[i].E2_sh_psf   = ps1data[i].E2_sh_psf;
     1203
     1204    catalog->lensing[i].E1_psf      = ps1data[i].E1_psf;
     1205    catalog->lensing[i].E2_psf      = ps1data[i].E2_psf;
     1206
     1207    // catalog->lensing[i].F_ApR5    = ps1data[i].F_ApR5;
     1208    // catalog->lensing[i].dF_ApR5   = ps1data[i].dF_ApR5;
     1209    // catalog->lensing[i].sF_ApR5   = ps1data[i].sF_ApR5;
     1210    // catalog->lensing[i].fF_ApR5   = ps1data[i].fF_ApR5;
    12451211    //
    1246     // stars[i].lensing->F_ApR6    = ps1data[i].F_ApR6;
    1247     // stars[i].lensing->dF_ApR6   = ps1data[i].dF_ApR6;
    1248     // stars[i].lensing->sF_ApR6   = ps1data[i].sF_ApR6;
    1249     // stars[i].lensing->fF_ApR6   = ps1data[i].fF_ApR6;
    1250 
    1251     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1252     stars[i].lensing->detID      = ps1data[i].detID;
     1212    // catalog->lensing[i].F_ApR6    = ps1data[i].F_ApR6;
     1213    // catalog->lensing[i].dF_ApR6   = ps1data[i].dF_ApR6;
     1214    // catalog->lensing[i].sF_ApR6   = ps1data[i].sF_ApR6;
     1215    // catalog->lensing[i].fF_ApR6   = ps1data[i].fF_ApR6;
     1216
     1217    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1218    catalog->lensing[i].detID      = ps1data[i].detID;
    12531219
    12541220    // the Average fields and the following Measure fields are set in FilterStars after
     
    12611227    // the following fields are currently not being set anywhere: t_msec
    12621228  }   
    1263   *nstars = Nstars;
    1264   return (stars);
    1265 }
    1266 
    1267 Stars *Convert_PS1_SV1 (FTable *table, unsigned int *nstars) {
     1229  return catalog;
     1230}
     1231
     1232Catalog *Convert_PS1_SV1 (FTable *table) {
    12681233
    12691234  off_t Nstars;
    12701235  unsigned int i;
    12711236  double ZeroPt;
    1272   Stars *stars;
    12731237  CMF_PS1_SV1 *ps1data;
    12741238
    12751239  if (table[0].header[0].Naxis[0] == 196) {
    1276     stars = Convert_PS1_SV1_Alt (table, nstars);
    1277     return (stars);
     1240    Catalog *catalog = Convert_PS1_SV1_Alt (table);
     1241    return catalog;
    12781242  }
    12791243
     
    12851249  ZeroPt = GetZeroPoint();
    12861250
    1287   ALLOCATE (stars, Stars, Nstars);
    1288   for (i = 0; i < Nstars; i++) {
    1289     InitStar (&stars[i]);
    1290     stars[i].measure.Xccd       = ps1data[i].X;
    1291     stars[i].measure.Yccd       = ps1data[i].Y;
    1292     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1293     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1294 
    1295     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1296     stars[i].measure.pltscale   = ps1data[i].pltscale;
     1251  Catalog *catalog = addstar_catalog_init (Nstars);
     1252
     1253  for (i = 0; i < Nstars; i++) {
     1254    catalog->measure[i].Xccd       = ps1data[i].X;
     1255    catalog->measure[i].Yccd       = ps1data[i].Y;
     1256    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1257    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1258
     1259    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1260    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    12971261
    12981262    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1299       stars[i].measure.M      = NAN;
    1300     } else {
    1301       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1302     }
    1303     stars[i].measure.dM         = ps1data[i].dM;
    1304     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1305     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1306     stars[i].measure.dMap       = ps1data[i].dM; // a proxy measure
    1307                        
    1308     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1309     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1263      catalog->measure[i].M      = NAN;
     1264    } else {
     1265      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1266    }
     1267    catalog->measure[i].dM         = ps1data[i].dM;
     1268    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1269    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1270    catalog->measure[i].dMap       = ps1data[i].dM; // a proxy measure
     1271                       
     1272    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1273    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    13101274
    13111275    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1312     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1313     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1314     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1315     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1316     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (NAN, ps1data[i].Map);
    1317     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (NAN, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1318 
    1319     stars[i].measure.Sky        = ps1data[i].sky;
    1320     stars[i].measure.dSky       = ps1data[i].dSky;
    1321                        
    1322     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1323     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1324     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    1325 
    1326     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1327     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1328     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1329 
    1330     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1331     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1332     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1333 
    1334     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1335     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1336     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1337                        
    1338     stars[i].measure.photFlags  = ps1data[i].flags;
    1339     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1340 
    1341     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1342     stars[i].measure.detID      = ps1data[i].detID;
     1276    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1277    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1278    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1279    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1280    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (NAN, ps1data[i].Map);
     1281    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (NAN, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1282
     1283    catalog->measure[i].Sky        = ps1data[i].sky;
     1284    catalog->measure[i].dSky       = ps1data[i].dSky;
     1285                       
     1286    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1287    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1288    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     1289
     1290    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1291    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1292    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1293
     1294    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1295    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1296    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1297
     1298    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1299    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1300    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1301                       
     1302    catalog->measure[i].photFlags  = ps1data[i].flags;
     1303    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1304
     1305    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1306    catalog->measure[i].detID      = ps1data[i].detID;
    13431307
    13441308    // the Average fields and the following Measure fields are set in FilterStars after
     
    13481312    // the following fields are currently not being set anywhere: t_msec
    13491313  }   
    1350   *nstars = Nstars;
    1351   return (stars);
    1352 }
    1353 
    1354 Stars *Convert_PS1_SV1_Alt (FTable *table, unsigned int *nstars) {
     1314  return catalog;
     1315}
     1316
     1317Catalog *Convert_PS1_SV1_Alt (FTable *table) {
    13551318
    13561319  off_t Nstars;
    13571320  unsigned int i;
    13581321  double ZeroPt;
    1359   Stars *stars;
    13601322  CMF_PS1_SV1 *ps1data;
    13611323
    13621324  // some test output files were produced called CMF_PS1_SV1 but with mismatch byte boundaries
    1363 
    13641325  ps1data = gfits_table_get_CMF_PS1_SV1_Alt (table, &Nstars, NULL);
    13651326  if (!ps1data) {
     
    13691330  ZeroPt = GetZeroPoint();
    13701331
    1371   ALLOCATE (stars, Stars, Nstars);
    1372   for (i = 0; i < Nstars; i++) {
    1373     InitStar (&stars[i]);
    1374     stars[i].measure.Xccd       = ps1data[i].X;
    1375     stars[i].measure.Yccd       = ps1data[i].Y;
    1376     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1377     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1378 
    1379     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1380     stars[i].measure.pltscale   = ps1data[i].pltscale;
     1332  Catalog *catalog = addstar_catalog_init (Nstars);
     1333
     1334  for (i = 0; i < Nstars; i++) {
     1335    catalog->measure[i].Xccd       = ps1data[i].X;
     1336    catalog->measure[i].Yccd       = ps1data[i].Y;
     1337    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1338    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1339
     1340    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1341    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    13811342
    13821343    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1383       stars[i].measure.M      = NAN;
    1384     } else {
    1385       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1386     }
    1387     stars[i].measure.dM         = ps1data[i].dM;
    1388     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1389     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1390     stars[i].measure.dMap       = ps1data[i].dM; // a proxy measure
    1391                        
    1392     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1393     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1344      catalog->measure[i].M      = NAN;
     1345    } else {
     1346      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1347    }
     1348    catalog->measure[i].dM         = ps1data[i].dM;
     1349    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1350    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1351    catalog->measure[i].dMap       = ps1data[i].dM; // a proxy measure
     1352                       
     1353    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1354    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    13941355
    13951356    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1396     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1397     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1398     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1399     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1400     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (NAN, ps1data[i].Map);
    1401     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (NAN, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1402 
    1403     stars[i].measure.Sky        = ps1data[i].sky;
    1404     stars[i].measure.dSky       = ps1data[i].dSky;
    1405                        
    1406     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1407     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1408     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1409     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1410     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1411 
    1412     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1413     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1414     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1415 
    1416     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1417     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1418     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1419                        
    1420     stars[i].measure.photFlags  = ps1data[i].flags;
    1421     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1422 
    1423     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1424     stars[i].measure.detID      = ps1data[i].detID;
     1357    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1358    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1359    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1360    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1361    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (NAN, ps1data[i].Map);
     1362    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (NAN, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1363
     1364    catalog->measure[i].Sky        = ps1data[i].sky;
     1365    catalog->measure[i].dSky       = ps1data[i].dSky;
     1366                       
     1367    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1368    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1369    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1370    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1371    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1372
     1373    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1374    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1375    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1376
     1377    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1378    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1379    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1380                       
     1381    catalog->measure[i].photFlags  = ps1data[i].flags;
     1382    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1383
     1384    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1385    catalog->measure[i].detID      = ps1data[i].detID;
    14251386
    14261387    // the Average fields and the following Measure fields are set in FilterStars after
     
    14301391    // the following fields are currently not being set anywhere: t_msec
    14311392  }   
    1432   *nstars = Nstars;
    1433   return (stars);
    1434 }
    1435 
    1436 Stars *Convert_PS1_SV2 (FTable *table, unsigned int *nstars) {
     1393  return catalog;
     1394}
     1395
     1396Catalog *Convert_PS1_SV2 (FTable *table) {
    14371397
    14381398  off_t Nstars;
    14391399  unsigned int i;
    14401400  double ZeroPt;
    1441   Stars *stars;
    14421401  CMF_PS1_SV2 *ps1data;
    14431402
     
    14491408  ZeroPt = GetZeroPoint();
    14501409
    1451   ALLOCATE (stars, Stars, Nstars);
    1452   for (i = 0; i < Nstars; i++) {
    1453     InitStar (&stars[i]);
    1454     stars[i].measure.Xccd       = ps1data[i].X;
    1455     stars[i].measure.Yccd       = ps1data[i].Y;
    1456     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1457     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1458 
    1459     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1460     stars[i].measure.pltscale   = ps1data[i].pltscale;
     1410  Catalog *catalog = addstar_catalog_init (Nstars);
     1411
     1412  for (i = 0; i < Nstars; i++) {
     1413    catalog->measure[i].Xccd       = ps1data[i].X;
     1414    catalog->measure[i].Yccd       = ps1data[i].Y;
     1415    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1416    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1417
     1418    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1419    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    14611420
    14621421    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1463       stars[i].measure.M      = NAN;
    1464     } else {
    1465       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1466     }
    1467     stars[i].measure.dM         = ps1data[i].dM;
    1468     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1469     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1470     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    1471                        
    1472     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1473     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1422      catalog->measure[i].M      = NAN;
     1423    } else {
     1424      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1425    }
     1426    catalog->measure[i].dM         = ps1data[i].dM;
     1427    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1428    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1429    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     1430                       
     1431    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1432    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    14741433
    14751434    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1476     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1477     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1478     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1479     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1480     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    1481     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1482 
    1483     stars[i].measure.Sky        = ps1data[i].sky;
    1484     stars[i].measure.dSky       = ps1data[i].dSky;
    1485                        
    1486     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1487     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1488     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    1489 
    1490     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1491     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1492     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1493 
    1494     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1495     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1496     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1497 
    1498     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1499     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1500     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1501                        
    1502     stars[i].measure.photFlags  = ps1data[i].flags;
    1503     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1504 
    1505     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1506     stars[i].measure.detID      = ps1data[i].detID;
     1435    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1436    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1437    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1438    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1439    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     1440    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1441
     1442    catalog->measure[i].Sky        = ps1data[i].sky;
     1443    catalog->measure[i].dSky       = ps1data[i].dSky;
     1444                       
     1445    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1446    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1447    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     1448
     1449    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1450    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1451    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1452
     1453    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1454    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1455    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1456
     1457    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1458    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1459    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1460                       
     1461    catalog->measure[i].photFlags  = ps1data[i].flags;
     1462    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1463
     1464    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1465    catalog->measure[i].detID      = ps1data[i].detID;
    15071466
    15081467    // the Average fields and the following Measure fields are set in FilterStars after
     
    15121471    // the following fields are currently not being set anywhere: t_msec
    15131472  }   
    1514   *nstars = Nstars;
    1515   return (stars);
    1516 }
    1517 
    1518 Stars *Convert_PS1_SV3 (FTable *table, unsigned int *nstars) {
     1473  return catalog;
     1474}
     1475
     1476Catalog *Convert_PS1_SV3 (FTable *table) {
    15191477
    15201478  off_t Nstars;
    15211479  unsigned int i;
    15221480  double ZeroPt;
    1523   Stars *stars;
    15241481  CMF_PS1_SV3 *ps1data;
    15251482
     
    15311488  ZeroPt = GetZeroPoint();
    15321489
    1533   ALLOCATE (stars, Stars, Nstars);
    1534   for (i = 0; i < Nstars; i++) {
    1535     InitStar (&stars[i]);
    1536     stars[i].measure.Xccd       = ps1data[i].X;
    1537     stars[i].measure.Yccd       = ps1data[i].Y;
    1538     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1539     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1540 
    1541     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1542     stars[i].measure.pltscale   = ps1data[i].pltscale;
     1490  Catalog *catalog = addstar_catalog_init (Nstars);
     1491
     1492  for (i = 0; i < Nstars; i++) {
     1493    catalog->measure[i].Xccd       = ps1data[i].X;
     1494    catalog->measure[i].Yccd       = ps1data[i].Y;
     1495    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1496    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1497
     1498    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1499    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    15431500
    15441501    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1545       stars[i].measure.M      = NAN;
    1546     } else {
    1547       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1548     }
    1549     stars[i].measure.dM         = ps1data[i].dM;
    1550     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1551     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1552     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    1553                        
    1554     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1555     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1502      catalog->measure[i].M      = NAN;
     1503    } else {
     1504      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1505    }
     1506    catalog->measure[i].dM         = ps1data[i].dM;
     1507    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1508    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1509    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     1510                       
     1511    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1512    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    15561513
    15571514    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1558     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1559     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1560     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1561     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1562     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    1563     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1564 
    1565     stars[i].measure.Sky        = ps1data[i].sky;
    1566     stars[i].measure.dSky       = ps1data[i].dSky;
    1567                        
    1568     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1569     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1570     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    1571 
    1572     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1573     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1574     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1575 
    1576     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1577     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1578     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1579 
    1580     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1581     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1582     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1583                        
    1584     stars[i].measure.photFlags  = ps1data[i].flags;
    1585     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1586 
    1587     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1588     stars[i].measure.detID      = ps1data[i].detID;
     1515    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1516    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1517    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1518    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1519    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     1520    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1521
     1522    catalog->measure[i].Sky        = ps1data[i].sky;
     1523    catalog->measure[i].dSky       = ps1data[i].dSky;
     1524                       
     1525    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1526    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1527    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     1528
     1529    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1530    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1531    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1532
     1533    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1534    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1535    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1536
     1537    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1538    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1539    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1540                       
     1541    catalog->measure[i].photFlags  = ps1data[i].flags;
     1542    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1543
     1544    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1545    catalog->measure[i].detID      = ps1data[i].detID;
    15891546
    15901547    // the Average fields and the following Measure fields are set in FilterStars after
     
    15941551    // the following fields are currently not being set anywhere: t_msec
    15951552  }   
    1596   *nstars = Nstars;
    1597   return (stars);
    1598 }
    1599 
    1600 Stars *Convert_PS1_SV4 (FTable *table, unsigned int *nstars) {
     1553  return catalog;
     1554}
     1555
     1556Catalog *Convert_PS1_SV4 (FTable *table) {
    16011557
    16021558  off_t Nstars;
    16031559  unsigned int i;
    16041560  double ZeroPt;
    1605   Stars *stars;
    16061561  CMF_PS1_SV4 *ps1data;
    16071562
     
    16131568  ZeroPt = GetZeroPoint();
    16141569
    1615   ALLOCATE (stars, Stars, Nstars);
    1616   for (i = 0; i < Nstars; i++) {
    1617     InitStar (&stars[i]);
    1618     stars[i].measure.Xccd       = ps1data[i].X;
    1619     stars[i].measure.Yccd       = ps1data[i].Y;
    1620     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1621     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1622 
    1623     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1624     stars[i].measure.pltscale   = ps1data[i].pltscale;
     1570  Catalog *catalog = addstar_catalog_init (Nstars);
     1571
     1572  for (i = 0; i < Nstars; i++) {
     1573    catalog->measure[i].Xccd       = ps1data[i].X;
     1574    catalog->measure[i].Yccd       = ps1data[i].Y;
     1575    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1576    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1577
     1578    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1579    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    16251580
    16261581    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1627       stars[i].measure.M      = NAN;
    1628     } else {
    1629       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1630     }
    1631     stars[i].measure.dM         = ps1data[i].dM;
    1632     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1633     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1634     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    1635                        
    1636     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1637     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1582      catalog->measure[i].M      = NAN;
     1583    } else {
     1584      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1585    }
     1586    catalog->measure[i].dM         = ps1data[i].dM;
     1587    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1588    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1589    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     1590                       
     1591    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1592    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    16381593
    16391594    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1640     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1641     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1642     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1643     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1644     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    1645     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1646 
    1647     stars[i].measure.Sky        = ps1data[i].sky;
    1648     stars[i].measure.dSky       = ps1data[i].dSky;
    1649                        
    1650     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1651     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1652     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    1653 
    1654     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1655     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1656     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1657 
    1658     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1659     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1660     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1661 
    1662     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1663     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1664     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1665                        
    1666     stars[i].measure.photFlags  = ps1data[i].flags;
    1667     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1668 
    1669     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1670     stars[i].measure.detID      = ps1data[i].detID;
     1595    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1596    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1597    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1598    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1599    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     1600    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1601
     1602    catalog->measure[i].Sky        = ps1data[i].sky;
     1603    catalog->measure[i].dSky       = ps1data[i].dSky;
     1604                       
     1605    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1606    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1607    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     1608
     1609    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1610    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1611    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1612
     1613    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1614    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1615    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1616
     1617    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1618    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1619    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1620                       
     1621    catalog->measure[i].photFlags  = ps1data[i].flags;
     1622    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1623
     1624    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1625    catalog->measure[i].detID      = ps1data[i].detID;
    16711626
    16721627    // the Average fields and the following Measure fields are set in FilterStars after
     
    16761631    // the following fields are currently not being set anywhere: t_msec
    16771632  }   
    1678   *nstars = Nstars;
    1679   return (stars);
    1680 }
    1681 
    1682 Stars *Convert_PS1_DV3 (FTable *table, unsigned int *nstars) {
     1633  return catalog;
     1634}
     1635
     1636Catalog *Convert_PS1_DV3 (FTable *table) {
    16831637
    16841638  off_t Nstars;
    16851639  unsigned int i;
    16861640  double ZeroPt;
    1687   Stars *stars;
    16881641  CMF_PS1_DV3 *ps1data;
    16891642
     
    16951648  ZeroPt = GetZeroPoint();
    16961649
    1697   ALLOCATE (stars, Stars, Nstars);
    1698   for (i = 0; i < Nstars; i++) {
    1699     InitStar (&stars[i]);
    1700     stars[i].measure.Xccd       = ps1data[i].X;
    1701     stars[i].measure.Yccd       = ps1data[i].Y;
    1702     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1703     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1704 
    1705     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1706     stars[i].measure.pltscale   = ps1data[i].pltscale;
     1650  Catalog *catalog = addstar_catalog_init (Nstars);
     1651
     1652  for (i = 0; i < Nstars; i++) {
     1653    catalog->measure[i].Xccd       = ps1data[i].X;
     1654    catalog->measure[i].Yccd       = ps1data[i].Y;
     1655    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1656    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1657
     1658    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1659    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    17071660
    17081661    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1709       stars[i].measure.M      = NAN;
    1710     } else {
    1711       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1712     }
    1713     stars[i].measure.dM         = ps1data[i].dM;
    1714     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1715     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1716     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    1717                        
    1718     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1719     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1662      catalog->measure[i].M      = NAN;
     1663    } else {
     1664      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1665    }
     1666    catalog->measure[i].dM         = ps1data[i].dM;
     1667    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1668    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1669    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     1670                       
     1671    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1672    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    17201673                       
    17211674    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1722     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1723     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1724     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1725     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1726     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    1727     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1728 
    1729     stars[i].measure.Sky        = ps1data[i].sky;
    1730     stars[i].measure.dSky       = ps1data[i].dSky;
    1731                        
    1732     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1733     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1734     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    1735     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1736     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1737     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1738 
    1739     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1740     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1741     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1742 
    1743     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1744     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1745     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1746                        
    1747     stars[i].measure.photFlags  = ps1data[i].flags;
    1748     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1749 
    1750     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1751     stars[i].measure.detID      = ps1data[i].detID;
     1675    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1676    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1677    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1678    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1679    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     1680    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1681
     1682    catalog->measure[i].Sky        = ps1data[i].sky;
     1683    catalog->measure[i].dSky       = ps1data[i].dSky;
     1684                       
     1685    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1686    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1687    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     1688    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1689    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1690    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1691
     1692    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1693    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1694    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1695
     1696    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1697    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1698    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1699                       
     1700    catalog->measure[i].photFlags  = ps1data[i].flags;
     1701    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1702
     1703    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1704    catalog->measure[i].detID      = ps1data[i].detID;
    17521705
    17531706    // the Average fields and the following Measure fields are set in FilterStars after
     
    17601713    // the following fields are currently not being set anywhere: t_msec
    17611714  }   
    1762   *nstars = Nstars;
    1763   return (stars);
    1764 }
    1765 
    1766 Stars *Convert_PS1_DV4 (FTable *table, unsigned int *nstars) {
     1715  return catalog;
     1716}
     1717
     1718Catalog *Convert_PS1_DV4 (FTable *table) {
    17671719
    17681720  off_t Nstars;
    17691721  unsigned int i;
    17701722  double ZeroPt;
    1771   Stars *stars;
    17721723  CMF_PS1_DV4 *ps1data;
    17731724
     
    17811732  fprintf (stderr, "WARNING: Convert_PS1_DV4 not yet updated to match real format\n");
    17821733
    1783   ALLOCATE (stars, Stars, Nstars);
    1784   for (i = 0; i < Nstars; i++) {
    1785     InitStar (&stars[i]);
    1786     stars[i].measure.Xccd       = ps1data[i].X;
    1787     stars[i].measure.Yccd       = ps1data[i].Y;
    1788     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1789     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1790 
    1791     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1792     stars[i].measure.pltscale   = ps1data[i].pltscale;
     1734  Catalog *catalog = addstar_catalog_init (Nstars);
     1735
     1736  for (i = 0; i < Nstars; i++) {
     1737    catalog->measure[i].Xccd       = ps1data[i].X;
     1738    catalog->measure[i].Yccd       = ps1data[i].Y;
     1739    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1740    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1741
     1742    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1743    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    17931744
    17941745    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1795       stars[i].measure.M      = NAN;
    1796     } else {
    1797       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1798     }
    1799     stars[i].measure.dM         = ps1data[i].dM;
    1800     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1801     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1802     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    1803                        
    1804     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1805     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1746      catalog->measure[i].M      = NAN;
     1747    } else {
     1748      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1749    }
     1750    catalog->measure[i].dM         = ps1data[i].dM;
     1751    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1752    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1753    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     1754                       
     1755    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1756    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    18061757                       
    18071758    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1808     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1809     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1810     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1811     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1812     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    1813     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1814 
    1815     stars[i].measure.Sky        = ps1data[i].sky;
    1816     stars[i].measure.dSky       = ps1data[i].dSky;
    1817                        
    1818     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1819     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1820     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    1821     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1822     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1823     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1824 
    1825     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1826     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1827     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1828 
    1829     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1830     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1831     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1832                        
    1833     stars[i].measure.photFlags  = ps1data[i].flags;
    1834     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1835 
    1836     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1837     stars[i].measure.detID      = ps1data[i].detID;
     1759    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1760    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1761    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1762    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1763    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     1764    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1765
     1766    catalog->measure[i].Sky        = ps1data[i].sky;
     1767    catalog->measure[i].dSky       = ps1data[i].dSky;
     1768                       
     1769    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1770    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1771    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     1772    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1773    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1774    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1775
     1776    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1777    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1778    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1779
     1780    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1781    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1782    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1783                       
     1784    catalog->measure[i].photFlags  = ps1data[i].flags;
     1785    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1786
     1787    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1788    catalog->measure[i].detID      = ps1data[i].detID;
    18381789
    18391790    // the Average fields and the following Measure fields are set in FilterStars after
     
    18461797    // the following fields are currently not being set anywhere: t_msec
    18471798  }   
    1848   *nstars = Nstars;
    1849   return (stars);
    1850 }
    1851 
    1852 Stars *Convert_PS1_DV5 (FTable *table, unsigned int *nstars) {
     1799  return catalog;
     1800}
     1801
     1802Catalog *Convert_PS1_DV5 (FTable *table) {
    18531803
    18541804  off_t Nstars;
    18551805  unsigned int i;
    18561806  double ZeroPt;
    1857   Stars *stars;
    18581807  CMF_PS1_DV5 *ps1data;
    18591808
     
    18651814  ZeroPt = GetZeroPoint();
    18661815
    1867   ALLOCATE (stars, Stars, Nstars);
    1868   for (i = 0; i < Nstars; i++) {
    1869     InitStar (&stars[i]);
    1870     stars[i].measure.Xccd       = ps1data[i].X;
    1871     stars[i].measure.Yccd       = ps1data[i].Y;
    1872     stars[i].measure.dXccd      = ToShortPixels(ps1data[i].dX);
    1873     stars[i].measure.dYccd      = ToShortPixels(ps1data[i].dY);
    1874 
    1875     stars[i].measure.posangle   = ToShortDegrees(ps1data[i].posangle);
    1876     stars[i].measure.pltscale   = ps1data[i].pltscale;
     1816  Catalog *catalog = addstar_catalog_init (Nstars);
     1817
     1818  for (i = 0; i < Nstars; i++) {
     1819    catalog->measure[i].Xccd       = ps1data[i].X;
     1820    catalog->measure[i].Yccd       = ps1data[i].Y;
     1821    catalog->measure[i].dXccd      = ToShortPixels(ps1data[i].dX);
     1822    catalog->measure[i].dYccd      = ToShortPixels(ps1data[i].dY);
     1823
     1824    catalog->measure[i].posangle   = ToShortDegrees(ps1data[i].posangle);
     1825    catalog->measure[i].pltscale   = ps1data[i].pltscale;
    18771826
    18781827    if ((ps1data[i].M >= 0.0) || isnan(ps1data[i].M)) {
    1879       stars[i].measure.M      = NAN;
    1880     } else {
    1881       stars[i].measure.M      = ps1data[i].M + ZeroPt;
    1882     }
    1883     stars[i].measure.dM         = ps1data[i].dM;
    1884     stars[i].measure.dMcal      = ps1data[i].dMcal;
    1885     stars[i].measure.Map        = ps1data[i].Map + ZeroPt;
    1886     stars[i].measure.dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
    1887                        
    1888     stars[i].measure.Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
    1889     stars[i].measure.dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
     1828      catalog->measure[i].M      = NAN;
     1829    } else {
     1830      catalog->measure[i].M      = ps1data[i].M + ZeroPt;
     1831    }
     1832    catalog->measure[i].dM         = ps1data[i].dM;
     1833    catalog->measure[i].dMcal      = ps1data[i].dMcal;
     1834    catalog->measure[i].Map        = ps1data[i].Map + ZeroPt;
     1835    catalog->measure[i].dMap       = (ps1data[i].apFlux > 0.0) ? fabs(ps1data[i].apFluxErr / ps1data[i].apFlux) : NAN;
     1836                       
     1837    catalog->measure[i].Mkron      = (ps1data[i].kronFlux > 0.0) ? -2.5*log10(ps1data[i].kronFlux) + ZeroPt : NAN;
     1838    catalog->measure[i].dMkron     = (ps1data[i].kronFlux > 0.0) ? ps1data[i].kronFluxErr / ps1data[i].kronFlux : NAN;
    18901839                       
    18911840    // these fluxes are converted from counts to counts/sec in FilterStars.c
    1892     stars[i].measure.FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
    1893     stars[i].measure.dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, stars[i].measure.FluxPSF, ps1data[i].dM);
    1894     stars[i].measure.FluxKron   = ps1data[i].kronFlux;
    1895     stars[i].measure.dFluxKron  = ps1data[i].kronFluxErr;
    1896     stars[i].measure.FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
    1897     stars[i].measure.dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, stars[i].measure.FluxAp, stars[i].measure.dMap);
    1898 
    1899     stars[i].measure.Sky        = ps1data[i].sky;
    1900     stars[i].measure.dSky       = ps1data[i].dSky;
    1901                        
    1902     stars[i].measure.psfChisq   = ps1data[i].psfChisq;
    1903     stars[i].measure.psfQF      = ps1data[i].psfQF;
    1904     stars[i].measure.psfQFperf  = ps1data[i].psfQFperf;
    1905     stars[i].measure.psfNdof    = ps1data[i].psfNdof;
    1906     stars[i].measure.psfNpix    = ps1data[i].psfNpix;
    1907     stars[i].measure.extNsigma  = ps1data[i].extNsigma;
    1908 
    1909     stars[i].measure.FWx        = ToShortPixels(ps1data[i].fx);
    1910     stars[i].measure.FWy        = ToShortPixels(ps1data[i].fy);
    1911     stars[i].measure.theta      = ToShortDegrees(ps1data[i].df);
    1912 
    1913     stars[i].measure.Mxx        = ToShortPixels(ps1data[i].Mxx);
    1914     stars[i].measure.Mxy        = ToShortPixels(ps1data[i].Mxy);
    1915     stars[i].measure.Myy        = ToShortPixels(ps1data[i].Myy);
    1916                        
    1917     stars[i].measure.photFlags  = ps1data[i].flags;
    1918     stars[i].measure.photFlags2 = ps1data[i].flags2;
    1919 
    1920     // this is may optionally be replaced by the internal sequence (see FilterStars.c)
    1921     stars[i].measure.detID      = ps1data[i].detID;
     1841    catalog->measure[i].FluxPSF    = GetFluxFromFluxOrMag (ps1data[i].Flux, ps1data[i].M);
     1842    catalog->measure[i].dFluxPSF   = GetFluxErrFromFluxOrMag (ps1data[i].dFlux, catalog->measure[i].FluxPSF, ps1data[i].dM);
     1843    catalog->measure[i].FluxKron   = ps1data[i].kronFlux;
     1844    catalog->measure[i].dFluxKron  = ps1data[i].kronFluxErr;
     1845    catalog->measure[i].FluxAp     = GetFluxFromFluxOrMag (ps1data[i].apFlux, ps1data[i].Map);
     1846    catalog->measure[i].dFluxAp    = GetFluxErrFromFluxOrMag (ps1data[i].apFluxErr, catalog->measure[i].FluxAp, catalog->measure[i].dMap);
     1847
     1848    catalog->measure[i].Sky        = ps1data[i].sky;
     1849    catalog->measure[i].dSky       = ps1data[i].dSky;
     1850                       
     1851    catalog->measure[i].psfChisq   = ps1data[i].psfChisq;
     1852    catalog->measure[i].psfQF      = ps1data[i].psfQF;
     1853    catalog->measure[i].psfQFperf  = ps1data[i].psfQFperf;
     1854    catalog->measure[i].psfNdof    = ps1data[i].psfNdof;
     1855    catalog->measure[i].psfNpix    = ps1data[i].psfNpix;
     1856    catalog->measure[i].extNsigma  = ps1data[i].extNsigma;
     1857
     1858    catalog->measure[i].FWx        = ToShortPixels(ps1data[i].fx);
     1859    catalog->measure[i].FWy        = ToShortPixels(ps1data[i].fy);
     1860    catalog->measure[i].theta      = ToShortDegrees(ps1data[i].df);
     1861
     1862    catalog->measure[i].Mxx        = ToShortPixels(ps1data[i].Mxx);
     1863    catalog->measure[i].Mxy        = ToShortPixels(ps1data[i].Mxy);
     1864    catalog->measure[i].Myy        = ToShortPixels(ps1data[i].Myy);
     1865                       
     1866    catalog->measure[i].photFlags  = ps1data[i].flags;
     1867    catalog->measure[i].photFlags2 = ps1data[i].flags2;
     1868
     1869    // this is may optionally be replaced by the internal sequence (see FilterStars.c)
     1870    catalog->measure[i].detID      = ps1data[i].detID;
    19221871
    19231872    // the Average fields and the following Measure fields are set in FilterStars after
     
    19301879    // the following fields are currently not being set anywhere: t_msec
    19311880  }   
    1932   *nstars = Nstars;
    1933   return (stars);
    1934 }
    1935 # endif
    1936 
    1937 
     1881  return catalog;
     1882}
Note: See TracChangeset for help on using the changeset viewer.