IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 30, 2013, 2:29:11 PM (13 years ago)
Author:
bills
Message:

Handle potential incompatabilities between cmf files and current psphot recipe.
When reading XSRC or XRAD extensions from cmf file save the vectors for
RADIAL.ANNULAR.BINS.LOWER and RADIAL.ANNULAR.BINS.UPPER on the readout->analysis.
Then when writing the output cmf use those values (if they exist) and if not fall
back to the current recipe. The latter case will be used when the XSRC and XRAD
analyses are done by the process and the former when the code is just passing through
results from input to output

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/objects/pmSourceIO_CMF.c.in

    r35038 r35610  
    457457    bool doPetrosian    = psMetadataLookupBool (&status, recipe, "EXTENDED_SOURCE_PETROSIAN");
    458458
    459     psVector *radMin = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.LOWER");
    460     psVector *radMax = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.UPPER");
     459    // First look for radial bin definition in readout->analysis ...
     460    psVector *radMin = psMetadataLookupPtr (&status, readout->analysis, "RADIAL.ANNULAR.BINS.LOWER");
     461    psVector *radMax = psMetadataLookupPtr (&status, readout->analysis, "RADIAL.ANNULAR.BINS.UPPER");
     462    if (!radMin) {
     463        // .. if not found use the recipe values
     464        radMin = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.LOWER");
     465        radMax = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.UPPER");
     466    }
     467    psAssert(radMin != NULL, "unable to find RADIAL.ANNULAR.BINS.LOWER");
     468    psAssert(radMax != NULL, "unable to find RADIAL.ANNULAR.BINS.LOWER");
    461469    psAssert (radMin->n == radMax->n, "inconsistent annular bins");
    462470
     
    610618}
    611619
    612 bool pmSourcesRead_CMF_@CMFMODE@_XSRC(psFits *fits, psMetadata *hduHeader, psArray *sources, long *sourceIndex)
     620static bool setRadialBinsInAnalysis(pmReadout *readout, psMetadata *tableHeader)
     621{
     622    if (!readout->analysis) {
     623        readout->analysis = psMetadataAlloc();
     624    }
     625
     626    bool status;
     627    psVector *oldRMin = psMetadataLookupVector(&status, readout->analysis, "RADIAL.ANNULAR.BINS.LOWER");
     628    psVector *oldRMax = psMetadataLookupVector(&status, readout->analysis, "RADIAL.ANNULAR.BINS.UPPER");
     629
     630    psVector *rMin = psVectorAllocEmpty(20, PS_TYPE_F32);
     631    psVector *rMax = psVectorAllocEmpty(20, PS_TYPE_F32);
     632
     633    for (int i = 0; ; i++) {
     634        char key [24];
     635        sprintf(key, "RMIN_%02d", i);
     636        psF32 rMinVal = psMetadataLookupF32(&status, tableHeader, key);
     637        if (!status) {
     638            break;
     639        }
     640        psVectorAppend(rMin, rMinVal);
     641
     642        sprintf(key, "RMAX_%02d", i);
     643        psF32 rMaxVal = psMetadataLookupF32(&status, tableHeader, key);
     644        if (!status) {
     645            break;
     646        }
     647        psVectorAppend(rMax, rMaxVal);
     648    }
     649
     650    if (rMin->n != rMax->n) {
     651        psError(PS_ERR_UNKNOWN, true, "number of RMIN entries %ld does not equal number of RMAX entries %ld",
     652            rMin->n, rMax->n);
     653        return false;
     654    }
     655
     656    if (oldRMin) {
     657        if (oldRMin->n != rMin->n) {
     658            psError(PS_ERR_UNKNOWN, true, "number of RMIN entries in header: %ld does not equal number of RMAX entries in analysis: %ld",
     659                rMin->n, oldRMin->n);
     660            return false;
     661        }
     662    } else {
     663        psMetadataAddVector(readout->analysis, PS_LIST_TAIL, "RADIAL.ANNULAR.BINS.LOWER", PS_META_REPLACE, "", rMin);
     664    }
     665    psFree(rMin);
     666
     667    if (oldRMax) {
     668        if (oldRMax->n != rMax->n) {
     669            psError(PS_ERR_UNKNOWN, true, "number of RMIN entries in header: %ld does not equal number of RMAX entries in analysis: %ld",
     670                rMax->n, oldRMax->n);
     671            return false;
     672        }
     673    } else {
     674        psMetadataAddVector(readout->analysis, PS_LIST_TAIL, "RADIAL.ANNULAR.BINS.UPPER", PS_META_REPLACE, "", rMax);
     675    }
     676    psFree(rMax);
     677
     678    return true;
     679}
     680
     681bool pmSourcesRead_CMF_@CMFMODE@_XSRC(psFits *fits, pmReadout *readout, psMetadata *hduHeader, psMetadata *tableHeader, psArray *sources, long *sourceIndex)
    613682{
    614683    PS_ASSERT_PTR_NON_NULL(fits, false);
     
    626695    float exptime = psMetadataLookupF32(&status, hduHeader, "EXPTIME");
    627696    float magOffset = zeropt + 2.5*log10(exptime);
     697
     698    if (!setRadialBinsInAnalysis(readout, tableHeader)) {
     699        psError(PS_ERR_UNKNOWN, false, "Failed to save radial bins in analysis");
     700        return false;
     701    }
    628702
    629703    for (long i = 0; i < numSources; i++) {
     
    920994}
    921995
    922 bool pmSourcesRead_CMF_@CMFMODE@_XFIT(psFits *fits, psMetadata *hduHeader, psArray *sources, long *sourceIndex)
     996bool pmSourcesRead_CMF_@CMFMODE@_XFIT(psFits *fits, pmReadout *readout, psMetadata *hduHeader, psMetadata *tableHeader, psArray *sources, long *sourceIndex)
    923997{
    924998    PS_ASSERT_PTR_NON_NULL(fits, false);
     
    10431117
    10441118    // we use this just to define the output vectors (which must be present for all objects)
    1045     psVector *radMin = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.LOWER");
    1046     psVector *radMax = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.UPPER");
     1119    // First look for radial bin definition in readout->analysis ...
     1120    psVector *radMin = psMetadataLookupPtr (&status, readout->analysis, "RADIAL.ANNULAR.BINS.LOWER");
     1121    psVector *radMax = psMetadataLookupPtr (&status, readout->analysis, "RADIAL.ANNULAR.BINS.UPPER");
     1122    if (!radMin) {
     1123        // .. if not found use the recipe values
     1124        radMin = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.LOWER");
     1125        radMax = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.UPPER");
     1126    }
     1127    psAssert (radMin, "this must have been defined and tested earlier!");
    10471128    psAssert (radMax, "this must have been defined and tested earlier!");
    1048     psAssert (radMax->n, "this must have been defined and tested earlier!");
    10491129    psAssert (radMin->n == radMax->n, "inconsistent annular bins");
    10501130
     
    11671247}
    11681248
    1169 bool pmSourcesRead_CMF_@CMFMODE@_XRAD(psFits *fits, pmReadout *readout, psMetadata *hduHeader, psArray *sources, long *sourceIndex)
     1249bool pmSourcesRead_CMF_@CMFMODE@_XRAD(psFits *fits, pmReadout *readout, psMetadata *hduHeader, psMetadata *tableHeader, psArray *sources, long *sourceIndex)
    11701250{
    11711251    PS_ASSERT_PTR_NON_NULL(fits, false);
     
    11761256    if (numSources == 0) {
    11771257        psError(psErrorCodeLast(), false, "XRAD Table contains no entries\n");
     1258        return false;
     1259    }
     1260
     1261    if (!setRadialBinsInAnalysis(readout, tableHeader)) {
     1262        psError(PS_ERR_UNKNOWN, false, "Failed to save radial bins in analysis");
    11781263        return false;
    11791264    }
Note: See TracChangeset for help on using the changeset viewer.