IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 19, 2011, 1:22:04 PM (14 years ago)
Author:
bills
Message:

Add and call functions to read the extended source extensions for the PS1_SV1
cmf format

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c

    r32347 r32971  
    539539}
    540540
     541bool pmSourcesRead_CMF_PS1_SV1_XSRC(psFits *fits, psMetadata *hduHeader, psArray *sources, long *sourceIndex)
     542{
     543    PS_ASSERT_PTR_NON_NULL(fits, false);
     544    PS_ASSERT_PTR_NON_NULL(sources, false);
     545
     546    bool status;
     547    long numSources = psFitsTableSize(fits); // Number of sources in table
     548    if (numSources == 0) {
     549        psError(psErrorCodeLast(), false, "XSRC Table contains no entries\n");
     550        return false;
     551    }
     552
     553    // petrosian mags are not saved, we need to calculate fluxes. For this we need exptime and zero point
     554    float zeropt = psMetadataLookupF32(&status, hduHeader, "FPA.ZP");
     555    float exptime = psMetadataLookupF32(&status, hduHeader, "EXPTIME");
     556    float magOffset = zeropt + 2.5*log10(exptime);
     557
     558    for (long i = 0; i < numSources; i++) {
     559        psMetadata *row = psFitsReadTableRow(fits, i); // Table row
     560        if (!row) {
     561            psError(psErrorCodeLast(), false, "Unable to read row %ld of sources", i);
     562            psFree(row);
     563            return false;
     564        }
     565        // Find the source with this sequence number.
     566        // XXX: I am assuming that sources is sorted in order of seq
     567        long seq = psMetadataLookupU32 (&status, row, "IPP_IDET");
     568        pmSource *source = NULL;
     569#ifndef ASSUME_SORTED
     570        long j = seq < sources->n ? seq : sources->n - 1;
     571        for (; j >= 0; j--) {
     572            source = sources->data[j];
     573            if (source->seq == seq) {
     574                break;
     575            }
     576        }
     577#else
     578        long j = sourceIndex[seq];
     579        psAssert(j >= 0 && j < sources->n, "invalid sourceIndex");
     580        source = sources->data[j];
     581#endif
     582        if (!source) {
     583            psError(PS_ERR_UNKNOWN, false, "Failed to find source for row %ld sequence number %ld\n", i, seq);
     584            psFree(row);
     585            return false;
     586        }
     587
     588        if (!source->extpars) {
     589            source->extpars = pmSourceExtendedParsAlloc ();
     590        }
     591        pmSourceExtendedPars *extpars = source->extpars;
     592
     593        // Assume that X_EXT Y_EXT and sigmas match the psf src so skip
     594
     595        // We don't have enough information to calculate the major and minor axis. Set major to 1. Should we scale this by
     596        // psf size or something?
     597        extpars->axes.major = 1.0;
     598        extpars->axes.minor = extpars->axes.major * psMetadataLookupF32(&status, row, "F25_ARATIO");
     599        extpars->axes.theta = psMetadataLookupF32(&status, row, "F25_THETA");
     600
     601        float mag = psMetadataLookupF32(&status, row, "PETRO_MAG");
     602        float magErr = psMetadataLookupF32(&status, row, "PETRO_MAG_ERR");
     603        if (isfinite(mag)) {
     604            extpars->petrosianFlux    = pow(10., (magOffset - mag) / 2.5);
     605            if (isfinite(magErr)) {
     606                extpars->petrosianFluxErr = extpars->petrosianFlux / magErr;
     607            }
     608        }
     609
     610        extpars->petrosianRadius   = psMetadataLookupF32(&status, row, "PETRO_RADIUS");
     611        extpars->petrosianRadiusErr= psMetadataLookupF32(&status, row, "PETRO_RADIUS_ERR");
     612        extpars->petrosianR50      = psMetadataLookupF32(&status, row, "PETRO_RADIUS_50");
     613        extpars->petrosianR50Err   = psMetadataLookupF32(&status, row, "PETRO_RADIUS_50_ERR");
     614        extpars->petrosianR90      = psMetadataLookupF32(&status, row, "PETRO_RADIUS_90");
     615        extpars->petrosianR90Err   = psMetadataLookupF32(&status, row, "PETRO_RADIUS_90_ERR");
     616        extpars->petrosianFill     = psMetadataLookupF32(&status, row, "PETRO_FILL");
     617
     618        psVector *radSB   = psMetadataLookupVector(&status, row, "PROF_SB");
     619        psVector *radFlux = psMetadataLookupVector(&status, row, "PROF_FLUX");
     620        psVector *radFill = psMetadataLookupVector(&status, row, "PROF_FILL");
     621
     622        if (radSB && radSB->n > 0) {
     623            extpars->radProfile = pmSourceRadialProfileAlloc();
     624            extpars->radProfile->binSB   = psMemIncrRefCounter(radSB);
     625            extpars->radProfile->binSum   = psMemIncrRefCounter(radFlux);
     626            extpars->radProfile->binFill = psMemIncrRefCounter(radFill);
     627        }
     628
     629        psFree(row);
     630    }
     631
     632    return true;
     633}
     634
    541635// XXX this layout is still the same as PS1_DEV_1
    542636bool pmSourcesWrite_CMF_PS1_SV1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname)
     
    684778    psFree (outhead);
    685779    psFree (table);
     780    return true;
     781}
     782
     783bool pmSourcesRead_CMF_PS1_SV1_XFIT(psFits *fits, psMetadata *hduHeader, psArray *sources, long *sourceIndex)
     784{
     785    PS_ASSERT_PTR_NON_NULL(fits, false);
     786    PS_ASSERT_PTR_NON_NULL(sources, false);
     787
     788    bool status;
     789    long numSources = psFitsTableSize(fits); // Number of sources in table
     790    if (numSources == 0) {
     791        psError(psErrorCodeLast(), false, "XFIT Table contains no entries\n");
     792        return false;
     793    }
     794
     795    for (long i = 0; i < numSources; i++) {
     796        psMetadata *row = psFitsReadTableRow(fits, i); // Table row
     797        if (!row) {
     798            psError(psErrorCodeLast(), false, "Unable to read row %ld of sources", i);
     799            psFree(row);
     800            return false;
     801        }
     802        // Find the source with this sequence number.
     803        // XXX: I am assuming that sources is sorted in order of seq.
     804        long seq = psMetadataLookupU32 (&status, row, "IPP_IDET");
     805        long j = seq < sources->n ? seq : sources->n - 1;
     806        pmSource *source = NULL;
     807        for (; j >= 0; j--) {
     808            source = sources->data[j];
     809            if (source->seq == seq) {
     810                break;
     811            }
     812        }
     813        if (!source) {
     814            psError(PS_ERR_UNKNOWN, false, "Failed to find source for row %ld sequence number %ld\n", i, seq);
     815            psFree(row);
     816            return false;
     817        }
     818        if (!source->modelFits) {
     819            // XXX: where to find the number of models to expect?
     820            source->modelFits = psArrayAllocEmpty(5);
     821        }
     822        psString modelName = psMetadataLookupStr(&status, row, "MODEL_TYPE");
     823        if (!modelName) {
     824            psError(PS_ERR_UNKNOWN, true, "Failed to find model name for row %ld\n", i);
     825            psFree(row);
     826            return false;
     827        }
     828        pmModelType modelType = pmModelClassGetType(modelName);
     829        if (modelType < 0) {
     830            psError(PS_ERR_UNKNOWN, true, "Failed to find model type for %s\n", modelName);
     831            psFree(row);
     832            return false;
     833        }
     834        pmModel *model = pmModelAlloc(modelType);
     835
     836        psF32 *PAR = model->params->data.F32;
     837        psF32 *dPAR = model->dparams->data.F32;
     838
     839        PAR[PM_PAR_XPOS] = psMetadataLookupF32(&status, row, "X_EXT");
     840        PAR[PM_PAR_YPOS] = psMetadataLookupF32(&status, row, "Y_EXT");
     841        dPAR[PM_PAR_XPOS] = psMetadataLookupF32(&status, row, "X_EXT_SIG");
     842        dPAR[PM_PAR_YPOS] = psMetadataLookupF32(&status, row, "Y_EXT_SIG");
     843
     844        model->mag = psMetadataLookupF32(&status, row, "EXT_INST_MAG");
     845        model->magErr = psMetadataLookupF32(&status, row, "EXT_INST_MAG_SIG");
     846
     847        psEllipseAxes axes;
     848        axes.major = psMetadataLookupF32(&status, row, "EXT_WIDTH_MAJ");
     849        axes.minor = psMetadataLookupF32(&status, row, "EXT_WIDTH_MIN");
     850        axes.theta = psMetadataLookupF32(&status, row, "EXT_THETA");
     851        if (!pmPSF_AxesToModel(PAR, axes, modelType)) {
     852            // Do we need to fail here or can this happen?
     853            psError(PS_ERR_UNKNOWN, false, "Failed to convert psf axes to model");
     854            psFree(model);
     855            psFree(row);
     856            return false;
     857        }
     858        // XXX: clean this up
     859        if (model->params->n > 7) {
     860            PAR[7] = psMetadataLookupF32(&status, row, "EXT_PAR_07");
     861        }
     862        // read the covariance matrix
     863        int nparams = model->params->n;
     864        psImage *covar = psImageAlloc(nparams, nparams, PS_TYPE_F32);
     865        for (int y = 0; y < nparams; y++) {
     866            for (int x = 0; x < nparams; x++) {
     867                char name[64];
     868                snprintf(name, 64, "EXT_COVAR_%02d_%02d", y, x);
     869                covar->data.F32[y][x] = psMetadataLookupF32(&status, row, name);
     870            }
     871        }
     872        model->covar = covar;
     873
     874        psArrayAdd(source->modelFits, 1, model);
     875        psFree(model);
     876
     877        psFree(row);
     878    }
     879
    686880    return true;
    687881}
     
    8311025    return true;
    8321026}
     1027
     1028bool pmSourcesRead_CMF_PS1_SV1_XRAD(psFits *fits, psMetadata *hduHeader, psArray *sources, long *sourceIndex)
     1029{
     1030    PS_ASSERT_PTR_NON_NULL(fits, false);
     1031    PS_ASSERT_PTR_NON_NULL(sources, false);
     1032
     1033    bool status;
     1034    long numSources = psFitsTableSize(fits); // Number of sources in table
     1035    if (numSources == 0) {
     1036        psError(psErrorCodeLast(), false, "XRAD Table contains no entries\n");
     1037        return false;
     1038    }
     1039
     1040    for (long i = 0; i < numSources; i++) {
     1041        psMetadata *row = psFitsReadTableRow(fits, i); // Table row
     1042        if (!row) {
     1043            psError(psErrorCodeLast(), false, "Unable to read row %ld of sources", i);
     1044            psFree(row);
     1045            return false;
     1046        }
     1047        // Find the source with this sequence number.
     1048        // XXX: I am assuming that sources is sorted in order of seq.
     1049        long seq = psMetadataLookupU32 (&status, row, "IPP_IDET");
     1050        long j = seq < sources->n ? seq : sources->n - 1;
     1051        pmSource *source = NULL;
     1052        for (; j >= 0; j--) {
     1053            source = sources->data[j];
     1054            if (source->seq == seq) {
     1055                break;
     1056            }
     1057        }
     1058        if (!source) {
     1059            psError(PS_ERR_UNKNOWN, false, "Failed to find source for row %ld sequence number %ld\n", i, seq);
     1060            psFree(row);
     1061            return false;
     1062        }
     1063        if (!source->radialAper) {
     1064            // XXX: where to find the number of models to expect?
     1065            source->radialAper = psArrayAllocEmpty(5);
     1066        }
     1067        pmSourceRadialApertures *radialAper = pmSourceRadialAperturesAlloc();
     1068
     1069        radialAper->flux = psMemIncrRefCounter(psMetadataLookupVector(&status, row, "APER_FLUX"));
     1070        radialAper->fluxStdev = psMemIncrRefCounter(psMetadataLookupVector(&status, row, "APER_FLUX_STDEV"));
     1071        radialAper->fluxErr = psMemIncrRefCounter(psMetadataLookupVector(&status, row, "APER_FLUX_ERR"));
     1072        radialAper->fill = psMemIncrRefCounter(psMetadataLookupVector(&status, row, "APER_FILL"));
     1073
     1074        psArrayAdd(source->radialAper, 1, radialAper);
     1075
     1076        psFree(radialAper);
     1077        psFree(row);
     1078    }
     1079
     1080    return true;
     1081}
Note: See TracChangeset for help on using the changeset viewer.