IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 36908


Ignore:
Timestamp:
Jun 18, 2014, 9:44:36 PM (12 years ago)
Author:
eugene
Message:

major rework for mag-related selections (allow mag:psf:inst:stk, etc)

Location:
branches/eam_branches/ipp-20140610/Ohana/src/libdvo
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20140610/Ohana/src/libdvo/include/dvo.h

    r36898 r36908  
    662662char     *GetPhotcodeNamebyCode (int code);
    663663
    664 float PhotInst (Measure *measure);
    665 float PhotCat (Measure *measure);
    666 float PhotSys (Measure *measure, Average *average, SecFilt *secfilt);
    667 float PhotRel (Measure *measure, Average *average, SecFilt *secfilt);
    668 float PhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code);
    669 float PhotAve (PhotCode *code, Average *average, SecFilt *secfilt);
    670 float PhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure);
    671 float PhotAveErr (PhotCode *code, Average *average, SecFilt *secfilt);
    672 
    673 float PhotAperInst (Measure *measure);
    674 float PhotAperCat (Measure *measure);
    675 float PhotAperSys (Measure *measure, Average *average, SecFilt *secfilt);
    676 float PhotAperRel (Measure *measure, Average *average, SecFilt *secfilt);
    677 float PhotAperCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code);
    678 float PhotAperAve (PhotCode *code, Average *average, SecFilt *secfilt);
    679 float PhotAperRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure);
    680 
    681 float PhotKronInst (Measure *measure);
    682 float PhotKronCat (Measure *measure);
    683 float PhotKronSys (Measure *measure, Average *average, SecFilt *secfilt);
    684 float PhotKronRel (Measure *measure, Average *average, SecFilt *secfilt);
    685 float PhotKronCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code);
    686 float PhotKronAve (PhotCode *code, Average *average, SecFilt *secfilt);
    687 float PhotKronRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure);
    688 float PhotKronAveErr (PhotCode *code, Average *average, SecFilt *secfilt);
     664float PhotInst (Measure *measure, dvoMagClassType class);
     665float PhotCat (Measure *measure, dvoMagClassType class);
     666float PhotSys (Measure *measure, Average *average, SecFilt *secfilt, dvoMagClassType class);
     667float PhotRel (Measure *measure, Average *average, SecFilt *secfilt, dvoMagClassType class);
     668float PhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code, dvoMagClassType class);
     669float PhotErr (Measure *measure, dvoMagClassType class);
     670
     671float PhotAve (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source);
     672float PhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure, dvoMagClassType class, dvoMagSourceType source);
     673float PhotAveErr (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source);
    689674
    690675float PhotXm (PhotCode *code, Average *average, SecFilt *secfilt);
  • branches/eam_branches/ipp-20140610/Ohana/src/libdvo/include/dvodb.h

    r36898 r36908  
    2222
    2323/* magnitude types */
    24 enum {MAG_NONE,
     24
     25typedef enum {
     26  MAG_SRC_NONE,
     27  MAG_SRC_CHP,
     28  MAG_SRC_WRP,
     29  MAG_SRC_STK,
     30} dvoMagSourceType;
     31
     32typedef enum {
     33  MAG_LEVEL_NONE,       // -2.5*log(DN) [ie, not DN/sec]
     34  MAG_LEVEL_INST,               // -2.5*log(DN) [ie, not DN/sec]
     35  MAG_LEVEL_CAT,                // MAG_INST + 2.5*log(exptime) + C_lambda + K_lambda*(airmass - 1)
     36  MAG_LEVEL_SYS, // MAG_CAT + \sum_i A_i * (color_i - color_o) [color correction for measure photcode]
     37  MAG_LEVEL_REL, // MAG_SYS - Mcal [specific zero point for image]
     38  MAG_LEVEL_CAL, // MAG_REL + \sum_i A_i * (color_i - color_o) [color correction for average photcode]
     39  MAG_LEVEL_AVE,
     40  MAG_LEVEL_REF,
     41} dvoMagLevelType;
     42
     43typedef enum {
     44  MAG_OPTION_NONE,
     45  MAG_OPTION_MAG,
     46  MAG_OPTION_FLUX,
     47  MAG_OPTION_FLUX_ERR,
     48  MAG_OPTION_ERR,
     49  MAG_OPTION_STDEV,
     50  MAG_OPTION_CHISQ,
     51  MAG_OPTION_MIN,
     52  MAG_OPTION_MAX,
     53  MAG_OPTION_NCODE,
     54  MAG_OPTION_NPHOT, // Nused
     55  MAG_OPTION_UC_DIST,
     56  MAG_OPTION_STACK_DET_ID,
     57  MAG_OPTION_FLAGS,
     58} dvoMagOptionType;
     59
     60typedef enum {
     61  MAG_CLASS_NONE,
     62  MAG_CLASS_PSF,
     63  MAG_CLASS_KRON,
     64  MAG_CLASS_APER,
     65} dvoMagClassType;
     66
     67# if (0)
     68enum {
     69  MAG_NONE,
    2570
    2671      // these magnitude types are from the measurement table (or derived therein)
     
    5398      // these magnitude types are from the average (secfilt) table:
    5499      // the following imply PSF magnitudes (or fluxes)
    55       MAG_AVE,
    56       MAG_REF,
    57100      MAG_STDEV,
    58101      MAG_AVE_ERR,
     
    79122      MAG_UC_DIST,
    80123      MAG_STACK_DET_ID,
    81 };
     124} ;
     125# endif
    82126
    83127/* measure fields */
     
    173217      MEAS_EXTERN_ID,
    174218      MEAS_EXPNAME_AS_INT,
    175       MEAS_MCAL_OFFSET,
     219      MEAS_MCAL_OFFSET, // make this a dvoMagOption?
    176220      MEAS_FLAT,
    177221      MEAS_CENTER_OFFSET,
    178       MEAS_FLUX_PSF,
    179       MEAS_FLUX_PSF_ERR,
    180       MEAS_FLUX_KRON,
    181       MEAS_FLUX_KRON_ERR,
    182222      MEAS_REF_COLOR,
    183223};
     
    312352  int table;
    313353  int ID;
    314   int magMode;
     354
     355  dvoMagSourceType magSource; // chip, (forced) warp, stack [only relevant for averages]
     356  dvoMagLevelType magLevel;  // inst, cat, sys, rel, ave, ref, err, min, max, stdev, nphot, chisq,
     357  dvoMagOptionType magOption;  // psf, kron, aper
     358  dvoMagClassType magClass;
     359
    315360  char type;
    316361  PhotCode *photcode;
     
    374419
    375420int          GetMagMode             PROTO((char *string));
    376 PhotCode    *ParsePhotcodeField     PROTO((char *field, int *mode, int def));
     421int          ParsePhotcodeField     PROTO((dbField *field, char *fieldName));
    377422int          ParseMeasureField      PROTO((dbField *field, char *fieldName));
    378423int          ParseAverageField      PROTO((dbField *field, char *fieldName));
  • branches/eam_branches/ipp-20140610/Ohana/src/libdvo/src/LoadPhotcodesFITS.c

    r36898 r36908  
    101101  // photcode.equiv of 0 means "undefined"
    102102  for (i = 0; i < Ncode; i++) {
     103    if (!strcasecmp(photcode[i].name, "MAG")) {
     104      fprintf (stderr, "MAG is not an allowed photcode name (reserved to DVO internals)\n");
     105      free (photcode);
     106      return FALSE;
     107    }
     108
    103109    if (photcode[i].type == PHOT_DEP) {
    104110      if (photcode[i].equiv == 0) continue;
  • branches/eam_branches/ipp-20140610/Ohana/src/libdvo/src/LoadPhotcodesText.c

    r28833 r36908  
    106106        fprintf (stderr, "photcode values may not be 0: fix %s\n", name);
    107107        return (FALSE);
     108    }
     109
     110    if (!strcasecmp(name, "MAG")) {
     111      fprintf (stderr, "MAG is not an allowed photcode name (reserved to DVO internals)\n");
     112      return FALSE;
    108113    }
    109114
  • branches/eam_branches/ipp-20140610/Ohana/src/libdvo/src/dbExtractAverages.c

    r36898 r36908  
    5252dbValue dbExtractAverages (Average *average, SecFilt *secfilt, Measure *measure, dbField *field) {
    5353
    54   off_t i;
    55   int Nsec;
     54  // off_t i;
    5655  dbValue value;
    5756
     
    182181      break;
    183182
     183# if (0)
    184184    case AVE_MAG:
    185185      switch (field->magMode) {
     
    228228            }
    229229          } else {
    230             Nsec = GetPhotcodeNsec (field->photcode->code);
     230            int Nsec = GetPhotcodeNsec (field->photcode->code);
    231231            if (Nsec == -1) break;
    232232            value.Int = secfilt[Nsec].flags;
     
    236236          // XXX push these into dvo_photcode_ops APIs
    237237          // XXX do I need to allow for conversion to equiv?
    238           Nsec = GetPhotcodeNsec (field->photcode->code);
     238          int Nsec = GetPhotcodeNsec (field->photcode->code);
    239239          if (Nsec == -1) break;
    240240          value.Int = secfilt[Nsec].Ncode;
    241241          break;
    242242        case MAG_NPHOT:
    243           Nsec = GetPhotcodeNsec (field->photcode->code);
     243          int Nsec = GetPhotcodeNsec (field->photcode->code);
    244244          if (Nsec == -1) break;
    245245          value.Int = secfilt[Nsec].Nused;
     
    301301      value.Flt = PhotXm (field->photcode, average, secfilt);
    302302      break;
     303# endif
    303304    case AVE_TYPE:
    304305      break;
  • branches/eam_branches/ipp-20140610/Ohana/src/libdvo/src/dbExtractMeasures.c

    r36898 r36908  
    117117      // if we ask for g:ave, or other SEC-level values, return the corresponding field
    118118      if (field->photcode->type == PHOT_SEC) {
    119         switch (field->magMode) {
     119        switch (field->magLevel) {
    120120          // measure-like : return non-NAN if measure.equiv.photcode matches field.photcode
    121           case MAG_INST:
    122           case MAG_CAT:
    123           case MAG_SYS:
    124           case MAG_REL:
    125           case MAG_CAL:
    126           case MAG_ERR:
    127 
    128           case MAG_APER_INST:
    129           case MAG_APER_CAT:
    130           case MAG_APER_SYS:
    131           case MAG_APER_REL:
    132           case MAG_APER_CAL:
    133           case MAG_APER_ERR:
    134 
    135           case MAG_KRON_INST:
    136           case MAG_KRON_CAT:
    137           case MAG_KRON_SYS:
    138           case MAG_KRON_REL:
    139           case MAG_KRON_CAL:
    140           case MAG_KRON_ERR:
    141 
    142           case MAG_PHOT_FLAGS:
     121          case MAG_LEVEL_INST:
     122          case MAG_LEVEL_CAT:
     123          case MAG_LEVEL_SYS:
     124          case MAG_LEVEL_REL:
     125          case MAG_LEVEL_CAL:
    143126            equiv = myEquiv;
    144127            if (equiv && (equiv->code == field->photcode->code)) goto valid_photcode;
     
    146129
    147130            // mean-like : return value for the given photcode
    148           case MAG_AVE:
    149           case MAG_REF:
    150           case MAG_STDEV:
    151           case MAG_AVE_ERR:
    152           case MAG_CHISQ:
    153 
    154           case MAG_FLUX_PSF:
    155           case MAG_FLUX_PSF_ERR:
    156 
    157           case MAG_APER_AVE:
    158 
    159           case MAG_KRON_AVE:
    160           case MAG_FLUX_KRON:
    161           case MAG_FLUX_KRON_ERR:
    162 
    163           case MAG_MIN:
    164           case MAG_MAX:
    165           case MAG_UC_DIST:
    166           case MAG_STACK_DET_ID:
    167 
    168           case MAG_NCODE:
    169           case MAG_NPHOT:
     131          case MAG_LEVEL_AVE:
     132          case MAG_LEVEL_REF:
    170133            equiv = field->photcode;
    171134            goto valid_photcode;
     
    179142
    180143  valid_photcode:
    181       switch (field->magMode) {
    182         case MAG_INST:
    183           value.Flt = PhotInst (measure); 
    184           break;
    185         case MAG_CAT:
    186           value.Flt = PhotCat  (measure);
    187           break;
    188         case MAG_SYS:
    189           value.Flt = PhotSys  (measure, average, secfilt);
    190           break;
    191         case MAG_REL:
    192           value.Flt = PhotRel  (measure, average, secfilt);
    193           break;
    194         case MAG_CAL:
    195           value.Flt = PhotCal  (measure, average, secfilt, measure, equiv);
    196           break;
    197         case MAG_AVE:
    198           value.Flt = PhotAve  (equiv, average, secfilt);
    199           break;
    200         case MAG_REF:
    201           value.Flt = PhotRef  (equiv, average, secfilt, measure);
    202           break;
    203         case MAG_ERR:
    204           value.Flt = measure[0].dM;
    205           break;
    206         case MAG_AVE_ERR:
    207           value.Flt = PhotAveErr  (equiv, average, secfilt);
    208           break;
    209 
    210         case MAG_APER_INST:
    211           value.Flt = PhotAperInst (measure);
    212           break;
    213         case MAG_APER_CAT:
    214           value.Flt = PhotAperCat (measure);
    215           break;
    216         case MAG_APER_SYS:
    217           value.Flt = PhotAperSys (measure, average, secfilt);
    218           break;
    219         case MAG_APER:
    220         case MAG_APER_REL:
    221           value.Flt = PhotAperRel (measure, average, secfilt);
    222           break;
    223         case MAG_APER_CAL:
    224           value.Flt = PhotAperCal (measure, average, secfilt, measure, equiv);
    225           break;
    226         case MAG_APER_AVE:
    227           value.Flt = PhotAperAve (equiv, average, secfilt);
    228           break;
    229         case MAG_APER_REF:
    230           value.Flt = PhotAperRef (equiv, average, secfilt, measure);
    231           break;
    232         case MAG_APER_ERR:
    233           value.Flt = measure[0].dM;
    234           break;
    235 
    236         case MAG_KRON_INST:
    237           value.Flt = PhotKronInst (measure);
    238           break;
    239         case MAG_KRON_CAT:
    240           value.Flt = PhotKronCat (measure);
    241           break;
    242         case MAG_KRON_SYS:
    243           value.Flt = PhotKronSys (measure, average, secfilt);
    244           break;
    245         case MAG_KRON:
    246         case MAG_KRON_REL:
    247           value.Flt = PhotKronRel (measure, average, secfilt);
    248           break;
    249         case MAG_KRON_CAL:
    250           value.Flt = PhotKronCal (measure, average, secfilt, measure, equiv);
    251           break;
    252         case MAG_KRON_AVE:
    253           value.Flt = PhotKronAve (equiv, average, secfilt);
    254           break;
    255         case MAG_KRON_REF:
    256           value.Flt = PhotKronRef (equiv, average, secfilt, measure);
    257           break;
    258         case MAG_KRON_ERR:
    259           value.Flt = measure[0].dMkron;
    260           break;
    261 
    262         case MAG_PHOT_FLAGS:
    263           if ((field->photcode->type == PHOT_REF) || (field->photcode->type == PHOT_DEP)) {
    264             value.Int = measure[0].photFlags;
     144      switch (field->magOption) {
     145        case MAG_OPTION_MAG:
     146          switch (field->magLevel) {
     147            case MAG_LEVEL_INST:
     148              value.Flt = PhotInst (measure, field->magClass); 
     149              break;
     150            case MAG_LEVEL_CAT:
     151              value.Flt = PhotCat  (measure, field->magClass);
     152              break;
     153            case MAG_LEVEL_SYS:
     154              value.Flt = PhotSys  (measure, average, secfilt, field->magClass);
     155              break;
     156            case MAG_LEVEL_REL:
     157              value.Flt = PhotRel  (measure, average, secfilt, field->magClass);
     158              break;
     159            case MAG_LEVEL_CAL:
     160              value.Flt = PhotCal  (measure, average, secfilt, measure, equiv, field->magClass);
     161              break;
     162            case MAG_LEVEL_AVE:
     163              value.Flt = PhotAve  (equiv, average, secfilt, field->magClass, field->magSource);
     164              break;
     165            case MAG_LEVEL_REF:
     166              value.Flt = PhotRef  (equiv, average, secfilt, measure, field->magClass, field->magSource);
     167              break;
     168            case MAG_LEVEL_NONE:
     169              break;
    265170          }
    266171          break;
    267 
    268         case MAG_NCODE:
    269           if (equiv == NULL) break;
    270           Nsec = GetPhotcodeNsec (equiv->code);
    271           if (Nsec == -1) break;
    272           value.Int = secfilt[Nsec].Ncode;
     172        case MAG_OPTION_ERR:
     173          switch (field->magLevel) {
     174            case MAG_LEVEL_INST:
     175            case MAG_LEVEL_CAT:
     176            case MAG_LEVEL_SYS:
     177            case MAG_LEVEL_REL:
     178            case MAG_LEVEL_CAL:
     179              value.Flt = PhotErr (measure, field->magClass); 
     180              break;
     181            case MAG_LEVEL_AVE:
     182            case MAG_LEVEL_REF:
     183              value.Flt = PhotAveErr (equiv, average, secfilt, field->magClass, field->magSource); 
     184              break;
     185            case MAG_LEVEL_NONE:
     186              break;
     187          }
    273188          break;
    274         case MAG_NPHOT:
    275           if (equiv == NULL) break;
    276           Nsec = GetPhotcodeNsec (equiv->code);
    277           if (Nsec == -1) break;
    278           value.Int = secfilt[Nsec].Nused;
    279           break;
    280 
    281         case MAG_CHISQ:
    282           value.Flt = PhotXm (equiv, average, secfilt);
    283           break;
    284         case MAG_STDEV:
    285           value.Flt = PhotMstdev (equiv, average, secfilt);
    286           break;
    287         case MAG_MIN:
    288           value.Flt = PhotMmin (equiv, average, secfilt);
    289           break;
    290         case MAG_MAX:
    291           value.Flt = PhotMmax (equiv, average, secfilt);
    292           break;
    293         case MAG_UC_DIST:
    294           value.Flt = PhotUCdist (equiv, average, secfilt);
    295           break;
    296 
    297         case MAG_FLUX_PSF:
    298           value.Flt = PhotAveFluxPSF (field->photcode, average, secfilt);
    299           break;
    300         case MAG_FLUX_PSF_ERR:
    301           value.Flt = PhotAvedFluxPSF (field->photcode, average, secfilt);
    302           break;
    303         case MAG_FLUX_KRON:
    304           value.Flt = PhotAveFluxKron (field->photcode, average, secfilt);
    305           break;
    306         case MAG_FLUX_KRON_ERR:
    307           value.Flt = PhotAvedFluxKron (field->photcode, average, secfilt);
     189
     190        case MAG_OPTION_FLUX:
     191        case MAG_OPTION_FLUX_ERR:
     192        case MAG_OPTION_STDEV:
     193        case MAG_OPTION_CHISQ:
     194        case MAG_OPTION_MIN:
     195        case MAG_OPTION_MAX:
     196        case MAG_OPTION_NCODE:
     197        case MAG_OPTION_NPHOT:
     198        case MAG_OPTION_UC_DIST:
     199        case MAG_OPTION_STACK_DET_ID:
     200        case MAG_OPTION_FLAGS:
     201        case MAG_OPTION_NONE:
    308202          break;
    309203      }
     
    777671      break;
    778672
    779     case MEAS_FLUX_PSF: /* OK */
    780       value.Flt = measure[0].FluxPSF;
    781       break;
    782     case MEAS_FLUX_PSF_ERR: /* OK */
    783       value.Flt = measure[0].dFluxPSF;
    784       break;
    785     case MEAS_FLUX_KRON: /* OK */
    786       value.Flt = measure[0].FluxKron;
    787       break;
    788     case MEAS_FLUX_KRON_ERR: /* OK */
    789       value.Flt = measure[0].dFluxKron;
    790       break;
     673    // case MEAS_FLUX_PSF: /* OK */
     674    //   value.Flt = measure[0].FluxPSF;
     675    //   break;
     676    // case MEAS_FLUX_PSF_ERR: /* OK */
     677    //   value.Flt = measure[0].dFluxPSF;
     678    //   break;
     679    // case MEAS_FLUX_KRON: /* OK */
     680    //   value.Flt = measure[0].FluxKron;
     681    //   break;
     682    // case MEAS_FLUX_KRON_ERR: /* OK */
     683    //   value.Flt = measure[0].dFluxKron;
     684    //   break;
    791685  }
    792686  return (value);
  • branches/eam_branches/ipp-20140610/Ohana/src/libdvo/src/dbFields.c

    r36898 r36908  
    99  for (i = 0; i < Nfields; i++) {
    1010    if (fields[i].name != NULL) free (fields[i].name);
    11     if (fields[i].photcode != NULL) {
    12       if (fields[i].photcode[0].type == PHOT_MAG) {
    13         free (fields[i].photcode);
    14       }
    15     }
    1611  }
    1712  free (fields);
     
    2419  field->ID = 0;
    2520  field->type = OPIHI_FLT;
    26   field->magMode = 0;
     21
     22  field->magSource = MAG_SRC_NONE;
     23  field->magLevel  = MAG_LEVEL_NONE;
     24  field->magClass  = MAG_CLASS_NONE;
     25  field->magOption = MAG_OPTION_NONE;
     26
    2727  field->photcode = NULL;
    2828}
    2929
     30dvoMagSourceType GetMagSource (char *string) {
     31
     32  if (!strcasecmp (string, "chip")) return (MAG_SRC_CHP);
     33  if (!strcasecmp (string, "warp")) return (MAG_SRC_WRP);
     34  if (!strcasecmp (string, "stack")) return (MAG_SRC_STK);
     35
     36  if (!strcasecmp (string, "chp")) return (MAG_SRC_CHP);
     37  if (!strcasecmp (string, "wrp")) return (MAG_SRC_WRP);
     38  if (!strcasecmp (string, "stk")) return (MAG_SRC_STK);
     39
     40  return MAG_SRC_NONE;
     41}
     42
     43dvoMagLevelType GetMagLevel (char *string) {
     44
     45  if (!strcasecmp (string, "inst")) return (MAG_LEVEL_INST);
     46  if (!strcasecmp (string, "cat"))  return (MAG_LEVEL_CAT);
     47  if (!strcasecmp (string, "sys"))  return (MAG_LEVEL_SYS);
     48  if (!strcasecmp (string, "rel"))  return (MAG_LEVEL_REL);
     49  if (!strcasecmp (string, "cal"))  return (MAG_LEVEL_CAL);
     50  if (!strcasecmp (string, "ave"))  return (MAG_LEVEL_AVE);
     51  if (!strcasecmp (string, "ref"))  return (MAG_LEVEL_REF);
     52
     53  return MAG_LEVEL_NONE;
     54}
     55
     56dvoMagClassType GetMagClass (char *string) {
     57
     58  if (!strcasecmp (string, "psf"))   return (MAG_CLASS_PSF);
     59  if (!strcasecmp (string, "kron"))  return (MAG_CLASS_KRON);
     60  if (!strcasecmp (string, "aper"))  return (MAG_CLASS_APER);
     61  if (!strcasecmp (string, "ap"))    return (MAG_CLASS_APER);
     62
     63  return MAG_CLASS_NONE;
     64}
     65
     66dvoMagOptionType GetMagOption (char *string) {
     67
     68  if (!strcasecmp (string, "mag"))          return (MAG_OPTION_MAG);
     69  if (!strcasecmp (string, "flux"))         return (MAG_OPTION_FLUX);
     70  if (!strcasecmp (string, "fluxerr"))      return (MAG_OPTION_FLUX_ERR);
     71  if (!strcasecmp (string, "err"))          return (MAG_OPTION_ERR);
     72  if (!strcasecmp (string, "stdev"))        return (MAG_OPTION_STDEV);
     73  if (!strcasecmp (string, "chisq"))        return (MAG_OPTION_CHISQ);
     74  if (!strcasecmp (string, "min"))          return (MAG_OPTION_MIN);
     75  if (!strcasecmp (string, "max"))          return (MAG_OPTION_MAX);
     76  if (!strcasecmp (string, "ncode"))        return (MAG_OPTION_NCODE);
     77  if (!strcasecmp (string, "nphot"))        return (MAG_OPTION_NPHOT);
     78  if (!strcasecmp (string, "uc_dist"))      return (MAG_OPTION_UC_DIST);
     79  if (!strcasecmp (string, "stack_det_id")) return (MAG_OPTION_STACK_DET_ID);
     80  if (!strcasecmp (string, "flags"))        return (MAG_OPTION_FLAGS);
     81
     82  return MAG_OPTION_NONE;
     83}
     84
     85# if (0)
    3086int GetMagMode (char *string) {
    3187
     
    95151  return (MAG_NONE);
    96152}
    97 
    98 PhotCode *ParsePhotcodeField (char *field, int *mode, int defMode) {
    99 
    100   int useDefault;
    101   char *tmpstring, *p;
    102   PhotCode *code;
    103 
    104   *mode = defMode;
    105   useDefault = TRUE;
    106 
    107   p = strchr (field, ':');
    108   if (p != NULL) {
    109     *mode = GetMagMode (p + 1);
    110     useDefault = FALSE;
    111     if (*mode == MAG_NONE) return (NULL);
    112     tmpstring = strncreate (field, p - field);
    113   } else {
    114     tmpstring = strcreate (field);
    115   }
    116   if (!strcasecmp (tmpstring, "MAG")) {
    117     ALLOCATE (code, PhotCode, 1);
    118     code[0].code = 0;
    119     strcpy (code[0].name, "MAG");
    120     code[0].type = PHOT_MAG;
    121     // the field call 'mag' is only valid for mextract
    122     // it should default to REL, but other types should default to AVE
    123     if (useDefault) {
    124       *mode = MAG_REL;
     153# endif
     154
     155// field may be of the form mag:psf:inst:wrp.  except for the first subword,
     156// the words may be in any order
     157int ParsePhotcodeField (dbField *field, char *fieldName) {
     158
     159  int j;
     160
     161  // defaults:
     162  field->ID = MEAS_MAG; // change if not true in the end?
     163  field->magSource = MAG_SRC_CHP;
     164  field->magLevel  = MAG_LEVEL_AVE;
     165  field->magClass  = MAG_CLASS_PSF;
     166  field->magOption = MAG_OPTION_MAG;
     167
     168  // make a local working copy of fieldName and replace ':' with spaces
     169  char *fieldCopy = strcreate(fieldName);
     170  for (j = 0; fieldCopy[j]; j++) {
     171    if (fieldCopy[j] == ':') fieldCopy[j] = ' ';
     172  }
     173
     174  char *firstWord = getword(fieldCopy);
     175 
     176  // firstWord may be either mag [mextract] or photcode
     177  if (!strcasecmp (firstWord, "MAG")) {
     178    // default level for 'mag' is rel
     179    field->magLevel  = MAG_LEVEL_REL;
     180  }
     181  PhotCode *code = GetPhotcodebyName (firstWord);
     182  free (firstWord);
     183
     184  if (!code) return FALSE;
     185
     186  // enforce compatibility
     187  if (code->type == PHOT_REF) {
     188    field->magLevel = MAG_LEVEL_CAT;
     189  }
     190  if (code->type == PHOT_DEP) {
     191    field->magLevel = MAG_LEVEL_REL;
     192  }
     193 
     194  // look at the remaining words and assign properties as approrpiate
     195  char *ptr = skipword(fieldCopy);
     196  while (ptr) {
     197
     198    char *word = getword(ptr);
     199    if (!word) break;
     200   
     201    dvoMagSourceType source = GetMagSource (word);
     202    if (source != MAG_SRC_NONE) {
     203      field->magSource = source;
     204      ptr = skipword (ptr);
     205      continue;
    125206    }
    126     free (tmpstring);
    127     return (code);
    128   }
    129   code = GetPhotcodebyName (tmpstring);
    130   if (!code) {
    131       return NULL;
    132   }
    133 
    134   // enforce compatibility
    135   if (useDefault) {
    136     if (code[0].type == PHOT_REF) {
    137       *mode = MAG_CAT;
     207
     208    dvoMagLevelType level = GetMagLevel (word);
     209    if (level != MAG_LEVEL_NONE) {
     210      field->magLevel = level;
     211      ptr = skipword (ptr);
     212      continue;
    138213    }
    139     if (code[0].type == PHOT_DEP) {
    140       *mode = MAG_REL;
     214
     215    dvoMagClassType class = GetMagClass (word);
     216    if (class != MAG_CLASS_NONE) {
     217      field->magClass = class;
     218      ptr = skipword (ptr);
     219      continue;
    141220    }
    142   }
    143   free (tmpstring);
    144   return (code);
    145 }
    146 
    147 # define ESCAPE(F,M,T) { \
    148   field->ID = (F); \
    149   field->magMode = (M); \
    150   field->type = (T); \
    151   field->photcode = NULL; \
    152   return (TRUE); }
    153 
    154 int ParseMeasureField (dbField *field, char *fieldName) {
    155 
    156   int mode;
    157   PhotCode *code;
    158 
    159   field->table = DVO_TABLE_MEASURE;
    160   field->name  = strcreate (fieldName);
    161 
    162   if (!strcasecmp (fieldName, "GLON"))       {
    163     dbExtractMeasuresInitTransform (COORD_GALACTIC);
    164     ESCAPE (MEAS_GLON, MAG_NONE, OPIHI_FLT);
    165   }
    166   if (!strcasecmp (fieldName, "GLAT")) {
    167     dbExtractMeasuresInitTransform (COORD_GALACTIC);
    168     ESCAPE (MEAS_GLAT, MAG_NONE, OPIHI_FLT);
    169   }
    170   if (!strcasecmp (fieldName, "GLON:AVE")) {
    171     dbExtractMeasuresInitTransform (COORD_GALACTIC);
    172     ESCAPE (MEAS_GLON_AVE, MAG_NONE, OPIHI_FLT);
    173   }
    174   if (!strcasecmp (fieldName, "GLAT:AVE")) {
    175     dbExtractMeasuresInitTransform (COORD_GALACTIC);
    176     ESCAPE (MEAS_GLAT_AVE, MAG_NONE, OPIHI_FLT);
    177   }
    178 
    179   if (!strcasecmp (fieldName, "ELON"))       {
    180     dbExtractMeasuresInitTransform (COORD_ECLIPTIC);
    181     ESCAPE (MEAS_ELON, MAG_NONE, OPIHI_FLT);
    182   }
    183   if (!strcasecmp (fieldName, "ELAT")) {
    184     dbExtractMeasuresInitTransform (COORD_ECLIPTIC);
    185     ESCAPE (MEAS_ELAT, MAG_NONE, OPIHI_FLT);
    186   }
    187   if (!strcasecmp (fieldName, "ELON:AVE")) {
    188     dbExtractMeasuresInitTransform (COORD_ECLIPTIC);
    189     ESCAPE (MEAS_ELON_AVE, MAG_NONE, OPIHI_FLT);
    190   }
    191   if (!strcasecmp (fieldName, "ELAT:AVE")) {
    192     dbExtractMeasuresInitTransform (COORD_ECLIPTIC);
    193     ESCAPE (MEAS_ELAT_AVE, MAG_NONE, OPIHI_FLT);
    194   }
    195 
    196   if (!strcasecmp (fieldName, "RA"))             ESCAPE (MEAS_RA,             MAG_NONE, OPIHI_FLT);
    197   if (!strcasecmp (fieldName, "DEC"))            ESCAPE (MEAS_DEC,            MAG_NONE, OPIHI_FLT);
    198   if (!strcasecmp (fieldName, "RA:AVE"))         ESCAPE (MEAS_RA_AVE,         MAG_NONE, OPIHI_FLT);
    199   if (!strcasecmp (fieldName, "DEC:AVE"))        ESCAPE (MEAS_DEC_AVE,        MAG_NONE, OPIHI_FLT);
    200   if (!strcasecmp (fieldName, "RA:ERR"))         ESCAPE (MEAS_RA_AVE_ERR,     MAG_NONE, OPIHI_FLT);
    201   if (!strcasecmp (fieldName, "DEC:ERR"))        ESCAPE (MEAS_DEC_AVE_ERR,    MAG_NONE, OPIHI_FLT);
    202   if (!strcasecmp (fieldName, "uRA"))            ESCAPE (MEAS_U_RA,           MAG_NONE, OPIHI_FLT);
    203   if (!strcasecmp (fieldName, "uDEC"))           ESCAPE (MEAS_U_DEC,          MAG_NONE, OPIHI_FLT);
    204   if (!strcasecmp (fieldName, "duRA"))           ESCAPE (MEAS_U_RA_ERR,       MAG_NONE, OPIHI_FLT);
    205   if (!strcasecmp (fieldName, "duDEC"))          ESCAPE (MEAS_U_DEC_ERR,      MAG_NONE, OPIHI_FLT);
    206   if (!strcasecmp (fieldName, "PAR"))            ESCAPE (MEAS_PAR,            MAG_NONE, OPIHI_FLT);
    207   if (!strcasecmp (fieldName, "dPAR"))           ESCAPE (MEAS_PAR_ERR,        MAG_NONE, OPIHI_FLT);
    208   if (!strcasecmp (fieldName, "dR"))             ESCAPE (MEAS_RA_OFFSET,      MAG_NONE, OPIHI_FLT);
    209   if (!strcasecmp (fieldName, "dD"))             ESCAPE (MEAS_DEC_OFFSET,     MAG_NONE, OPIHI_FLT);
    210   if (!strcasecmp (fieldName, "dR:FIT"))         ESCAPE (MEAS_RA_FIT_OFFSET,  MAG_NONE, OPIHI_FLT);
    211   if (!strcasecmp (fieldName, "dD:FIT"))         ESCAPE (MEAS_DEC_FIT_OFFSET, MAG_NONE, OPIHI_FLT);
    212   if (!strcasecmp (fieldName, "dR:ERR"))         ESCAPE (MEAS_RA_OFFSET_ERR,  MAG_NONE, OPIHI_FLT);
    213   if (!strcasecmp (fieldName, "dD:ERR"))         ESCAPE (MEAS_DEC_OFFSET_ERR, MAG_NONE, OPIHI_FLT);
    214   if (!strcasecmp (fieldName, "ChiSqPos"))       ESCAPE (MEAS_CHISQ_POS,      MAG_NONE, OPIHI_FLT);
    215   if (!strcasecmp (fieldName, "ChiSqPM"))        ESCAPE (MEAS_CHISQ_PM,       MAG_NONE, OPIHI_FLT);
    216   if (!strcasecmp (fieldName, "ChiSqPar"))       ESCAPE (MEAS_CHISQ_PAR,      MAG_NONE, OPIHI_FLT);
    217   if (!strcasecmp (fieldName, "Tmean"))          ESCAPE (MEAS_TMEAN,          MAG_NONE, OPIHI_FLT);
    218   if (!strcasecmp (fieldName, "Trange"))         ESCAPE (MEAS_TRANGE,         MAG_NONE, OPIHI_FLT);
    219   if (!strcasecmp (fieldName, "nmeas"))          ESCAPE (MEAS_NMEAS,          MAG_NONE, OPIHI_INT);
    220   if (!strcasecmp (fieldName, "nmiss"))          ESCAPE (MEAS_NMISS,          MAG_NONE, OPIHI_INT);
    221   if (!strcasecmp (fieldName, "npos"))           ESCAPE (MEAS_NPOS,           MAG_NONE, OPIHI_INT);
    222   if (!strcasecmp (fieldName, "OBJFLAGS"))       ESCAPE (MEAS_OBJ_FLAGS,      MAG_NONE, OPIHI_INT);
    223   if (!strcasecmp (fieldName, "OBJ_FLAGS"))      ESCAPE (MEAS_OBJ_FLAGS,      MAG_NONE, OPIHI_INT);
    224   if (!strcasecmp (fieldName, "OBJ_PHOT_FLAGS")) ESCAPE (MEAS_SECFILT_FLAGS,      MAG_NONE, OPIHI_INT);
    225   if (!strcasecmp (fieldName, "SECFLAGS"))       ESCAPE (MEAS_SECFILT_FLAGS,      MAG_NONE, OPIHI_INT);
    226   if (!strcasecmp (fieldName, "SEC_FLAGS"))      ESCAPE (MEAS_SECFILT_FLAGS,      MAG_NONE, OPIHI_INT);
    227   if (!strcasecmp (fieldName, "SECFILT_FLAGS"))  ESCAPE (MEAS_SECFILT_FLAGS,      MAG_NONE, OPIHI_INT);
    228   if (!strcasecmp (fieldName, "DB_FLAGS"))       ESCAPE (MEAS_DB_FLAGS,       MAG_NONE, OPIHI_INT);
    229   if (!strcasecmp (fieldName, "PHOT_FLAGS"))     ESCAPE (MEAS_PHOT_FLAGS,     MAG_NONE, OPIHI_INT);
    230   if (!strcasecmp (fieldName, "DBFLAGS"))        ESCAPE (MEAS_DB_FLAGS,       MAG_NONE, OPIHI_INT);
    231   if (!strcasecmp (fieldName, "PHOTFLAGS"))      ESCAPE (MEAS_PHOT_FLAGS,     MAG_NONE, OPIHI_INT);
    232   if (!strcasecmp (fieldName, "AIRMASS"))        ESCAPE (MEAS_AIRMASS,        MAG_NONE, OPIHI_FLT);
    233   if (!strcasecmp (fieldName, "MEAN_AIRMASS"))   ESCAPE (MEAS_MEAN_AIRMASS,   MAG_NONE, OPIHI_FLT);
    234   if (!strcasecmp (fieldName, "ALT"))            ESCAPE (MEAS_ALT,            MAG_NONE, OPIHI_FLT);
    235   if (!strcasecmp (fieldName, "AZ"))             ESCAPE (MEAS_AZ,             MAG_NONE, OPIHI_FLT);
    236   if (!strcasecmp (fieldName, "EXPTIME"))        ESCAPE (MEAS_EXPTIME,        MAG_NONE, OPIHI_FLT);
    237   if (!strcasecmp (fieldName, "PHOTCODE"))       ESCAPE (MEAS_PHOTCODE,       MAG_NONE, OPIHI_INT);
    238   if (!strcasecmp (fieldName, "PHOTCODE:KLAM"))  ESCAPE (MEAS_PHOTCODE_KLAM,  MAG_NONE, OPIHI_FLT);
    239   if (!strcasecmp (fieldName, "PHOTCODE:C"))     ESCAPE (MEAS_PHOTCODE_C,     MAG_NONE, OPIHI_FLT);
    240   if (!strcasecmp (fieldName, "PHOTCODE:EQUIV")) ESCAPE (MEAS_PHOTCODE_EQUIV, MAG_NONE, OPIHI_INT);
    241   if (!strcasecmp (fieldName, "TIME"))           ESCAPE (MEAS_TIME,           MAG_NONE, OPIHI_FLT);
    242   if (!strcasecmp (fieldName, "FWHM"))           ESCAPE (MEAS_FWHM,           MAG_NONE, OPIHI_FLT);
    243   if (!strcasecmp (fieldName, "FWHM_MAJ"))       ESCAPE (MEAS_FWHM_MAJ,       MAG_NONE, OPIHI_FLT);
    244   if (!strcasecmp (fieldName, "FWHM_MIN"))       ESCAPE (MEAS_FWHM_MIN,       MAG_NONE, OPIHI_FLT);
    245   if (!strcasecmp (fieldName, "THETA"))          ESCAPE (MEAS_THETA,          MAG_NONE, OPIHI_FLT);
    246   if (!strcasecmp (fieldName, "POSANGLE"))       ESCAPE (MEAS_POSANGLE,       MAG_NONE, OPIHI_FLT);
    247   if (!strcasecmp (fieldName, "PLATESCALE"))     ESCAPE (MEAS_PLATESCALE,     MAG_NONE, OPIHI_FLT);
    248   if (!strcasecmp (fieldName, "MXX"))            ESCAPE (MEAS_MXX,            MAG_NONE, OPIHI_FLT);
    249   if (!strcasecmp (fieldName, "MYY"))            ESCAPE (MEAS_MYY,            MAG_NONE, OPIHI_FLT);
    250   if (!strcasecmp (fieldName, "MXY"))            ESCAPE (MEAS_MXY,            MAG_NONE, OPIHI_FLT);
    251   if (!strcasecmp (fieldName, "DOPHOT"))         ESCAPE (MEAS_DOPHOT,         MAG_NONE, OPIHI_INT);
    252   if (!strcasecmp (fieldName, "XCCD"))           ESCAPE (MEAS_XCCD,           MAG_NONE, OPIHI_FLT);
    253   if (!strcasecmp (fieldName, "YCCD"))           ESCAPE (MEAS_YCCD,           MAG_NONE, OPIHI_FLT);
    254   if (!strcasecmp (fieldName, "XCCD:ERR"))       ESCAPE (MEAS_XCCD_ERR,       MAG_NONE, OPIHI_FLT);
    255   if (!strcasecmp (fieldName, "YCCD:ERR"))       ESCAPE (MEAS_YCCD_ERR,       MAG_NONE, OPIHI_FLT);
    256   if (!strcasecmp (fieldName, "XFIX"))           ESCAPE (MEAS_XFIX,           MAG_NONE, OPIHI_FLT);
    257   if (!strcasecmp (fieldName, "YFIX"))           ESCAPE (MEAS_YFIX,           MAG_NONE, OPIHI_FLT);
    258   if (!strcasecmp (fieldName, "POS_SYS_ERR"))    ESCAPE (MEAS_POS_SYS_ERR,    MAG_NONE, OPIHI_FLT);
    259   if (!strcasecmp (fieldName, "XFIELD"))         ESCAPE (MEAS_XFIELD,         MAG_NONE, OPIHI_FLT);
    260   if (!strcasecmp (fieldName, "YFIELD"))         ESCAPE (MEAS_YFIELD,         MAG_NONE, OPIHI_FLT);
    261   if (!strcasecmp (fieldName, "XMOSAIC"))        ESCAPE (MEAS_XMOSAIC,        MAG_NONE, OPIHI_FLT);
    262   if (!strcasecmp (fieldName, "YMOSAIC"))        ESCAPE (MEAS_YMOSAIC,        MAG_NONE, OPIHI_FLT);
    263   if (!strcasecmp (fieldName, "XCHIP"))          ESCAPE (MEAS_XCCD,           MAG_NONE, OPIHI_FLT);
    264   if (!strcasecmp (fieldName, "YCHIP"))          ESCAPE (MEAS_YCCD,           MAG_NONE, OPIHI_FLT);
    265   if (!strcasecmp (fieldName, "XFPA"))           ESCAPE (MEAS_XMOSAIC,        MAG_NONE, OPIHI_FLT);
    266   if (!strcasecmp (fieldName, "YFPA"))           ESCAPE (MEAS_YMOSAIC,        MAG_NONE, OPIHI_FLT);
    267   if (!strcasecmp (fieldName, "DETID"))          ESCAPE (MEAS_DET_ID,         MAG_NONE, OPIHI_INT);
    268   if (!strcasecmp (fieldName, "OBJID"))          ESCAPE (MEAS_OBJ_ID,         MAG_NONE, OPIHI_INT);
    269   if (!strcasecmp (fieldName, "CATID"))          ESCAPE (MEAS_CAT_ID,         MAG_NONE, OPIHI_INT);
    270   if (!strcasecmp (fieldName, "IMAGEID"))        ESCAPE (MEAS_IMAGE_ID,       MAG_NONE, OPIHI_INT);
    271   if (!strcasecmp (fieldName, "EXTERNID"))       ESCAPE (MEAS_EXTERN_ID,      MAG_NONE, OPIHI_INT);
    272   if (!strcasecmp (fieldName, "EXPNAME"))        ESCAPE (MEAS_EXPNAME_AS_INT, MAG_NONE, OPIHI_INT);
    273   if (!strcasecmp (fieldName, "PSF_QF"))         ESCAPE (MEAS_PSF_QF,         MAG_NONE, OPIHI_FLT);
    274   if (!strcasecmp (fieldName, "PSF_QF_PERFECT")) ESCAPE (MEAS_PSF_QF_PERFECT, MAG_NONE, OPIHI_FLT);
    275   if (!strcasecmp (fieldName, "PSF_CHISQ"))      ESCAPE (MEAS_PSF_CHISQ,      MAG_NONE, OPIHI_FLT);
    276   if (!strcasecmp (fieldName, "PSF_NDOF"))       ESCAPE (MEAS_PSF_NDOF,       MAG_NONE, OPIHI_INT);
    277   if (!strcasecmp (fieldName, "PSF_NPIX"))       ESCAPE (MEAS_PSF_NPIX,       MAG_NONE, OPIHI_INT);
    278   if (!strcasecmp (fieldName, "CR_NSIGMA"))      ESCAPE (MEAS_CR_NSIGMA,      MAG_NONE, OPIHI_FLT);
    279   if (!strcasecmp (fieldName, "EXT_NSIGMA"))     ESCAPE (MEAS_EXT_NSIGMA,     MAG_NONE, OPIHI_FLT);
    280   if (!strcasecmp (fieldName, "SKY"))            ESCAPE (MEAS_SKY,            MAG_NONE, OPIHI_FLT);
    281   if (!strcasecmp (fieldName, "SKY_ERR"))        ESCAPE (MEAS_dSKY,           MAG_NONE, OPIHI_FLT);
    282   if (!strcasecmp (fieldName, "MCAL_OFFSET"))    ESCAPE (MEAS_MCAL_OFFSET,    MAG_NONE, OPIHI_FLT);
    283   if (!strcasecmp (fieldName, "FLAT"))           ESCAPE (MEAS_FLAT,           MAG_NONE, OPIHI_FLT);
    284   if (!strcasecmp (fieldName, "CENTER_OFFSET"))  ESCAPE (MEAS_CENTER_OFFSET,  MAG_NONE, OPIHI_FLT);
    285   if (!strcasecmp (fieldName, "FLUX"))           ESCAPE (MEAS_FLUX_PSF,       MAG_NONE, OPIHI_FLT);
    286   if (!strcasecmp (fieldName, "FLUX_ERR"))       ESCAPE (MEAS_FLUX_PSF_ERR,   MAG_NONE, OPIHI_FLT);
    287   if (!strcasecmp (fieldName, "FLUX_PSF"))       ESCAPE (MEAS_FLUX_PSF,       MAG_NONE, OPIHI_FLT);
    288   if (!strcasecmp (fieldName, "FLUX_PSF_ERR"))   ESCAPE (MEAS_FLUX_PSF_ERR,   MAG_NONE, OPIHI_FLT);
    289   if (!strcasecmp (fieldName, "FLUX_KRON"))      ESCAPE (MEAS_FLUX_KRON,      MAG_NONE, OPIHI_FLT);
    290   if (!strcasecmp (fieldName, "FLUX_KRON_ERR"))  ESCAPE (MEAS_FLUX_KRON_ERR,  MAG_NONE, OPIHI_FLT);
    291   if (!strcasecmp (fieldName, "REF_COLOR"))      ESCAPE (MEAS_REF_COLOR,      MAG_NONE, OPIHI_FLT);
    292 
    293   // for words that don't parse, try a photcode
    294 
    295   // check for code:mode in photcode name
    296   code = ParsePhotcodeField (fieldName, &mode, MAG_AVE);
    297   if (code == NULL) {
    298     gprint (GP_ERR, "unknown field '%s' for measurement table in DVO database\n", fieldName);
    299     return (FALSE);
    300   }
    301 
    302   field->ID = MEAS_MAG;
    303   field->magMode = mode;
    304   switch (mode) {
    305     case MAG_STACK_DET_ID:
    306     case MAG_NCODE:
    307     case MAG_NPHOT:
    308     case MAG_PHOT_FLAGS:
     221
     222    dvoMagOptionType option = GetMagOption (word);
     223    if (option != MAG_OPTION_NONE) {
     224      field->magOption = option;
     225      ptr = skipword (ptr);
     226      continue;
     227    }
     228
     229    fprintf (stderr, "ERROR: unknown mag/photocode argument %s\n", word);
     230    free (word);
     231  }
     232
     233  switch (field->magOption) {
     234    case MAG_OPTION_STACK_DET_ID:
     235    case MAG_OPTION_NCODE:
     236    case MAG_OPTION_NPHOT:
     237    case MAG_OPTION_FLAGS:
    309238      field->type = OPIHI_INT;
    310239      break;
     
    314243  }
    315244  field->photcode = code;
     245  return TRUE;
     246}
     247
     248// field needs to be initialized with dbInitField()
     249# define ESCAPE(F,T) { \
     250  field->ID = (F); \
     251  field->type = (T); \
     252  return (TRUE); }
     253
     254int ParseMeasureField (dbField *field, char *fieldName) {
     255
     256  field->table = DVO_TABLE_MEASURE;
     257  field->name  = strcreate (fieldName);
     258
     259  if (!strcasecmp (fieldName, "GLON"))       {
     260    dbExtractMeasuresInitTransform (COORD_GALACTIC);
     261    ESCAPE (MEAS_GLON, OPIHI_FLT);
     262  }
     263  if (!strcasecmp (fieldName, "GLAT")) {
     264    dbExtractMeasuresInitTransform (COORD_GALACTIC);
     265    ESCAPE (MEAS_GLAT, OPIHI_FLT);
     266  }
     267  if (!strcasecmp (fieldName, "GLON:AVE")) {
     268    dbExtractMeasuresInitTransform (COORD_GALACTIC);
     269    ESCAPE (MEAS_GLON_AVE, OPIHI_FLT);
     270  }
     271  if (!strcasecmp (fieldName, "GLAT:AVE")) {
     272    dbExtractMeasuresInitTransform (COORD_GALACTIC);
     273    ESCAPE (MEAS_GLAT_AVE, OPIHI_FLT);
     274  }
     275
     276  if (!strcasecmp (fieldName, "ELON"))       {
     277    dbExtractMeasuresInitTransform (COORD_ECLIPTIC);
     278    ESCAPE (MEAS_ELON, OPIHI_FLT);
     279  }
     280  if (!strcasecmp (fieldName, "ELAT")) {
     281    dbExtractMeasuresInitTransform (COORD_ECLIPTIC);
     282    ESCAPE (MEAS_ELAT, OPIHI_FLT);
     283  }
     284  if (!strcasecmp (fieldName, "ELON:AVE")) {
     285    dbExtractMeasuresInitTransform (COORD_ECLIPTIC);
     286    ESCAPE (MEAS_ELON_AVE, OPIHI_FLT);
     287  }
     288  if (!strcasecmp (fieldName, "ELAT:AVE")) {
     289    dbExtractMeasuresInitTransform (COORD_ECLIPTIC);
     290    ESCAPE (MEAS_ELAT_AVE, OPIHI_FLT);
     291  }
     292
     293  if (!strcasecmp (fieldName, "RA"))             ESCAPE (MEAS_RA,             OPIHI_FLT);
     294  if (!strcasecmp (fieldName, "DEC"))            ESCAPE (MEAS_DEC,            OPIHI_FLT);
     295  if (!strcasecmp (fieldName, "RA:AVE"))         ESCAPE (MEAS_RA_AVE,         OPIHI_FLT);
     296  if (!strcasecmp (fieldName, "DEC:AVE"))        ESCAPE (MEAS_DEC_AVE,        OPIHI_FLT);
     297  if (!strcasecmp (fieldName, "RA:ERR"))         ESCAPE (MEAS_RA_AVE_ERR,     OPIHI_FLT);
     298  if (!strcasecmp (fieldName, "DEC:ERR"))        ESCAPE (MEAS_DEC_AVE_ERR,    OPIHI_FLT);
     299  if (!strcasecmp (fieldName, "uRA"))            ESCAPE (MEAS_U_RA,           OPIHI_FLT);
     300  if (!strcasecmp (fieldName, "uDEC"))           ESCAPE (MEAS_U_DEC,          OPIHI_FLT);
     301  if (!strcasecmp (fieldName, "duRA"))           ESCAPE (MEAS_U_RA_ERR,       OPIHI_FLT);
     302  if (!strcasecmp (fieldName, "duDEC"))          ESCAPE (MEAS_U_DEC_ERR,      OPIHI_FLT);
     303  if (!strcasecmp (fieldName, "PAR"))            ESCAPE (MEAS_PAR,            OPIHI_FLT);
     304  if (!strcasecmp (fieldName, "dPAR"))           ESCAPE (MEAS_PAR_ERR,        OPIHI_FLT);
     305  if (!strcasecmp (fieldName, "dR"))             ESCAPE (MEAS_RA_OFFSET,      OPIHI_FLT);
     306  if (!strcasecmp (fieldName, "dD"))             ESCAPE (MEAS_DEC_OFFSET,     OPIHI_FLT);
     307  if (!strcasecmp (fieldName, "dR:FIT"))         ESCAPE (MEAS_RA_FIT_OFFSET,  OPIHI_FLT);
     308  if (!strcasecmp (fieldName, "dD:FIT"))         ESCAPE (MEAS_DEC_FIT_OFFSET, OPIHI_FLT);
     309  if (!strcasecmp (fieldName, "dR:ERR"))         ESCAPE (MEAS_RA_OFFSET_ERR,  OPIHI_FLT);
     310  if (!strcasecmp (fieldName, "dD:ERR"))         ESCAPE (MEAS_DEC_OFFSET_ERR, OPIHI_FLT);
     311  if (!strcasecmp (fieldName, "ChiSqPos"))       ESCAPE (MEAS_CHISQ_POS,      OPIHI_FLT);
     312  if (!strcasecmp (fieldName, "ChiSqPM"))        ESCAPE (MEAS_CHISQ_PM,       OPIHI_FLT);
     313  if (!strcasecmp (fieldName, "ChiSqPar"))       ESCAPE (MEAS_CHISQ_PAR,      OPIHI_FLT);
     314  if (!strcasecmp (fieldName, "Tmean"))          ESCAPE (MEAS_TMEAN,          OPIHI_FLT);
     315  if (!strcasecmp (fieldName, "Trange"))         ESCAPE (MEAS_TRANGE,         OPIHI_FLT);
     316  if (!strcasecmp (fieldName, "nmeas"))          ESCAPE (MEAS_NMEAS,          OPIHI_INT);
     317  if (!strcasecmp (fieldName, "nmiss"))          ESCAPE (MEAS_NMISS,          OPIHI_INT);
     318  if (!strcasecmp (fieldName, "npos"))           ESCAPE (MEAS_NPOS,           OPIHI_INT);
     319  if (!strcasecmp (fieldName, "OBJFLAGS"))       ESCAPE (MEAS_OBJ_FLAGS,      OPIHI_INT);
     320  if (!strcasecmp (fieldName, "OBJ_FLAGS"))      ESCAPE (MEAS_OBJ_FLAGS,      OPIHI_INT);
     321  if (!strcasecmp (fieldName, "OBJ_PHOT_FLAGS")) ESCAPE (MEAS_SECFILT_FLAGS,      OPIHI_INT);
     322  if (!strcasecmp (fieldName, "SECFLAGS"))       ESCAPE (MEAS_SECFILT_FLAGS,      OPIHI_INT);
     323  if (!strcasecmp (fieldName, "SEC_FLAGS"))      ESCAPE (MEAS_SECFILT_FLAGS,      OPIHI_INT);
     324  if (!strcasecmp (fieldName, "SECFILT_FLAGS"))  ESCAPE (MEAS_SECFILT_FLAGS,      OPIHI_INT);
     325  if (!strcasecmp (fieldName, "DB_FLAGS"))       ESCAPE (MEAS_DB_FLAGS,       OPIHI_INT);
     326  if (!strcasecmp (fieldName, "PHOT_FLAGS"))     ESCAPE (MEAS_PHOT_FLAGS,     OPIHI_INT);
     327  if (!strcasecmp (fieldName, "DBFLAGS"))        ESCAPE (MEAS_DB_FLAGS,       OPIHI_INT);
     328  if (!strcasecmp (fieldName, "PHOTFLAGS"))      ESCAPE (MEAS_PHOT_FLAGS,     OPIHI_INT);
     329  if (!strcasecmp (fieldName, "AIRMASS"))        ESCAPE (MEAS_AIRMASS,        OPIHI_FLT);
     330  if (!strcasecmp (fieldName, "MEAN_AIRMASS"))   ESCAPE (MEAS_MEAN_AIRMASS,   OPIHI_FLT);
     331  if (!strcasecmp (fieldName, "ALT"))            ESCAPE (MEAS_ALT,            OPIHI_FLT);
     332  if (!strcasecmp (fieldName, "AZ"))             ESCAPE (MEAS_AZ,             OPIHI_FLT);
     333  if (!strcasecmp (fieldName, "EXPTIME"))        ESCAPE (MEAS_EXPTIME,        OPIHI_FLT);
     334  if (!strcasecmp (fieldName, "PHOTCODE"))       ESCAPE (MEAS_PHOTCODE,       OPIHI_INT);
     335  if (!strcasecmp (fieldName, "PHOTCODE:KLAM"))  ESCAPE (MEAS_PHOTCODE_KLAM,  OPIHI_FLT);
     336  if (!strcasecmp (fieldName, "PHOTCODE:C"))     ESCAPE (MEAS_PHOTCODE_C,     OPIHI_FLT);
     337  if (!strcasecmp (fieldName, "PHOTCODE:EQUIV")) ESCAPE (MEAS_PHOTCODE_EQUIV, OPIHI_INT);
     338  if (!strcasecmp (fieldName, "TIME"))           ESCAPE (MEAS_TIME,           OPIHI_FLT);
     339  if (!strcasecmp (fieldName, "FWHM"))           ESCAPE (MEAS_FWHM,           OPIHI_FLT);
     340  if (!strcasecmp (fieldName, "FWHM_MAJ"))       ESCAPE (MEAS_FWHM_MAJ,       OPIHI_FLT);
     341  if (!strcasecmp (fieldName, "FWHM_MIN"))       ESCAPE (MEAS_FWHM_MIN,       OPIHI_FLT);
     342  if (!strcasecmp (fieldName, "THETA"))          ESCAPE (MEAS_THETA,          OPIHI_FLT);
     343  if (!strcasecmp (fieldName, "POSANGLE"))       ESCAPE (MEAS_POSANGLE,       OPIHI_FLT);
     344  if (!strcasecmp (fieldName, "PLATESCALE"))     ESCAPE (MEAS_PLATESCALE,     OPIHI_FLT);
     345  if (!strcasecmp (fieldName, "MXX"))            ESCAPE (MEAS_MXX,            OPIHI_FLT);
     346  if (!strcasecmp (fieldName, "MYY"))            ESCAPE (MEAS_MYY,            OPIHI_FLT);
     347  if (!strcasecmp (fieldName, "MXY"))            ESCAPE (MEAS_MXY,            OPIHI_FLT);
     348  if (!strcasecmp (fieldName, "DOPHOT"))         ESCAPE (MEAS_DOPHOT,         OPIHI_INT);
     349  if (!strcasecmp (fieldName, "XCCD"))           ESCAPE (MEAS_XCCD,           OPIHI_FLT);
     350  if (!strcasecmp (fieldName, "YCCD"))           ESCAPE (MEAS_YCCD,           OPIHI_FLT);
     351  if (!strcasecmp (fieldName, "XCCD:ERR"))       ESCAPE (MEAS_XCCD_ERR,       OPIHI_FLT);
     352  if (!strcasecmp (fieldName, "YCCD:ERR"))       ESCAPE (MEAS_YCCD_ERR,       OPIHI_FLT);
     353  if (!strcasecmp (fieldName, "XFIX"))           ESCAPE (MEAS_XFIX,           OPIHI_FLT);
     354  if (!strcasecmp (fieldName, "YFIX"))           ESCAPE (MEAS_YFIX,           OPIHI_FLT);
     355  if (!strcasecmp (fieldName, "POS_SYS_ERR"))    ESCAPE (MEAS_POS_SYS_ERR,    OPIHI_FLT);
     356  if (!strcasecmp (fieldName, "XFIELD"))         ESCAPE (MEAS_XFIELD,         OPIHI_FLT);
     357  if (!strcasecmp (fieldName, "YFIELD"))         ESCAPE (MEAS_YFIELD,         OPIHI_FLT);
     358  if (!strcasecmp (fieldName, "XMOSAIC"))        ESCAPE (MEAS_XMOSAIC,        OPIHI_FLT);
     359  if (!strcasecmp (fieldName, "YMOSAIC"))        ESCAPE (MEAS_YMOSAIC,        OPIHI_FLT);
     360  if (!strcasecmp (fieldName, "XCHIP"))          ESCAPE (MEAS_XCCD,           OPIHI_FLT);
     361  if (!strcasecmp (fieldName, "YCHIP"))          ESCAPE (MEAS_YCCD,           OPIHI_FLT);
     362  if (!strcasecmp (fieldName, "XFPA"))           ESCAPE (MEAS_XMOSAIC,        OPIHI_FLT);
     363  if (!strcasecmp (fieldName, "YFPA"))           ESCAPE (MEAS_YMOSAIC,        OPIHI_FLT);
     364  if (!strcasecmp (fieldName, "DETID"))          ESCAPE (MEAS_DET_ID,         OPIHI_INT);
     365  if (!strcasecmp (fieldName, "OBJID"))          ESCAPE (MEAS_OBJ_ID,         OPIHI_INT);
     366  if (!strcasecmp (fieldName, "CATID"))          ESCAPE (MEAS_CAT_ID,         OPIHI_INT);
     367  if (!strcasecmp (fieldName, "IMAGEID"))        ESCAPE (MEAS_IMAGE_ID,       OPIHI_INT);
     368  if (!strcasecmp (fieldName, "EXTERNID"))       ESCAPE (MEAS_EXTERN_ID,      OPIHI_INT);
     369  if (!strcasecmp (fieldName, "EXPNAME"))        ESCAPE (MEAS_EXPNAME_AS_INT, OPIHI_INT);
     370  if (!strcasecmp (fieldName, "PSF_QF"))         ESCAPE (MEAS_PSF_QF,         OPIHI_FLT);
     371  if (!strcasecmp (fieldName, "PSF_QF_PERFECT")) ESCAPE (MEAS_PSF_QF_PERFECT, OPIHI_FLT);
     372  if (!strcasecmp (fieldName, "PSF_CHISQ"))      ESCAPE (MEAS_PSF_CHISQ,      OPIHI_FLT);
     373  if (!strcasecmp (fieldName, "PSF_NDOF"))       ESCAPE (MEAS_PSF_NDOF,       OPIHI_INT);
     374  if (!strcasecmp (fieldName, "PSF_NPIX"))       ESCAPE (MEAS_PSF_NPIX,       OPIHI_INT);
     375  if (!strcasecmp (fieldName, "CR_NSIGMA"))      ESCAPE (MEAS_CR_NSIGMA,      OPIHI_FLT);
     376  if (!strcasecmp (fieldName, "EXT_NSIGMA"))     ESCAPE (MEAS_EXT_NSIGMA,     OPIHI_FLT);
     377  if (!strcasecmp (fieldName, "SKY"))            ESCAPE (MEAS_SKY,            OPIHI_FLT);
     378  if (!strcasecmp (fieldName, "SKY_ERR"))        ESCAPE (MEAS_dSKY,           OPIHI_FLT);
     379  if (!strcasecmp (fieldName, "MCAL_OFFSET"))    ESCAPE (MEAS_MCAL_OFFSET,    OPIHI_FLT);
     380  if (!strcasecmp (fieldName, "FLAT"))           ESCAPE (MEAS_FLAT,           OPIHI_FLT);
     381  if (!strcasecmp (fieldName, "CENTER_OFFSET"))  ESCAPE (MEAS_CENTER_OFFSET,  OPIHI_FLT);
     382  // if (!strcasecmp (fieldName, "FLUX"))                ESCAPE (MEAS_FLUX_PSF,       OPIHI_FLT);
     383  // if (!strcasecmp (fieldName, "FLUX_ERR"))       ESCAPE (MEAS_FLUX_PSF_ERR,   OPIHI_FLT);
     384  // if (!strcasecmp (fieldName, "FLUX_PSF"))       ESCAPE (MEAS_FLUX_PSF,       OPIHI_FLT);
     385  // if (!strcasecmp (fieldName, "FLUX_PSF_ERR"))   ESCAPE (MEAS_FLUX_PSF_ERR,   OPIHI_FLT);
     386  // if (!strcasecmp (fieldName, "FLUX_KRON"))      ESCAPE (MEAS_FLUX_KRON,      OPIHI_FLT);
     387  // if (!strcasecmp (fieldName, "FLUX_KRON_ERR"))  ESCAPE (MEAS_FLUX_KRON_ERR,  OPIHI_FLT);
     388  if (!strcasecmp (fieldName, "REF_COLOR"))      ESCAPE (MEAS_REF_COLOR,      OPIHI_FLT);
     389
     390  // for words that don't parse, try a photcode
     391
     392  // check for code:mode in photcode name
     393  if (!ParsePhotcodeField (field, fieldName)) {
     394    gprint (GP_ERR, "unknown field '%s' for measurement table in DVO database\n", fieldName);
     395    return (FALSE);
     396  }
     397
    316398  return (TRUE);
    317399}
    318400
    319401int ParseAverageField (dbField *field, char *fieldName) {
    320 
    321   int mode;
    322   PhotCode *code;
    323402
    324403  field->table = DVO_TABLE_AVERAGE;
     
    329408  if (!strcasecmp (fieldName, "GLON"))  {
    330409    dbExtractAveragesInitTransform (COORD_GALACTIC);
    331     ESCAPE (AVE_GLON, MAG_NONE, OPIHI_FLT);
     410    ESCAPE (AVE_GLON, OPIHI_FLT);
    332411  }
    333412  if (!strcasecmp (fieldName, "GLAT"))  {
    334413    dbExtractAveragesInitTransform (COORD_GALACTIC);
    335     ESCAPE (AVE_GLAT, MAG_NONE, OPIHI_FLT);
     414    ESCAPE (AVE_GLAT, OPIHI_FLT);
    336415  }
    337416
     
    340419  if (!strcasecmp (fieldName, "ELON"))  {
    341420    dbExtractAveragesInitTransform (COORD_ECLIPTIC);
    342     ESCAPE (AVE_ELON, MAG_NONE, OPIHI_FLT);
     421    ESCAPE (AVE_ELON, OPIHI_FLT);
    343422  }
    344423  if (!strcasecmp (fieldName, "ELAT"))  {
    345424    dbExtractAveragesInitTransform (COORD_ECLIPTIC);
    346     ESCAPE (AVE_ELAT, MAG_NONE, OPIHI_FLT);
    347   }
    348 
    349   if (!strcasecmp (fieldName, "RA"))          ESCAPE (AVE_RA,          MAG_NONE, OPIHI_FLT);
    350   if (!strcasecmp (fieldName, "DEC"))         ESCAPE (AVE_DEC,         MAG_NONE, OPIHI_FLT);
    351   if (!strcasecmp (fieldName, "GLON"))        ESCAPE (AVE_GLON,        MAG_NONE, OPIHI_FLT);
    352   if (!strcasecmp (fieldName, "GLAT"))        ESCAPE (AVE_GLAT,        MAG_NONE, OPIHI_FLT);
    353   if (!strcasecmp (fieldName, "ELON"))        ESCAPE (AVE_ELON,        MAG_NONE, OPIHI_FLT);
    354   if (!strcasecmp (fieldName, "ELAT"))        ESCAPE (AVE_ELAT,        MAG_NONE, OPIHI_FLT);
    355   if (!strcasecmp (fieldName, "dRA"))         ESCAPE (AVE_RA_ERR,      MAG_NONE, OPIHI_FLT);
    356   if (!strcasecmp (fieldName, "dDEC"))        ESCAPE (AVE_DEC_ERR,     MAG_NONE, OPIHI_FLT);
    357   if (!strcasecmp (fieldName, "uRA"))         ESCAPE (AVE_U_RA,        MAG_NONE, OPIHI_FLT);
    358   if (!strcasecmp (fieldName, "uDEC"))        ESCAPE (AVE_U_DEC,       MAG_NONE, OPIHI_FLT);
    359   if (!strcasecmp (fieldName, "duRA"))        ESCAPE (AVE_U_RA_ERR,    MAG_NONE, OPIHI_FLT);
    360   if (!strcasecmp (fieldName, "duDEC"))       ESCAPE (AVE_U_DEC_ERR,   MAG_NONE, OPIHI_FLT);
    361   if (!strcasecmp (fieldName, "PAR"))         ESCAPE (AVE_PAR,         MAG_NONE, OPIHI_FLT);
    362   if (!strcasecmp (fieldName, "dPAR"))        ESCAPE (AVE_PAR_ERR,     MAG_NONE, OPIHI_FLT);
    363   if (!strcasecmp (fieldName, "ChiSqPos"))    ESCAPE (AVE_CHISQ_POS,   MAG_NONE, OPIHI_FLT);
    364   if (!strcasecmp (fieldName, "ChiSqPM"))     ESCAPE (AVE_CHISQ_PM,    MAG_NONE, OPIHI_FLT);
    365   if (!strcasecmp (fieldName, "ChiSqPar"))    ESCAPE (AVE_CHISQ_PAR,   MAG_NONE, OPIHI_FLT);
    366   if (!strcasecmp (fieldName, "Tmean"))       ESCAPE (AVE_TMEAN,       MAG_NONE, OPIHI_FLT);
    367   if (!strcasecmp (fieldName, "Trange"))      ESCAPE (AVE_TRANGE,      MAG_NONE, OPIHI_FLT);
    368   if (!strcasecmp (fieldName, "psfqf"))       ESCAPE (AVE_PSF_QF,      MAG_NONE, OPIHI_FLT);
    369   if (!strcasecmp (fieldName, "psfqfperf"))   ESCAPE (AVE_PSF_QF_PERF, MAG_NONE, OPIHI_FLT);
    370   if (!strcasecmp (fieldName, "psf_qf"))      ESCAPE (AVE_PSF_QF,      MAG_NONE, OPIHI_FLT);
    371   if (!strcasecmp (fieldName, "psf_qf_perf")) ESCAPE (AVE_PSF_QF_PERF, MAG_NONE, OPIHI_FLT);
    372   if (!strcasecmp (fieldName, "stargal"))     ESCAPE (AVE_STARGAL,     MAG_NONE, OPIHI_FLT);
    373   if (!strcasecmp (fieldName, "NMEAS"))       ESCAPE (AVE_NMEAS,       MAG_NONE, OPIHI_INT);
    374   if (!strcasecmp (fieldName, "NMISS"))       ESCAPE (AVE_NMISS,       MAG_NONE, OPIHI_INT);
    375   if (!strcasecmp (fieldName, "NPOS"))        ESCAPE (AVE_NPOS,        MAG_NONE, OPIHI_INT);
    376   if (!strcasecmp (fieldName, "NASTROM"))     ESCAPE (AVE_NPOS,        MAG_NONE, OPIHI_INT);
    377   if (!strcasecmp (fieldName, "FLAGS"))       ESCAPE (AVE_OBJ_FLAGS,   MAG_NONE, OPIHI_INT);
    378   if (!strcasecmp (fieldName, "OBJ_FLAGS"))   ESCAPE (AVE_OBJ_FLAGS,   MAG_NONE, OPIHI_INT);
    379   if (!strcasecmp (fieldName, "OBJFLAGS"))    ESCAPE (AVE_OBJ_FLAGS,   MAG_NONE, OPIHI_INT);
    380   if (!strcasecmp (fieldName, "OBJID"))       ESCAPE (AVE_OBJID,       MAG_NONE, OPIHI_INT);
    381   if (!strcasecmp (fieldName, "CATID"))       ESCAPE (AVE_CATID,       MAG_NONE, OPIHI_INT);
    382   if (!strcasecmp (fieldName, "EXTID_HI"))    ESCAPE (AVE_EXTID_HI,    MAG_NONE, OPIHI_INT);
    383   if (!strcasecmp (fieldName, "EXTID_LO"))    ESCAPE (AVE_EXTID_LO,    MAG_NONE, OPIHI_INT);
    384   if (!strcasecmp (fieldName, "REF_COLOR"))   ESCAPE (AVE_REF_COLOR,   MAG_NONE, OPIHI_FLT);
     425    ESCAPE (AVE_ELAT, OPIHI_FLT);
     426  }
     427
     428  if (!strcasecmp (fieldName, "RA"))          ESCAPE (AVE_RA,          OPIHI_FLT);
     429  if (!strcasecmp (fieldName, "DEC"))         ESCAPE (AVE_DEC,         OPIHI_FLT);
     430  if (!strcasecmp (fieldName, "GLON"))        ESCAPE (AVE_GLON,        OPIHI_FLT);
     431  if (!strcasecmp (fieldName, "GLAT"))        ESCAPE (AVE_GLAT,        OPIHI_FLT);
     432  if (!strcasecmp (fieldName, "ELON"))        ESCAPE (AVE_ELON,        OPIHI_FLT);
     433  if (!strcasecmp (fieldName, "ELAT"))        ESCAPE (AVE_ELAT,        OPIHI_FLT);
     434  if (!strcasecmp (fieldName, "dRA"))         ESCAPE (AVE_RA_ERR,      OPIHI_FLT);
     435  if (!strcasecmp (fieldName, "dDEC"))        ESCAPE (AVE_DEC_ERR,     OPIHI_FLT);
     436  if (!strcasecmp (fieldName, "uRA"))         ESCAPE (AVE_U_RA,        OPIHI_FLT);
     437  if (!strcasecmp (fieldName, "uDEC"))        ESCAPE (AVE_U_DEC,       OPIHI_FLT);
     438  if (!strcasecmp (fieldName, "duRA"))        ESCAPE (AVE_U_RA_ERR,    OPIHI_FLT);
     439  if (!strcasecmp (fieldName, "duDEC"))       ESCAPE (AVE_U_DEC_ERR,   OPIHI_FLT);
     440  if (!strcasecmp (fieldName, "PAR"))         ESCAPE (AVE_PAR,         OPIHI_FLT);
     441  if (!strcasecmp (fieldName, "dPAR"))        ESCAPE (AVE_PAR_ERR,     OPIHI_FLT);
     442  if (!strcasecmp (fieldName, "ChiSqPos"))    ESCAPE (AVE_CHISQ_POS,   OPIHI_FLT);
     443  if (!strcasecmp (fieldName, "ChiSqPM"))     ESCAPE (AVE_CHISQ_PM,    OPIHI_FLT);
     444  if (!strcasecmp (fieldName, "ChiSqPar"))    ESCAPE (AVE_CHISQ_PAR,   OPIHI_FLT);
     445  if (!strcasecmp (fieldName, "Tmean"))       ESCAPE (AVE_TMEAN,       OPIHI_FLT);
     446  if (!strcasecmp (fieldName, "Trange"))      ESCAPE (AVE_TRANGE,      OPIHI_FLT);
     447  if (!strcasecmp (fieldName, "psfqf"))       ESCAPE (AVE_PSF_QF,      OPIHI_FLT);
     448  if (!strcasecmp (fieldName, "psfqfperf"))   ESCAPE (AVE_PSF_QF_PERF, OPIHI_FLT);
     449  if (!strcasecmp (fieldName, "psf_qf"))      ESCAPE (AVE_PSF_QF,      OPIHI_FLT);
     450  if (!strcasecmp (fieldName, "psf_qf_perf")) ESCAPE (AVE_PSF_QF_PERF, OPIHI_FLT);
     451  if (!strcasecmp (fieldName, "stargal"))     ESCAPE (AVE_STARGAL,     OPIHI_FLT);
     452  if (!strcasecmp (fieldName, "NMEAS"))       ESCAPE (AVE_NMEAS,       OPIHI_INT);
     453  if (!strcasecmp (fieldName, "NMISS"))       ESCAPE (AVE_NMISS,       OPIHI_INT);
     454  if (!strcasecmp (fieldName, "NPOS"))        ESCAPE (AVE_NPOS,        OPIHI_INT);
     455  if (!strcasecmp (fieldName, "NASTROM"))     ESCAPE (AVE_NPOS,        OPIHI_INT);
     456  if (!strcasecmp (fieldName, "FLAGS"))       ESCAPE (AVE_OBJ_FLAGS,   OPIHI_INT);
     457  if (!strcasecmp (fieldName, "OBJ_FLAGS"))   ESCAPE (AVE_OBJ_FLAGS,   OPIHI_INT);
     458  if (!strcasecmp (fieldName, "OBJFLAGS"))    ESCAPE (AVE_OBJ_FLAGS,   OPIHI_INT);
     459  if (!strcasecmp (fieldName, "OBJID"))       ESCAPE (AVE_OBJID,       OPIHI_INT);
     460  if (!strcasecmp (fieldName, "CATID"))       ESCAPE (AVE_CATID,       OPIHI_INT);
     461  if (!strcasecmp (fieldName, "EXTID_HI"))    ESCAPE (AVE_EXTID_HI,    OPIHI_INT);
     462  if (!strcasecmp (fieldName, "EXTID_LO"))    ESCAPE (AVE_EXTID_LO,    OPIHI_INT);
     463  if (!strcasecmp (fieldName, "REF_COLOR"))   ESCAPE (AVE_REF_COLOR,   OPIHI_FLT);
    385464
    386465  // check for code:mode in photcode name
    387   code = ParsePhotcodeField (fieldName, &mode, MAG_AVE);
    388   if (code == NULL) {
     466  if (!ParsePhotcodeField (field, fieldName)) {
    389467    gprint (GP_ERR, "unknown field '%s' for average table in DVO database\n", fieldName);
    390468    return (FALSE);
    391469  }
    392470
    393   if (code[0].type == PHOT_MAG) {
     471  if (field->photcode->type == PHOT_MAG) {
    394472    gprint (GP_ERR, "'mag' is ambiguous for avextract\n");
    395     free (code);
    396473    return (FALSE);
    397474  }
    398475
    399   field->ID = AVE_MAG;
    400   field->magMode = mode;
    401   switch (mode) {
    402     case MAG_STACK_DET_ID:
    403     case MAG_NCODE:
    404     case MAG_NPHOT:
    405     case MAG_PHOT_FLAGS:
    406       field->type = OPIHI_INT;
    407       break;
    408     default:
    409       field->type = OPIHI_FLT;
    410       break;
    411   }
    412   field->photcode = code;
    413476  return (TRUE);
    414477}
     
    424487  if (!strcasecmp (fieldName, "GLON"))  {
    425488    dbExtractImagesInitTransform (COORD_GALACTIC);
    426     ESCAPE (IMAGE_GLON, MAG_NONE, OPIHI_FLT);
     489    ESCAPE (IMAGE_GLON, OPIHI_FLT);
    427490  }
    428491  if (!strcasecmp (fieldName, "GLAT"))  {
    429492    dbExtractImagesInitTransform (COORD_GALACTIC);
    430     ESCAPE (IMAGE_GLAT, MAG_NONE, OPIHI_FLT);
     493    ESCAPE (IMAGE_GLAT, OPIHI_FLT);
    431494  }
    432495
     
    435498  if (!strcasecmp (fieldName, "ELON"))  {
    436499    dbExtractImagesInitTransform (COORD_ECLIPTIC);
    437     ESCAPE (IMAGE_ELON, MAG_NONE, OPIHI_FLT);
     500    ESCAPE (IMAGE_ELON, OPIHI_FLT);
    438501  }
    439502  if (!strcasecmp (fieldName, "ELAT"))  {
    440503    dbExtractImagesInitTransform (COORD_ECLIPTIC);
    441     ESCAPE (IMAGE_ELAT, MAG_NONE, OPIHI_FLT);
    442   }
    443 
    444   if (!strcasecmp (fieldName, "RA"       )) ESCAPE (IMAGE_RA,        MAG_NONE, OPIHI_FLT);
    445   if (!strcasecmp (fieldName, "DEC"      )) ESCAPE (IMAGE_DEC,       MAG_NONE, OPIHI_FLT);
    446   if (!strcasecmp (fieldName, "GLON"     )) ESCAPE (IMAGE_GLON,      MAG_NONE, OPIHI_FLT);
    447   if (!strcasecmp (fieldName, "GLAT"     )) ESCAPE (IMAGE_GLAT,      MAG_NONE, OPIHI_FLT);
    448   if (!strcasecmp (fieldName, "ELON"     )) ESCAPE (IMAGE_ELON,      MAG_NONE, OPIHI_FLT);
    449   if (!strcasecmp (fieldName, "ELAT"     )) ESCAPE (IMAGE_ELAT,      MAG_NONE, OPIHI_FLT);
    450 
    451   if (!strcasecmp (fieldName, "theta"    )) ESCAPE (IMAGE_THETA,     MAG_NONE, OPIHI_FLT);
    452   if (!strcasecmp (fieldName, "skew"     )) ESCAPE (IMAGE_SKEW,      MAG_NONE, OPIHI_FLT);
    453   if (!strcasecmp (fieldName, "scale"    )) ESCAPE (IMAGE_SCALE,     MAG_NONE, OPIHI_FLT);
    454   if (!strcasecmp (fieldName, "dscale"   )) ESCAPE (IMAGE_DSCALE,    MAG_NONE, OPIHI_FLT);
    455 
    456   if (!strcasecmp (fieldName, "time"     )) ESCAPE (IMAGE_TIME,      MAG_NONE, OPIHI_FLT);
    457   if (!strcasecmp (fieldName, "nstar"    )) ESCAPE (IMAGE_NSTAR,     MAG_NONE, OPIHI_INT);
    458   if (!strcasecmp (fieldName, "airmass"  )) ESCAPE (IMAGE_AIRMASS,   MAG_NONE, OPIHI_FLT);
    459   if (!strcasecmp (fieldName, "NX"       )) ESCAPE (IMAGE_NX_PIX,    MAG_NONE, OPIHI_INT);
    460   if (!strcasecmp (fieldName, "NY"       )) ESCAPE (IMAGE_NY_PIX,    MAG_NONE, OPIHI_INT);
    461   if (!strcasecmp (fieldName, "apresid"  )) ESCAPE (IMAGE_APRESID,   MAG_NONE, OPIHI_FLT);
    462   if (!strcasecmp (fieldName, "dapresid" )) ESCAPE (IMAGE_DAPRESID,  MAG_NONE, OPIHI_FLT);
    463 
    464   if (!strcasecmp (fieldName, "Mcal"     )) ESCAPE (IMAGE_MCAL,      MAG_NONE, OPIHI_FLT);
    465   if (!strcasecmp (fieldName, "dMcal"    )) ESCAPE (IMAGE_dMCAL,     MAG_NONE, OPIHI_FLT);
    466   if (!strcasecmp (fieldName, "Xm"       )) ESCAPE (IMAGE_XM,        MAG_NONE, OPIHI_FLT);
    467   if (!strcasecmp (fieldName, "photcode" )) ESCAPE (IMAGE_PHOTCODE,  MAG_NONE, OPIHI_INT);
    468   if (!strcasecmp (fieldName, "exptime"  )) ESCAPE (IMAGE_EXPTIME,   MAG_NONE, OPIHI_FLT);
    469   if (!strcasecmp (fieldName, "sidtime"  )) ESCAPE (IMAGE_SIDTIME,   MAG_NONE, OPIHI_FLT);
    470 
    471   if (!strcasecmp (fieldName, "latitude" )) ESCAPE (IMAGE_LATITUDE,  MAG_NONE, OPIHI_FLT);
    472 
    473   if (!strcasecmp (fieldName, "detlimit" )) ESCAPE (IMAGE_DET_LIMIT, MAG_NONE, OPIHI_FLT);
    474   if (!strcasecmp (fieldName, "satlimit" )) ESCAPE (IMAGE_SAT_LIMIT, MAG_NONE, OPIHI_FLT);
    475   if (!strcasecmp (fieldName, "cerror"   )) ESCAPE (IMAGE_CERROR,    MAG_NONE, OPIHI_FLT);
    476 
    477   if (!strcasecmp (fieldName, "FWHM"       )) ESCAPE (IMAGE_FWHM,      MAG_NONE, OPIHI_FLT);
    478   if (!strcasecmp (fieldName, "FWHM_MAJ"   )) ESCAPE (IMAGE_FWHM_MAJ,  MAG_NONE, OPIHI_FLT);
    479   if (!strcasecmp (fieldName, "FWHM_MIN"   )) ESCAPE (IMAGE_FWHM_MIN,  MAG_NONE, OPIHI_FLT);
    480   if (!strcasecmp (fieldName, "FWHM_MAJOR" )) ESCAPE (IMAGE_FWHM_MAJ,  MAG_NONE, OPIHI_FLT);
    481   if (!strcasecmp (fieldName, "FWHM_MINOR" )) ESCAPE (IMAGE_FWHM_MIN,  MAG_NONE, OPIHI_FLT);
    482 
    483   if (!strcasecmp (fieldName, "FWHM_MEDIAN"    ))   ESCAPE (IMAGE_FWHM_MEDIAN,      MAG_NONE, OPIHI_FLT);
    484   if (!strcasecmp (fieldName, "FWHM_MAJ_MEDIAN"))   ESCAPE (IMAGE_FWHM_MAJ_MEDIAN,  MAG_NONE, OPIHI_FLT);
    485   if (!strcasecmp (fieldName, "FWHM_MIN_MEDIAN"))   ESCAPE (IMAGE_FWHM_MIN_MEDIAN,  MAG_NONE, OPIHI_FLT);
    486   if (!strcasecmp (fieldName, "FWHM_MAJOR_MEDIAN")) ESCAPE (IMAGE_FWHM_MAJ_MEDIAN,  MAG_NONE, OPIHI_FLT);
    487   if (!strcasecmp (fieldName, "FWHM_MINOR_MEDIAN")) ESCAPE (IMAGE_FWHM_MIN_MEDIAN,  MAG_NONE, OPIHI_FLT);
    488 
    489   if (!strcasecmp (fieldName, "trate"    )) ESCAPE (IMAGE_TRATE,     MAG_NONE, OPIHI_FLT);
    490 
    491   if (!strcasecmp (fieldName, "ncal"     )) ESCAPE (IMAGE_NCAL,      MAG_NONE, OPIHI_INT);
    492   if (!strcasecmp (fieldName, "sky"      )) ESCAPE (IMAGE_SKY,       MAG_NONE, OPIHI_FLT); // deprecated for now
    493 
    494   if (!strcasecmp (fieldName, "imflags"  )) ESCAPE (IMAGE_FLAGS,     MAG_NONE, OPIHI_INT);
    495   if (!strcasecmp (fieldName, "flags"    )) ESCAPE (IMAGE_FLAGS,     MAG_NONE, OPIHI_INT);
    496   if (!strcasecmp (fieldName, "ccdnum"   )) ESCAPE (IMAGE_CCDNUM,    MAG_NONE, OPIHI_INT);
    497 
    498   if (!strcasecmp (fieldName, "imageID"  )) ESCAPE (IMAGE_IMAGE_ID,  MAG_NONE, OPIHI_INT);
    499   if (!strcasecmp (fieldName, "externID" )) ESCAPE (IMAGE_EXTERN_ID, MAG_NONE, OPIHI_INT);
    500   if (!strcasecmp (fieldName, "sourceID" )) ESCAPE (IMAGE_SOURCE_ID, MAG_NONE, OPIHI_INT);
    501 
    502   if (!strcasecmp (fieldName, "X_LL_CHIP")) ESCAPE (IMAGE_X_LL_CHIP, MAG_NONE, OPIHI_FLT);
    503   if (!strcasecmp (fieldName, "X_LR_CHIP")) ESCAPE (IMAGE_X_LR_CHIP, MAG_NONE, OPIHI_FLT);
    504   if (!strcasecmp (fieldName, "X_UL_CHIP")) ESCAPE (IMAGE_X_UL_CHIP, MAG_NONE, OPIHI_FLT);
    505   if (!strcasecmp (fieldName, "X_UR_CHIP")) ESCAPE (IMAGE_X_UR_CHIP, MAG_NONE, OPIHI_FLT);
    506   if (!strcasecmp (fieldName, "Y_LL_CHIP")) ESCAPE (IMAGE_Y_LL_CHIP, MAG_NONE, OPIHI_FLT);
    507   if (!strcasecmp (fieldName, "Y_LR_CHIP")) ESCAPE (IMAGE_Y_LR_CHIP, MAG_NONE, OPIHI_FLT);
    508   if (!strcasecmp (fieldName, "Y_UL_CHIP")) ESCAPE (IMAGE_Y_UL_CHIP, MAG_NONE, OPIHI_FLT);
    509   if (!strcasecmp (fieldName, "Y_UR_CHIP")) ESCAPE (IMAGE_Y_UR_CHIP, MAG_NONE, OPIHI_FLT);
    510   if (!strcasecmp (fieldName, "X_LL_FP"  )) ESCAPE (IMAGE_X_LL_FP,   MAG_NONE, OPIHI_FLT);
    511   if (!strcasecmp (fieldName, "X_LR_FP"  )) ESCAPE (IMAGE_X_LR_FP,   MAG_NONE, OPIHI_FLT);
    512   if (!strcasecmp (fieldName, "X_UL_FP"  )) ESCAPE (IMAGE_X_UL_FP,   MAG_NONE, OPIHI_FLT);
    513   if (!strcasecmp (fieldName, "X_UR_FP"  )) ESCAPE (IMAGE_X_UR_FP,   MAG_NONE, OPIHI_FLT);
    514   if (!strcasecmp (fieldName, "Y_LL_FP"  )) ESCAPE (IMAGE_Y_LL_FP,   MAG_NONE, OPIHI_FLT);
    515   if (!strcasecmp (fieldName, "Y_LR_FP"  )) ESCAPE (IMAGE_Y_LR_FP,   MAG_NONE, OPIHI_FLT);
    516   if (!strcasecmp (fieldName, "Y_UL_FP"  )) ESCAPE (IMAGE_Y_UL_FP,   MAG_NONE, OPIHI_FLT);
    517   if (!strcasecmp (fieldName, "Y_UR_FP"  )) ESCAPE (IMAGE_Y_UR_FP,   MAG_NONE, OPIHI_FLT);
    518 
    519   if (!strcasecmp (fieldName, "dX_SYS"  )) ESCAPE (IMAGE_X_ERR_SYS,  MAG_NONE, OPIHI_FLT);
    520   if (!strcasecmp (fieldName, "dY_SYS"  )) ESCAPE (IMAGE_Y_ERR_SYS,  MAG_NONE, OPIHI_FLT);
    521   if (!strcasecmp (fieldName, "dM_SYS"  )) ESCAPE (IMAGE_MAG_ERR_SYS,MAG_NONE, OPIHI_FLT);
    522 
    523   if (!strcasecmp (fieldName, "UBERCAL_DIST")) ESCAPE (IMAGE_UBERCAL_DIST,MAG_NONE, OPIHI_INT);
    524   if (!strcasecmp (fieldName, "UCDIST")) ESCAPE (IMAGE_UBERCAL_DIST,MAG_NONE, OPIHI_INT);
    525 
    526   if (!strcasecmp (fieldName, "NFIT_PHOTOM"))  ESCAPE (IMAGE_NFIT_PHOTOM,  MAG_NONE, OPIHI_INT);
    527   if (!strcasecmp (fieldName, "NFIT_ASTROM"))  ESCAPE (IMAGE_NFIT_ASTROM,  MAG_NONE, OPIHI_INT);
    528   if (!strcasecmp (fieldName, "NLINK_PHOTOM")) ESCAPE (IMAGE_NLINK_PHOTOM, MAG_NONE, OPIHI_INT);
    529   if (!strcasecmp (fieldName, "NLINK_ASTROM")) ESCAPE (IMAGE_NLINK_ASTROM, MAG_NONE, OPIHI_INT);
    530   if (!strcasecmp (fieldName, "REF_COLOR"))    ESCAPE (IMAGE_REF_COLOR,    MAG_NONE, OPIHI_FLT);
     504    ESCAPE (IMAGE_ELAT, OPIHI_FLT);
     505  }
     506
     507  if (!strcasecmp (fieldName, "RA"       )) ESCAPE (IMAGE_RA,        OPIHI_FLT);
     508  if (!strcasecmp (fieldName, "DEC"      )) ESCAPE (IMAGE_DEC,       OPIHI_FLT);
     509  if (!strcasecmp (fieldName, "GLON"     )) ESCAPE (IMAGE_GLON,      OPIHI_FLT);
     510  if (!strcasecmp (fieldName, "GLAT"     )) ESCAPE (IMAGE_GLAT,      OPIHI_FLT);
     511  if (!strcasecmp (fieldName, "ELON"     )) ESCAPE (IMAGE_ELON,      OPIHI_FLT);
     512  if (!strcasecmp (fieldName, "ELAT"     )) ESCAPE (IMAGE_ELAT,      OPIHI_FLT);
     513
     514  if (!strcasecmp (fieldName, "theta"    )) ESCAPE (IMAGE_THETA,     OPIHI_FLT);
     515  if (!strcasecmp (fieldName, "skew"     )) ESCAPE (IMAGE_SKEW,      OPIHI_FLT);
     516  if (!strcasecmp (fieldName, "scale"    )) ESCAPE (IMAGE_SCALE,     OPIHI_FLT);
     517  if (!strcasecmp (fieldName, "dscale"   )) ESCAPE (IMAGE_DSCALE,    OPIHI_FLT);
     518
     519  if (!strcasecmp (fieldName, "time"     )) ESCAPE (IMAGE_TIME,      OPIHI_FLT);
     520  if (!strcasecmp (fieldName, "nstar"    )) ESCAPE (IMAGE_NSTAR,     OPIHI_INT);
     521  if (!strcasecmp (fieldName, "airmass"  )) ESCAPE (IMAGE_AIRMASS,   OPIHI_FLT);
     522  if (!strcasecmp (fieldName, "NX"       )) ESCAPE (IMAGE_NX_PIX,    OPIHI_INT);
     523  if (!strcasecmp (fieldName, "NY"       )) ESCAPE (IMAGE_NY_PIX,    OPIHI_INT);
     524  if (!strcasecmp (fieldName, "apresid"  )) ESCAPE (IMAGE_APRESID,   OPIHI_FLT);
     525  if (!strcasecmp (fieldName, "dapresid" )) ESCAPE (IMAGE_DAPRESID,  OPIHI_FLT);
     526
     527  if (!strcasecmp (fieldName, "Mcal"     )) ESCAPE (IMAGE_MCAL,      OPIHI_FLT);
     528  if (!strcasecmp (fieldName, "dMcal"    )) ESCAPE (IMAGE_dMCAL,     OPIHI_FLT);
     529  if (!strcasecmp (fieldName, "Xm"       )) ESCAPE (IMAGE_XM,        OPIHI_FLT);
     530  if (!strcasecmp (fieldName, "photcode" )) ESCAPE (IMAGE_PHOTCODE,  OPIHI_INT);
     531  if (!strcasecmp (fieldName, "exptime"  )) ESCAPE (IMAGE_EXPTIME,   OPIHI_FLT);
     532  if (!strcasecmp (fieldName, "sidtime"  )) ESCAPE (IMAGE_SIDTIME,   OPIHI_FLT);
     533
     534  if (!strcasecmp (fieldName, "latitude" )) ESCAPE (IMAGE_LATITUDE,  OPIHI_FLT);
     535
     536  if (!strcasecmp (fieldName, "detlimit" )) ESCAPE (IMAGE_DET_LIMIT, OPIHI_FLT);
     537  if (!strcasecmp (fieldName, "satlimit" )) ESCAPE (IMAGE_SAT_LIMIT, OPIHI_FLT);
     538  if (!strcasecmp (fieldName, "cerror"   )) ESCAPE (IMAGE_CERROR,    OPIHI_FLT);
     539
     540  if (!strcasecmp (fieldName, "FWHM"       )) ESCAPE (IMAGE_FWHM,      OPIHI_FLT);
     541  if (!strcasecmp (fieldName, "FWHM_MAJ"   )) ESCAPE (IMAGE_FWHM_MAJ,  OPIHI_FLT);
     542  if (!strcasecmp (fieldName, "FWHM_MIN"   )) ESCAPE (IMAGE_FWHM_MIN,  OPIHI_FLT);
     543  if (!strcasecmp (fieldName, "FWHM_MAJOR" )) ESCAPE (IMAGE_FWHM_MAJ,  OPIHI_FLT);
     544  if (!strcasecmp (fieldName, "FWHM_MINOR" )) ESCAPE (IMAGE_FWHM_MIN,  OPIHI_FLT);
     545
     546  if (!strcasecmp (fieldName, "FWHM_MEDIAN"    ))   ESCAPE (IMAGE_FWHM_MEDIAN,      OPIHI_FLT);
     547  if (!strcasecmp (fieldName, "FWHM_MAJ_MEDIAN"))   ESCAPE (IMAGE_FWHM_MAJ_MEDIAN,  OPIHI_FLT);
     548  if (!strcasecmp (fieldName, "FWHM_MIN_MEDIAN"))   ESCAPE (IMAGE_FWHM_MIN_MEDIAN,  OPIHI_FLT);
     549  if (!strcasecmp (fieldName, "FWHM_MAJOR_MEDIAN")) ESCAPE (IMAGE_FWHM_MAJ_MEDIAN,  OPIHI_FLT);
     550  if (!strcasecmp (fieldName, "FWHM_MINOR_MEDIAN")) ESCAPE (IMAGE_FWHM_MIN_MEDIAN,  OPIHI_FLT);
     551
     552  if (!strcasecmp (fieldName, "trate"    )) ESCAPE (IMAGE_TRATE,     OPIHI_FLT);
     553
     554  if (!strcasecmp (fieldName, "ncal"     )) ESCAPE (IMAGE_NCAL,      OPIHI_INT);
     555  if (!strcasecmp (fieldName, "sky"      )) ESCAPE (IMAGE_SKY,       OPIHI_FLT); // deprecated for now
     556
     557  if (!strcasecmp (fieldName, "imflags"  )) ESCAPE (IMAGE_FLAGS,     OPIHI_INT);
     558  if (!strcasecmp (fieldName, "flags"    )) ESCAPE (IMAGE_FLAGS,     OPIHI_INT);
     559  if (!strcasecmp (fieldName, "ccdnum"   )) ESCAPE (IMAGE_CCDNUM,    OPIHI_INT);
     560
     561  if (!strcasecmp (fieldName, "imageID"  )) ESCAPE (IMAGE_IMAGE_ID,  OPIHI_INT);
     562  if (!strcasecmp (fieldName, "externID" )) ESCAPE (IMAGE_EXTERN_ID, OPIHI_INT);
     563  if (!strcasecmp (fieldName, "sourceID" )) ESCAPE (IMAGE_SOURCE_ID, OPIHI_INT);
     564
     565  if (!strcasecmp (fieldName, "X_LL_CHIP")) ESCAPE (IMAGE_X_LL_CHIP, OPIHI_FLT);
     566  if (!strcasecmp (fieldName, "X_LR_CHIP")) ESCAPE (IMAGE_X_LR_CHIP, OPIHI_FLT);
     567  if (!strcasecmp (fieldName, "X_UL_CHIP")) ESCAPE (IMAGE_X_UL_CHIP, OPIHI_FLT);
     568  if (!strcasecmp (fieldName, "X_UR_CHIP")) ESCAPE (IMAGE_X_UR_CHIP, OPIHI_FLT);
     569  if (!strcasecmp (fieldName, "Y_LL_CHIP")) ESCAPE (IMAGE_Y_LL_CHIP, OPIHI_FLT);
     570  if (!strcasecmp (fieldName, "Y_LR_CHIP")) ESCAPE (IMAGE_Y_LR_CHIP, OPIHI_FLT);
     571  if (!strcasecmp (fieldName, "Y_UL_CHIP")) ESCAPE (IMAGE_Y_UL_CHIP, OPIHI_FLT);
     572  if (!strcasecmp (fieldName, "Y_UR_CHIP")) ESCAPE (IMAGE_Y_UR_CHIP, OPIHI_FLT);
     573  if (!strcasecmp (fieldName, "X_LL_FP"  )) ESCAPE (IMAGE_X_LL_FP,   OPIHI_FLT);
     574  if (!strcasecmp (fieldName, "X_LR_FP"  )) ESCAPE (IMAGE_X_LR_FP,   OPIHI_FLT);
     575  if (!strcasecmp (fieldName, "X_UL_FP"  )) ESCAPE (IMAGE_X_UL_FP,   OPIHI_FLT);
     576  if (!strcasecmp (fieldName, "X_UR_FP"  )) ESCAPE (IMAGE_X_UR_FP,   OPIHI_FLT);
     577  if (!strcasecmp (fieldName, "Y_LL_FP"  )) ESCAPE (IMAGE_Y_LL_FP,   OPIHI_FLT);
     578  if (!strcasecmp (fieldName, "Y_LR_FP"  )) ESCAPE (IMAGE_Y_LR_FP,   OPIHI_FLT);
     579  if (!strcasecmp (fieldName, "Y_UL_FP"  )) ESCAPE (IMAGE_Y_UL_FP,   OPIHI_FLT);
     580  if (!strcasecmp (fieldName, "Y_UR_FP"  )) ESCAPE (IMAGE_Y_UR_FP,   OPIHI_FLT);
     581
     582  if (!strcasecmp (fieldName, "dX_SYS"  )) ESCAPE (IMAGE_X_ERR_SYS,  OPIHI_FLT);
     583  if (!strcasecmp (fieldName, "dY_SYS"  )) ESCAPE (IMAGE_Y_ERR_SYS,  OPIHI_FLT);
     584  if (!strcasecmp (fieldName, "dM_SYS"  )) ESCAPE (IMAGE_MAG_ERR_SYS,OPIHI_FLT);
     585
     586  if (!strcasecmp (fieldName, "UBERCAL_DIST")) ESCAPE (IMAGE_UBERCAL_DIST,OPIHI_INT);
     587  if (!strcasecmp (fieldName, "UCDIST")) ESCAPE (IMAGE_UBERCAL_DIST,OPIHI_INT);
     588
     589  if (!strcasecmp (fieldName, "NFIT_PHOTOM"))  ESCAPE (IMAGE_NFIT_PHOTOM,  OPIHI_INT);
     590  if (!strcasecmp (fieldName, "NFIT_ASTROM"))  ESCAPE (IMAGE_NFIT_ASTROM,  OPIHI_INT);
     591  if (!strcasecmp (fieldName, "NLINK_PHOTOM")) ESCAPE (IMAGE_NLINK_PHOTOM, OPIHI_INT);
     592  if (!strcasecmp (fieldName, "NLINK_ASTROM")) ESCAPE (IMAGE_NLINK_ASTROM, OPIHI_INT);
     593  if (!strcasecmp (fieldName, "REF_COLOR"))    ESCAPE (IMAGE_REF_COLOR,    OPIHI_FLT);
    531594
    532595  // for words that don't parse, try a photcode
  • branches/eam_branches/ipp-20140610/Ohana/src/libdvo/src/dvo_photcode_ops.c

    r36898 r36908  
    1818
    1919static PhotCodeData *photcodes = NULL;
     20static PhotCode *genericCode = NULL;
    2021
    2122PhotCodeData *GetPhotcodeTable () {
     
    2627    photcodes[0].code = NULL;
    2728  }
     29  if (genericCode == NULL) {
     30    ALLOCATE (genericCode, PhotCode, 1);
     31    genericCode->code = 0;
     32    strcpy (genericCode->name, "MAG");
     33    genericCode->type = PHOT_MAG;
     34  }
    2835  return photcodes;
    2936}
     
    5764  if (name == NULL) return (NULL);
    5865 
     66  // "MAG" is a special word, not allowed for a photcode name
     67  if (!strcasecmp (name, "MAG")) {
     68    return genericCode;
     69  }
     70
    5971  for (i = 0; i < photcodes[0].Ncode; i++) {
    6072    if (!strcmp (photcodes[0].code[i].name, name)) {
     
    7082 
    7183  if (name == NULL) return (0);
     84
     85  // "MAG" is a special word, not allowed for a photcode name
     86  if (!strcasecmp (name, "MAG")) {
     87    return genericCode->code;
     88  }
    7289
    7390  for (i = 0; i < photcodes[0].Ncode; i++) {
     
    222239
    223240/******** photometry conversion functions *********/
    224 float PhotInst (Measure *measure) {
    225 
    226   int Np;
    227   float M;
    228 
    229   Np = photcodes[0].hashcode[measure[0].photcode];
     241float PhotInst (Measure *measure, dvoMagClassType class) {
     242
     243  int Np = photcodes[0].hashcode[measure[0].photcode];
    230244  if (Np == -1) return (NAN);
    231 
    232   if (photcodes[0].code[Np].type == PHOT_REF) {
    233     M = measure[0].M;
    234     return (M);
    235   }
    236 
    237   M = measure[0].M - measure[0].dt - ZERO_POINT;
    238          
    239   return (M);
    240 
    241 }
    242 
    243 float PhotCat (Measure *measure) {
    244 
    245   int Np;
    246   float Mcat;
    247   PhotCode *code;
    248 
    249   Np = photcodes[0].hashcode[measure[0].photcode];
     245  PhotCode *code = &photcodes[0].code[Np];
     246
     247  float Mraw = NAN;
     248  switch (class) {
     249    case MAG_CLASS_PSF:
     250      Mraw = measure[0].M;
     251      break;
     252    case MAG_CLASS_KRON:
     253      Mraw = measure[0].Mkron;
     254      break;
     255    case MAG_CLASS_APER:
     256      Mraw = measure[0].Map;
     257      break;
     258    default:
     259      break;
     260  }
     261  if (code->type == PHOT_REF) {
     262    return (Mraw);
     263  }
     264  float Minst = Mraw - measure[0].dt - ZERO_POINT;
     265
     266  return (Minst);
     267}
     268
     269float PhotCat (Measure *measure, dvoMagClassType class) {
     270
     271  int Np = photcodes[0].hashcode[measure[0].photcode];
    250272  if (Np == -1) return (NAN);
    251 
    252   if (photcodes[0].code[Np].type == PHOT_REF) {
    253     Mcat = measure[0].M;
    254     return (Mcat);
    255   }
    256   code = &photcodes[0].code[Np];
    257   Mcat = measure[0].M - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C;
     273  PhotCode *code = &photcodes[0].code[Np];
     274
     275  float Mraw = NAN;
     276  switch (class) {
     277    case MAG_CLASS_PSF:
     278      Mraw = measure[0].M;
     279      break;
     280    case MAG_CLASS_KRON:
     281      Mraw = measure[0].Mkron;
     282      break;
     283    case MAG_CLASS_APER:
     284      Mraw = measure[0].Map;
     285      break;
     286    default:
     287      break;
     288  }
     289  if (code->type == PHOT_REF) {
     290    return (Mraw);
     291  }
     292
     293  float Mcat = Mraw - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C;
    258294 
    259295  return (Mcat);
    260296}
    261297
    262 float PhotSys (Measure *measure, Average *average, SecFilt *secfilt) {
    263 
    264   int i, Np;
    265   float Mcat, Mcol, Msys, mc, Mc;
    266   PhotCode *code;
    267 
    268   Np = photcodes[0].hashcode[measure[0].photcode];
     298float PhotSys (Measure *measure, Average *average, SecFilt *secfilt, dvoMagClassType class) {
     299
     300  int Np = photcodes[0].hashcode[measure[0].photcode];
    269301  if (Np == -1) return (NAN);
    270 
    271   if (photcodes[0].code[Np].type == PHOT_REF) {
    272     Msys = measure[0].M;
    273     return (Msys);
    274   }
    275   code = &photcodes[0].code[Np];
    276   Mcat = measure[0].M - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C;
     302  PhotCode *code = &photcodes[0].code[Np];
     303
     304  float Mraw = NAN;
     305  switch (class) {
     306    case MAG_CLASS_PSF:
     307      Mraw = measure[0].M;
     308      break;
     309    case MAG_CLASS_KRON:
     310      Mraw = measure[0].Mkron;
     311      break;
     312    case MAG_CLASS_APER:
     313      Mraw = measure[0].Map;
     314      break;
     315    default:
     316      break;
     317  }
     318  if (code->type == PHOT_REF) {
     319    return (Mraw);
     320  }
     321  float Mcat = Mraw - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C;
    277322
    278323  /* for DEP, color must be made of PRI/SEC */
    279   mc = PhotColorForCode (average, secfilt, NULL, code);
     324  float mc = PhotColorForCode (average, secfilt, NULL, code);
    280325  if (isnan(mc)) return (Mcat);
    281   mc = mc - SCALE*code[0].dX;
    282 
    283   Mc = mc;
    284   Mcol = 0;
     326  mc -= SCALE*code[0].dX;
     327
     328  int i = 0;
     329  double Mc = mc;
     330  float Mcol = 0;
    285331  for (i = 0; i < code[0].Nc; i++) {
    286332    Mcol += code[0].X[i]*Mc;
    287333    Mc *= mc;
    288334  }
    289   Msys = Mcat + Mcol;
     335  float Msys = Mcat + Mcol;
    290336  return (Msys);
    291337}
    292338
    293 float PhotRel (Measure *measure, Average *average, SecFilt *secfilt) {
    294 
    295   int i, Np;
    296   float Mcat, Mcol, Mrel, mc, Mc;
    297   PhotCode *code;
    298 
    299   Np = photcodes[0].hashcode[measure[0].photcode];
     339float PhotRel (Measure *measure, Average *average, SecFilt *secfilt, dvoMagClassType class) {
     340
     341  int Np = photcodes[0].hashcode[measure[0].photcode];
    300342  if (Np == -1) return (NAN);
    301 
    302   if (photcodes[0].code[Np].type == PHOT_REF) {
    303     Mcat = measure[0].M;
    304     return (Mcat);
    305   }
    306   code = &photcodes[0].code[Np];
    307   Mrel = measure[0].M - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C - measure[0].Mcal;
     343  PhotCode *code = &photcodes[0].code[Np];
     344
     345  float Mraw = NAN;
     346  switch (class) {
     347    case MAG_CLASS_PSF:
     348      Mraw = measure[0].M;
     349      break;
     350    case MAG_CLASS_KRON:
     351      Mraw = measure[0].Mkron;
     352      break;
     353    case MAG_CLASS_APER:
     354      Mraw = measure[0].Map;
     355      break;
     356    default:
     357      break;
     358  }
     359  if (code->type == PHOT_REF) {
     360    return (Mraw);
     361  }
     362  float Mcat = Mraw - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C - measure[0].Mcal;
    308363
    309364  /* for DEP, color must be made of PRI/SEC */
    310   mc = PhotColorForCode (average, secfilt, NULL, code);
    311   if (isnan(mc)) return (Mrel);
    312   mc = mc - SCALE*code[0].dX;
    313 
    314   Mc = mc;
    315   Mcol = 0;
     365  float mc = PhotColorForCode (average, secfilt, NULL, code);
     366  if (isnan(mc)) return (Mcat);
     367  mc -= SCALE*code[0].dX;
     368
     369  double Mc = mc;
     370  float Mcol = 0;
     371  int i = 0;
     372  for (i = 0; i < code[0].Nc; i++) {
     373    Mcol += code[0].X[i]*Mc;
     374    Mc *= mc;
     375  }
     376  float Mrel = Mcat + Mcol;
     377  return (Mrel);
     378}
     379
     380/* return calibrated magnitude from measure for given photcode */
     381float PhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code, dvoMagClassType class) {
     382
     383  int i;
     384
     385  if (code == NULL) return NAN;
     386
     387  /* code must be the matching PRI/SEC code for this measurement or an equivalent ALT */
     388  int Np = photcodes[0].hashcode[thisone[0].photcode];
     389  if (Np == -1) return (NAN);
     390  PhotCode *myCode = &photcodes[0].code[Np];
     391
     392  if (code->code != myCode->equiv) return (NAN);
     393
     394  // if we are REF type, just get the right version and return
     395  if (myCode->type == PHOT_REF) {
     396    float Mraw = NAN;
     397    switch (class) {
     398      case MAG_CLASS_PSF:
     399        Mraw = thisone[0].M;
     400        break;
     401      case MAG_CLASS_KRON:
     402        Mraw = thisone[0].Mkron;
     403        break;
     404      case MAG_CLASS_APER:
     405        Mraw = thisone[0].Map;
     406        break;
     407      default:
     408        break;
     409    }
     410    return (Mraw);
     411  }
     412
     413  float Mcal = PhotRel (thisone, average, secfilt, class) + SCALE*code[0].C;
     414
     415  float mc = PhotColorForCode (average, secfilt, measure, code);
     416  if (isnan(mc)) return (Mcal);
     417  mc -= SCALE*code[0].dX;
     418
     419  double Mc = mc;
     420  float Mcol = 0;
     421  for (i = 0; i < code[0].Nc; i++) {
     422    Mcol += code[0].X[i]*Mc;
     423    Mc *= mc;
     424  }
     425  Mcal += Mcol;
     426  return (Mcal);
     427}
     428
     429/***/
     430float PhotAve (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source) {
     431
     432  if (code == NULL) return NAN;
     433
     434  int Ns = photcodes[0].hashNsec[code[0].code];
     435  if (Ns == -1) return (NAN);
     436
     437  float Mave = NAN;
     438  switch (source) {
     439    case MAG_SRC_CHP:
     440      switch (class) {
     441        case MAG_CLASS_PSF:
     442          Mave = secfilt[Ns].M;
     443          break;
     444        case MAG_CLASS_KRON:
     445          Mave = secfilt[Ns].Mkron;
     446          break;
     447        case MAG_CLASS_APER:
     448          Mave = secfilt[Ns].Map;
     449          break;
     450        default:
     451          break;
     452      }
     453      break;
     454    case MAG_SRC_WRP:
     455      switch (class) {
     456        case MAG_CLASS_PSF:
     457          Mave = secfilt[Ns].MpsfWrp;
     458          break;
     459        case MAG_CLASS_KRON:
     460          Mave = secfilt[Ns].MkronWrp;
     461          break;
     462        case MAG_CLASS_APER:
     463          Mave = secfilt[Ns].MapWrp;
     464          break;
     465        default:
     466          break;
     467      }
     468      break;
     469    case MAG_SRC_STK:
     470      switch (class) {
     471        case MAG_CLASS_PSF:
     472          Mave = secfilt[Ns].MpsfStk;
     473          break;
     474        case MAG_CLASS_KRON:
     475          Mave = secfilt[Ns].MkronStk;
     476          break;
     477        case MAG_CLASS_APER:
     478          Mave = secfilt[Ns].MapStk;
     479          break;
     480        default:
     481          break;
     482      }
     483      break;
     484    default:
     485      break;
     486  }
     487  return (Mave);
     488}
     489
     490/* return calibrated magnitude from average/secfilt for given photcode */
     491float PhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure, dvoMagClassType class, dvoMagSourceType source) {
     492
     493  int i;
     494
     495  float Mave = PhotAve (code, average, secfilt, class, source);
     496  if (isnan(Mave)) return NAN;
     497
     498  // correct for relative zero-point
     499  float Mref = Mave + SCALE*code[0].C;
     500
     501  float mc = PhotColorForCode (average, secfilt, measure, code);
     502  if (isnan(mc)) return (Mref);
     503  mc -= SCALE*code[0].dX;
     504
     505  // correct for color terms
     506  double Mc = mc;
     507  float Mcol = 0;
    316508  for (i = 0; i < code[0].Nc; i++) {
    317509    Mcol += code[0].X[i]*Mc;
    318510    Mc *= mc;    /* the 0.001 is needed for higher order terms to keep the units mag = mag^n */
    319511  }
    320   Mrel += Mcol;
    321   return (Mrel);
    322 }
    323 
    324 /* return calibrated magnitude from measure for given photcode */
    325 float PhotCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code) {
    326 
    327   int i, Np;
    328   float Mcal, Mrel, Mcol, mc, Mc;
    329 
    330   if (code == NULL) return NAN;
    331 
    332   /* code must be the matching PRI/SEC code for this measurement or an equivalent ALT */
    333   Np = photcodes[0].hashcode[thisone[0].photcode];
    334   if (Np == -1) return (NAN);
    335 
    336   if (photcodes[0].code[Np].type == PHOT_REF) {
    337     Mrel = thisone[0].M;
    338     return (Mrel);
    339   }
    340   if (code[0].code != photcodes[0].code[Np].equiv) return (NAN);
    341 
    342   Mcal = PhotRel (thisone, average, secfilt) + SCALE*code[0].C;
    343 
    344   mc = PhotColorForCode (average, secfilt, measure, code);
    345   if (isnan(mc)) return (Mcal);
    346   mc = mc - SCALE*code[0].dX;
    347 
    348   Mc = mc;
    349   Mcol = 0;
    350   for (i = 0; i < code[0].Nc; i++) {
    351     Mcol += code[0].X[i]*Mc;
    352     Mc *= mc;
    353   }
    354   Mcal += Mcol;
    355   return (Mcal);
    356 }
    357 
    358 /***/
    359 float PhotAve (PhotCode *code, Average *average, SecFilt *secfilt) {
    360 
    361   int Ns;
    362   float Mave;
    363 
    364   if (code == NULL) return NAN;
    365 
    366   Ns = photcodes[0].hashNsec[code[0].code];
    367   Mave = (Ns == -1) ? NAN : secfilt[Ns].M;
    368   return (Mave);
    369 }
    370 
    371 /* return calibrated magnitude from average/secfilt for given photcode */
    372 float PhotRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure) {
    373 
    374   int i, Ns;
    375   float Mave, Mref, Mcol, mc;
    376   double Mc;
    377 
    378   if (code == NULL) return NAN;
    379 
    380   Ns = photcodes[0].hashNsec[code[0].code];
    381   Mave = (Ns == -1) ? NAN : secfilt[Ns].M;
    382   Mref = Mave + SCALE*code[0].C;
    383 
    384   mc = PhotColorForCode (average, secfilt, measure, code);
    385   if (isnan(mc)) return (Mref);
    386   mc = mc - SCALE*code[0].dX;
    387 
    388   Mc = mc;
    389   Mcol = 0;
    390   for (i = 0; i < code[0].Nc; i++) {
    391     Mcol += code[0].X[i]*Mc;
    392     Mc *= mc;    /* the 0.001 is needed for higher order terms to keep the units mag = mag^n */
    393   }
    394512  Mref += Mcol;
    395513  return (Mref);
    396514}
    397515
    398 float PhotAveErr (PhotCode *code, Average *average, SecFilt *secfilt) {
    399 
    400   int Ns;
    401   float dM;
    402 
    403   if (code == NULL) return NAN;
    404 
    405   Ns = photcodes[0].hashNsec[code[0].code];
    406   dM  = (Ns == -1) ? NAN : secfilt[Ns].dM;
    407   return (dM);
    408 }
    409 
    410 /************************************** APERTURE-related Magnitudes ***********************************************/
    411 
    412 float PhotAperInst (Measure *measure) {
    413 
    414   int Np;
    415   float Minst;
    416 
    417   Np = photcodes[0].hashcode[measure[0].photcode];
    418   if (Np == -1) return (NAN);
    419 
    420   if (photcodes[0].code[Np].type == PHOT_REF) {
    421     Minst = measure[0].Map;
    422     return (Minst);
    423   }
    424   Minst = measure[0].Map - measure[0].dt - ZERO_POINT;
    425  
    426   return (Minst);
    427 }
    428 
    429 float PhotAperCat (Measure *measure) {
    430 
    431   int Np;
    432   float Mcat;
    433   PhotCode *code;
    434 
    435   Np = photcodes[0].hashcode[measure[0].photcode];
    436   if (Np == -1) return (NAN);
    437 
    438   if (photcodes[0].code[Np].type == PHOT_REF) {
    439     Mcat = measure[0].Map;
    440     return (Mcat);
    441   }
    442   code = &photcodes[0].code[Np];
    443   Mcat = measure[0].Map - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C;
    444  
    445   return (Mcat);
    446 }
    447 
    448 float PhotAperSys (Measure *measure, Average *average, SecFilt *secfilt) {
    449 
    450   int i, Np;
    451   float Mcat, Mcol, Msys, mc, Mc;
    452   PhotCode *code;
    453 
    454   Np = photcodes[0].hashcode[measure[0].photcode];
    455   if (Np == -1) return (NAN);
    456 
    457   if (photcodes[0].code[Np].type == PHOT_REF) {
    458     Mcat = measure[0].Map;
    459     return (Mcat);
    460   }
    461   code = &photcodes[0].code[Np];
    462   Mcat = measure[0].Map - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C;
    463  
    464   /* for DEP, color must be made of PRI/SEC */
    465   mc = PhotColorForCode (average, secfilt, NULL, code);
    466   if (isnan(mc)) return (Mcat);
    467   mc = mc - SCALE*code[0].dX;
    468 
    469   Mc = mc;
    470   Mcol = 0;
    471   for (i = 0; i < code[0].Nc; i++) {
    472     Mcol += code[0].X[i]*Mc;
    473     Mc *= mc;
    474   }
    475   Msys = Mcat + Mcol;
    476   return (Msys);
    477 }
    478 
    479 float PhotAperRel (Measure *measure, Average *average, SecFilt *secfilt) {
    480 
    481   int i, Np;
    482   float Mcat, Mcol, Mrel, mc, Mc;
    483   PhotCode *code;
    484 
    485   Np = photcodes[0].hashcode[measure[0].photcode];
    486   if (Np == -1) return (NAN);
    487 
    488   if (photcodes[0].code[Np].type == PHOT_REF) {
    489     Mcat = measure[0].Map;
    490     return (Mcat);
    491   }
    492   code = &photcodes[0].code[Np];
    493   Mrel = measure[0].Map - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C - measure[0].Mcal;
    494 
    495   /* for DEP, color must be made of PRI/SEC */
    496   mc = PhotColorForCode (average, secfilt, NULL, code);
    497   if (isnan(mc)) return (Mrel);
    498   mc = mc - SCALE*code[0].dX;
    499 
    500   Mc = mc;
    501   Mcol = 0;
    502   for (i = 0; i < code[0].Nc; i++) {
    503     Mcol += code[0].X[i]*Mc;
    504     Mc *= mc;    /* the 0.001 is needed for higher order terms to keep the units mag = mag^n */
    505   }
    506   Mrel += Mcol;
    507   return (Mrel);
    508 }
    509 
    510 /* return calibrated magnitude from measure for given photcode */
    511 float PhotAperCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code) {
    512 
    513   int i, Np;
    514   float Mcal, Mrel, Mcol, mc, Mc;
    515 
    516   if (code == NULL) return NAN;
    517 
    518   /* code must be the matching PRI/SEC code for this measurement or an equivalent ALT */
    519   Np = photcodes[0].hashcode[thisone[0].photcode];
    520   if (Np == -1) return (NAN);
    521 
    522   if (photcodes[0].code[Np].type == PHOT_REF) {
    523     Mrel = thisone[0].Map;
    524     return (Mrel);
    525   }
    526   if (code[0].code != photcodes[0].code[Np].equiv) return (NAN);
    527 
    528   Mcal = PhotAperRel (thisone, average, secfilt) + SCALE*code[0].C;
    529 
    530   mc = PhotColorForCode (average, secfilt, measure, code);
    531   if (isnan(mc)) return (Mcal);
    532   mc = mc - SCALE*code[0].dX;
    533 
    534   Mc = mc;
    535   Mcol = 0;
    536   for (i = 0; i < code[0].Nc; i++) {
    537     Mcol += code[0].X[i]*Mc;
    538     Mc *= mc;
    539   }
    540   Mcal += Mcol;
    541   return (Mcal);
    542 }
    543 
    544 float PhotAperAve (PhotCode *code, Average *average, SecFilt *secfilt) {
    545 
    546   int Ns;
    547   float Maper;
    548 
    549   if (code == NULL) return NAN;
    550 
    551   Ns = photcodes[0].hashNsec[code[0].code];
    552   Maper = (Ns == -1) ? NAN : secfilt[Ns].Map;
    553   return (Maper);
    554 }
    555 
    556 /* return calibrated magnitude from average/secfilt for given photcode */
    557 float PhotAperRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure) {
    558 
    559   int i, Ns;
    560   float Mave, Mref, Mcol, mc;
    561   double Mc;
    562 
    563   if (code == NULL) return NAN;
    564 
    565   Ns = photcodes[0].hashNsec[code[0].code];
    566   Mave = (Ns == -1) ? NAN : secfilt[Ns].Map;
    567   Mref = Mave + SCALE*code[0].C;
    568 
    569   mc = PhotColorForCode (average, secfilt, measure, code);
    570   if (isnan(mc)) return (Mref);
    571   mc = mc - SCALE*code[0].dX;
    572 
    573   Mc = mc;
    574   Mcol = 0;
    575   for (i = 0; i < code[0].Nc; i++) {
    576     Mcol += code[0].X[i]*Mc;
    577     Mc *= mc;    /* the 0.001 is needed for higher order terms to keep the units mag = mag^n */
    578   }
    579   Mref += Mcol;
    580   return (Mref);
    581 }
    582 
    583 /************************************** KRON-related Magnitudes ***********************************************/
    584 
    585 float PhotKronInst (Measure *measure) {
    586 
    587   int Np;
    588   float Minst;
    589 
    590   Np = photcodes[0].hashcode[measure[0].photcode];
    591   if (Np == -1) return (NAN);
    592 
    593   if (photcodes[0].code[Np].type == PHOT_REF) {
    594     Minst = measure[0].Mkron;
    595     return (Minst);
    596   }
    597   Minst = measure[0].Mkron - measure[0].dt - ZERO_POINT;
    598  
    599   return (Minst);
    600 }
    601 
    602 float PhotKronCat (Measure *measure) {
    603 
    604   int Np;
    605   float Mcat;
    606   PhotCode *code;
    607 
    608   Np = photcodes[0].hashcode[measure[0].photcode];
    609   if (Np == -1) return (NAN);
    610 
    611   if (photcodes[0].code[Np].type == PHOT_REF) {
    612     Mcat = measure[0].Mkron;
    613     return (Mcat);
    614   }
    615   code = &photcodes[0].code[Np];
    616   Mcat = measure[0].Mkron - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C;
    617  
    618   return (Mcat);
    619 }
    620 
    621 float PhotKronSys (Measure *measure, Average *average, SecFilt *secfilt) {
    622 
    623   int i, Np;
    624   float Mcat, Mcol, Msys, mc, Mc;
    625   PhotCode *code;
    626 
    627   Np = photcodes[0].hashcode[measure[0].photcode];
    628   if (Np == -1) return (NAN);
    629 
    630   if (photcodes[0].code[Np].type == PHOT_REF) {
    631     Msys = measure[0].Mkron;
    632     return (Msys);
    633   }
    634   code = &photcodes[0].code[Np];
    635   Mcat = measure[0].Mkron - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C;
    636 
    637   /* for DEP, color must be made of PRI/SEC */
    638   mc = PhotColorForCode (average, secfilt, NULL, code);
    639   if (isnan(mc)) return (Mcat);
    640   mc = mc - SCALE*code[0].dX;
    641 
    642   Mc = mc;
    643   Mcol = 0;
    644   for (i = 0; i < code[0].Nc; i++) {
    645     Mcol += code[0].X[i]*Mc;
    646     Mc *= mc;
    647   }
    648   Msys = Mcat + Mcol;
    649   return (Msys);
    650 }
    651 
    652 float PhotKronRel (Measure *measure, Average *average, SecFilt *secfilt) {
    653 
    654   int i, Np;
    655   float Mcat, Mcol, Mrel, mc, Mc;
    656   PhotCode *code;
    657 
    658   Np = photcodes[0].hashcode[measure[0].photcode];
    659   if (Np == -1) return (NAN);
    660 
    661   if (photcodes[0].code[Np].type == PHOT_REF) {
    662     Mcat = measure[0].Mkron;
    663     return (Mcat);
    664   }
    665   code = &photcodes[0].code[Np];
    666   Mrel = measure[0].Mkron - ZERO_POINT + code[0].K*(measure[0].airmass - 1.000) + SCALE*code[0].C - measure[0].Mcal;
    667 
    668   /* for DEP, color must be made of PRI/SEC */
    669   mc = PhotColorForCode (average, secfilt, NULL, code);
    670   if (isnan(mc)) return (Mrel);
    671   mc = mc - SCALE*code[0].dX;
    672 
    673   Mc = mc;
    674   Mcol = 0;
    675   for (i = 0; i < code[0].Nc; i++) {
    676     Mcol += code[0].X[i]*Mc;
    677     Mc *= mc;    /* the 0.001 is needed for higher order terms to keep the units mag = mag^n */
    678   }
    679   Mrel += Mcol;
    680   return (Mrel);
    681 }
    682 
    683 /* return calibrated magnitude from measure for given photcode */
    684 float PhotKronCal (Measure *thisone, Average *average, SecFilt *secfilt, Measure *measure, PhotCode *code) {
    685 
    686   int i, Np;
    687   float Mcal, Mrel, Mcol, mc, Mc;
    688 
    689   if (code == NULL) return NAN;
    690 
    691   /* code must be the matching PRI/SEC code for this measurement or an equivalent ALT */
    692   Np = photcodes[0].hashcode[thisone[0].photcode];
    693   if (Np == -1) return (NAN);
    694 
    695   if (photcodes[0].code[Np].type == PHOT_REF) {
    696     Mrel = thisone[0].Mkron;
    697     return (Mrel);
    698   }
    699   if (code[0].code != photcodes[0].code[Np].equiv) return (NAN);
    700 
    701   Mcal = PhotKronRel (thisone, average, secfilt) + SCALE*code[0].C;
    702 
    703   mc = PhotColorForCode (average, secfilt, measure, code);
    704   if (isnan(mc)) return (Mcal);
    705   mc = mc - SCALE*code[0].dX;
    706 
    707   Mc = mc;
    708   Mcol = 0;
    709   for (i = 0; i < code[0].Nc; i++) {
    710     Mcol += code[0].X[i]*Mc;
    711     Mc *= mc;
    712   }
    713   Mcal += Mcol;
    714   return (Mcal);
    715 }
    716 
    717 float PhotKronAve (PhotCode *code, Average *average, SecFilt *secfilt) {
    718 
    719   int Ns;
    720   float Mkron;
    721 
    722   if (code == NULL) return NAN;
    723 
    724   Ns = photcodes[0].hashNsec[code[0].code];
    725   Mkron = (Ns == -1) ? NAN : secfilt[Ns].Mkron;
    726   return (Mkron);
    727 }
    728 
    729 /* return calibrated magnitude from average/secfilt for given photcode */
    730 float PhotKronRef (PhotCode *code, Average *average, SecFilt *secfilt, Measure *measure) {
    731 
    732   int i, Ns;
    733   float Mave, Mref, Mcol, mc;
    734   double Mc;
    735 
    736   if (code == NULL) return NAN;
    737 
    738   Ns = photcodes[0].hashNsec[code[0].code];
    739   Mave = (Ns == -1) ? NAN : secfilt[Ns].Mkron;
    740   Mref = Mave + SCALE*code[0].C;
    741 
    742   mc = PhotColorForCode (average, secfilt, measure, code);
    743   if (isnan(mc)) return (Mref);
    744   mc = mc - SCALE*code[0].dX;
    745 
    746   Mc = mc;
    747   Mcol = 0;
    748   for (i = 0; i < code[0].Nc; i++) {
    749     Mcol += code[0].X[i]*Mc;
    750     Mc *= mc;    /* the 0.001 is needed for higher order terms to keep the units mag = mag^n */
    751   }
    752   Mref += Mcol;
    753   return (Mref);
    754 }
    755 
    756 float PhotKronAveErr (PhotCode *code, Average *average, SecFilt *secfilt) {
    757 
    758   int Ns;
    759   float dMkron;
    760 
    761   if (code == NULL) return NAN;
    762 
    763   Ns = photcodes[0].hashNsec[code[0].code];
    764   dMkron = (Ns == -1) ? NAN : secfilt[Ns].dMkron;
    765   return (dMkron);
     516float PhotErr (Measure *measure, dvoMagClassType class) {
     517
     518  float dMraw = NAN;
     519  switch (class) {
     520    case MAG_CLASS_PSF:
     521      dMraw = measure[0].dM;
     522      break;
     523    case MAG_CLASS_KRON:
     524      dMraw = measure[0].dMkron;
     525      break;
     526    case MAG_CLASS_APER:
     527      dMraw = measure[0].dMap;
     528      break;
     529    default:
     530      break;
     531  }
     532  return (dMraw);
     533}
     534
     535float PhotAveErr (PhotCode *code, Average *average, SecFilt *secfilt, dvoMagClassType class, dvoMagSourceType source) {
     536
     537  if (code == NULL) return NAN;
     538
     539  int Ns = photcodes[0].hashNsec[code[0].code];
     540  if (Ns == -1) return (NAN);
     541
     542  float dMave = NAN;
     543  switch (source) {
     544    case MAG_SRC_CHP:
     545      switch (class) {
     546        case MAG_CLASS_PSF:
     547          dMave = secfilt[Ns].dM;
     548          break;
     549        case MAG_CLASS_KRON:
     550          dMave = secfilt[Ns].dMkron;
     551          break;
     552        case MAG_CLASS_APER:
     553          dMave = secfilt[Ns].dMap;
     554          break;
     555        default:
     556          break;
     557      }
     558      break;
     559    case MAG_SRC_WRP:
     560      switch (class) {
     561        case MAG_CLASS_PSF:
     562          dMave = secfilt[Ns].dFpsfWrp / secfilt[Ns].FpsfWrp;
     563          break;
     564        case MAG_CLASS_KRON:
     565          dMave = secfilt[Ns].dFkronWrp / secfilt[Ns].FkronWrp;
     566          break;
     567        case MAG_CLASS_APER:
     568          dMave = secfilt[Ns].dFapWrp / secfilt[Ns].FapWrp;
     569          break;
     570        default:
     571          break;
     572      }
     573      break;
     574    case MAG_SRC_STK:
     575      switch (class) {
     576        case MAG_CLASS_PSF:
     577          dMave = secfilt[Ns].dFpsfStk / secfilt[Ns].FpsfStk;
     578          break;
     579        case MAG_CLASS_KRON:
     580          dMave = secfilt[Ns].dFkronStk / secfilt[Ns].FkronStk;
     581          break;
     582        case MAG_CLASS_APER:
     583          dMave = secfilt[Ns].dFapStk / secfilt[Ns].FapStk;
     584          break;
     585        default:
     586          break;
     587      }
     588      break;
     589    default:
     590      break;
     591  }
     592  return (dMave);
    766593}
    767594
Note: See TracChangeset for help on using the changeset viewer.