IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 5993


Ignore:
Timestamp:
Jan 15, 2006, 8:30:16 AM (20 years ago)
Author:
eugene
Message:

API cleanup, removed old test files, some re-organization, changed FLT/GAL to EXT

Location:
trunk/psphot
Files:
1 added
8 deleted
26 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot/Makefile

    r5980 r5993  
    2424$(SRC)/psphotArguments.$(ARCH).o    \
    2525$(SRC)/psphotSetup.$(ARCH).o        \
     26$(SRC)/psphotModelTest.$(ARCH).o    \
    2627$(SRC)/psphotImageStats.$(ARCH).o   \
     28$(SRC)/psphotImageBackground.$(ARCH).o \
     29$(SRC)/psphotFindPeaks.$(ARCH).o    \
    2730$(SRC)/psphotSourceStats.$(ARCH).o  \
     31$(SRC)/psphotRoughClass.$(ARCH).o   \
     32$(SRC)/psphotBasicDeblend.$(ARCH).o \
    2833$(SRC)/psphotChoosePSF.$(ARCH).o    \
     34$(SRC)/psphotEnsemblePSF.$(ARCH).o  \
     35$(SRC)/psphotFullFit.$(ARCH).o      \
     36$(SRC)/psphotBlendFit.$(ARCH).o     \
    2937$(SRC)/psphotApplyPSF.$(ARCH).o     \
    30 $(SRC)/psphotFixedPSF.$(ARCH).o     \
    31 $(SRC)/psphotEnsemblePSF.$(ARCH).o  \
    32 $(SRC)/psphotReapplyPSF.$(ARCH).o   \
    3338$(SRC)/psphotFitGalaxies.$(ARCH).o  \
    34 $(SRC)/psphotOutput.$(ARCH).o       \
    35 $(SRC)/psphotMarkPSF.$(ARCH).o      \
     39$(SRC)/psphotReplaceUnfit.$(ARCH).o \
     40$(SRC)/psphotApResid.$(ARCH).o      \
     41$(SRC)/psphotOutput.$(ARCH).o       
     42
     43SUPPORT = \
     44$(SRC)/psphotModelGroupInit.$(ARCH).o  \
     45$(SRC)/psphotGrowthCurve.$(ARCH).o  \
     46$(SRC)/psphotEvalPSF.$(ARCH).o      \
     47$(SRC)/psphotEvalFLT.$(ARCH).o      \
     48$(SRC)/psphotSourceFits.$(ARCH).o   \
    3649$(SRC)/psphotSortBySN.$(ARCH).o     \
    3750$(SRC)/psphotDefinePixels.$(ARCH).o \
    3851$(SRC)/psphotMagnitudes.$(ARCH).o   \
    39 $(SRC)/psphotRadiusChecks.$(ARCH).o \
    40 $(SRC)/psphotReplaceUnfit.$(ARCH).o \
    41 $(SRC)/psphotEvalPSF.$(ARCH).o      \
    42 $(SRC)/psphotEvalFLT.$(ARCH).o      \
    43 $(SRC)/psphotFullFit.$(ARCH).o      \
     52$(SRC)/psphotRadiusChecks.$(ARCH).o
     53
     54PSMODULES = \
     55$(SRC)/psLine.$(ARCH).o             \
     56$(SRC)/psSparse.$(ARCH).o           \
     57$(SRC)/psPolynomialUtils.$(ARCH).o  \
     58$(SRC)/psImageData.$(ARCH).o        \
     59$(SRC)/psModulesUtils.$(ARCH).o     \
    4460$(SRC)/pmSourceContour.$(ARCH).o    \
    45 $(SRC)/psLine.$(ARCH).o             \
    46 $(SRC)/psModulesUtils.$(ARCH).o     \
    47 $(SRC)/pmPeaksSigmaLimit.$(ARCH).o  \
    48 $(SRC)/pmSourceFitFixed.$(ARCH).o   \
    49 $(SRC)/psSparse.$(ARCH).o           \
    50 $(SRC)/psImageData.$(ARCH).o        \
    51 $(SRC)/psphotModelTest.$(ARCH).o    \
    52 $(SRC)/psphotImageBackground.$(ARCH).o \
    53 $(SRC)/psphotBasicDeblend.$(ARCH).o    \
    54 $(SRC)/psphotModelGroupInit.$(ARCH).o  \
    55 $(SRC)/pmModelFitSet.$(ARCH).o  \
    56 $(SRC)/pmSourceFitSet.$(ARCH).o        \
    57 $(SRC)/psphotSourceFits.$(ARCH).o        \
    58 $(SRC)/psphotBlendFit.$(ARCH).o        \
    59 $(SRC)/psphotApResid.$(ARCH).o \
    60 $(SRC)/psphotAssessPSF.$(ARCH).o \
    61 $(SRC)/psBicube.$(ARCH).o
    62 
    63 MODELS = \
    64 $(SRC)/models/pmModel_GAUSS.c      \
    65 $(SRC)/models/pmModel_PGAUSS.c     \
    66 $(SRC)/models/pmModel_QGAUSS.c     \
    67 $(SRC)/models/pmModel_SGAUSS.c     \
    68 $(SRC)/models/pmModel_TGAUSS.c     
    69 
    70 $(SRC)/pmModelGroup.$(ARCH).o: $(MODELS)
    71 
    72 MODELTEST = \
    73 $(SRC)/modelTestFitSource.$(ARCH).o \
    74 $(SRC)/modelTestArguments.$(ARCH).o \
    75 $(SRC)/psphotModelGroupInit.$(ARCH).o  \
    76 $(SRC)/psModulesUtils.$(ARCH).o     \
    77 $(SRC)/psImageData.$(ARCH).o        \
    78 $(SRC)/psphotSetup.$(ARCH).o        \
    79 $(SRC)/psphotDefinePixels.$(ARCH).o \
    80 $(SRC)/psphotModelTest.$(ARCH).o
     61$(SRC)/pmModelFitSet.$(ARCH).o      \
     62$(SRC)/pmSourceFitSet.$(ARCH).o     
    8163
    8264TEST = \
    83 $(SRC)/psphotTest.$(ARCH).o \
    84 $(SRC)/psphotTestArguments.$(ARCH).o \
    85 $(SRC)/psphotApResid.$(ARCH).o
     65$(SRC)/psphotTest.$(ARCH).o     \
     66$(SRC)/psBicube.$(ARCH).o          \
     67$(SRC)/psphotTestArguments.$(ARCH).o
    8668
    8769psphot: $(BIN)/psphot.$(ARCH)
    88 $(BIN)/psphot.$(ARCH) : $(PSPHOT)
     70$(BIN)/psphot.$(ARCH) : $(PSPHOT) $(PSMODULES) $(SUPPORT)
    8971$(PSPHOT) : $(SRC)/psphot.h
    9072
    91 modeltest.install: psphotModelTest.install
    92 modeltest: $(BIN)/psphotModelTest.$(ARCH)
    93 $(BIN)/psphotModelTest.$(ARCH) : $(MODELTEST)
    94 $(MODELTEST): $(SRC)/psphot.h
     73test.install: psphotTest.install
     74test: $(BIN)/psphotTest.$(ARCH)
     75$(DESTBIN)/test : $(DESTBIN)/psphotTest
    9576
    96 test-install: psphotTest.install
    97 test: $(BIN)/psphotTest.$(ARCH)
    9877$(BIN)/psphotTest.$(ARCH) : $(TEST)
    9978$(TEST): $(SRC)/psphot.h
  • trunk/psphot/src/pmSourceFitSet.c

    r5828 r5993  
    9191    }
    9292
    93     // PSF model only fits first 4 parameters, FLT model fits all
     93    // PSF model only fits first 4 parameters, EXT model fits all
    9494    int nParams = PSF ? nSrc*3 + 1 : nSrc*nPar + 1;
    9595
  • trunk/psphot/src/psModulesUtils.c

    r5828 r5993  
    123123    return (new);
    124124}
     125
     126float pmSourceCrossProduct (pmSource *Mi, pmSource *Mj) {
     127
     128    int Xs, Xe, Ys, Ye;
     129    int xi, xj, yi, yj;
     130    int xIs, xJs, yIs, yJs;
     131    int xIe, yIe;
     132    float flux;
     133
     134    psImage *Pi = Mi->pixels;
     135    psImage *Pj = Mj->pixels;
     136
     137    psImage *Ti = Mi->mask;
     138    psImage *Tj = Mj->mask;
     139
     140    Xs = PS_MAX (Pi->col0, Pj->col0);
     141    Xe = PS_MIN (Pi->col0 + Pi->numCols, Pj->col0 + Pj->numCols);
     142   
     143    Ys = PS_MAX (Pi->row0, Pj->row0);
     144    Ye = PS_MIN (Pi->row0 + Pi->numRows, Pj->row0 + Pj->numRows);
     145   
     146    xIs = Xs - Pi->col0;
     147    xJs = Xs - Pj->col0;
     148    yIs = Ys - Pi->row0;
     149    yJs = Ys - Pj->row0;
     150
     151    xIe = Xe - Pi->col0;
     152    yIe = Ye - Pi->row0;
     153
     154    flux = 0;
     155    for (yi = yIs, yj = yJs; yi < yIe; yi++, yj++) {
     156        for (xi = xIs, xj = xJs; xi < xIe; xi++, xj++) {
     157            if (Ti->data.U8[yi][xi]) continue;
     158            if (Tj->data.U8[yj][xj]) continue;
     159            flux += Pi->data.F32[yi][xi] * Pj->data.F32[yj][xj];
     160        }
     161    }
     162    return (flux);
     163}
  • trunk/psphot/src/psphot.c

    r5986 r5993  
    6767
    6868      case 3:
    69         // fit extended objects with galaxy models
    7069        psphotApplyPSF (imdata, config, sources, psf, sky);
    7170        break;
    7271
    7372      case 4:
    74         // fit extended objects with galaxy models
    7573        psphotApplyPSF (imdata, config, sources, psf, sky);
    76         psphotFitGalaxies (imdata, config, sources, sky);
     74        psphotFitExtended (imdata, config, sources, sky);
    7775        break;
    7876    }
  • trunk/psphot/src/psphot.h

    r5986 r5993  
    2424psMetadata     *psphotArguments (int *argc, char **argv);
    2525eamReadout     *psphotSetup (psMetadata *config);
     26bool            psphotModelTest (eamReadout *imdata, psMetadata *config);
    2627psStats        *psphotImageStats (eamReadout *imdata, psMetadata *config);
     28psPolynomial2D *psphotImageBackground (eamReadout *imdata, psMetadata *config, psStats *sky);
    2729psArray        *psphotFindPeaks (eamReadout *imdata, psMetadata *config, psStats *sky);
    2830psArray        *psphotSourceStats (eamReadout *imdata, psMetadata *config, psArray *allpeaks);
    2931bool            psphotRoughClass (psArray *sources, psMetadata *config);
     32bool            psphotBasicDeblend (psArray *sources, psMetadata *config, psStats *sky);
    3033pmPSF          *psphotChoosePSF (psMetadata *config, psArray *sources, psStats *sky);
    31 bool            psphotApplyPSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
    32 bool            psphotFixedPSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
    33 bool            psphotFitGalaxies (eamReadout *imdata, psMetadata *config, psArray *sources, psStats *skyStats);
    3434void            psphotOutput (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
    3535
    36 bool            psphotMarkPSF (pmSource *source, float shapeNsigma, float minSN, float maxChi, float SATURATE);
    37 bool            psphotSubtractPSF (pmSource *source);
     36// optional object analysis steps
     37bool            psphotEnsemblePSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
     38bool            psphotFullFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
     39bool            psphotBlendFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
     40bool            psphotReplaceUnfit (psArray *sources);
     41bool            psphotApplyPSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
     42bool            psphotFitExtended (eamReadout *imdata, psMetadata *config, psArray *sources, psStats *skyStats);
     43bool            psphotApResid (eamReadout *imdata, psArray *sources, psMetadata *config, pmPSF *psf);
     44
     45// basic support functions
     46pmModel        *pmModelCopy (pmModel *model);
     47pmModel        *pmSourceMagnitudes (pmSource *source, pmPSF *psf, float apRadius);
     48float           pmSourceCrossProduct (pmSource *Mi, pmSource *Mj);
     49psArray        *pmSourceContour_EAM (psImage *image, int x, int y, float threshold);
     50void            psphotModelGroupInit (void);
    3851int             psphotSortBySN (const void **a, const void **b);
    3952int             psphotSortByY (const void **a, const void **b);
    40 int             psphotSaveImage (psMetadata *header, psImage *image, char *filename);
     53bool            psphotGrowthCurve (eamReadout *imdata, pmPSF *psf);
     54void            psphotTestArguments (int *argc, char **argv);
     55
     56// functions to set the correct source pixels
     57bool            psphotInitRadiusPSF (psMetadata *config, psStats *sky, pmModelType type);
     58bool            psphotCheckRadiusPSF (eamReadout *imdata, pmSource *source, pmModel *model);
     59bool            psphotInitRadiusEXT (psMetadata *config, psStats *sky, pmModelType type);
     60bool            psphotCheckRadiusEXT (eamReadout *imdata, pmSource *source, pmModel *model);
    4161bool            psphotDefinePixels (pmSource *mySource, const eamReadout *imdata, psF32 x, psF32 y, psF32 Radius);
    4262bool            psphotRedefinePixels (pmSource *mySource, const eamReadout *imdata, psF32 x, psF32 y, psF32 Radius);
    43 void            psphotModelGroupInit (void);
    44 
    45 bool            pmSourceFitFixed (pmSource *source, pmModel *model);
    46 pmModel        *pmSourceMagnitudes (pmSource *source, pmPSF *psf, float apRadius);
    47 pmModel        *pmSourceSelectModel (pmSource *source);
    48 
    49 // eamReadout functions
    50 eamReadout     *eamReadoutAlloc (psImage *image, psImage *noise, psImage *mask, psMetadata *header);
    5163
    5264// output functions
     
    5769bool            pmSourcesWriteSX   (eamReadout *imdata, psMetadata *config, char *filename, psArray *sources, pmPSF *psf, psStats *sky);
    5870
     71bool            pmModelWritePSFs (psArray *sources, psMetadata *config, char *filename, pmPSF *psf);
     72bool            pmModelWriteEXTs (psArray *sources, char *filename);
     73bool            pmModelWriteNULLs (psArray *sources, char *filename);
    5974bool            pmPeaksWriteText (psArray *sources, char *filename);
    6075bool            pmMomentsWriteText (psArray *sources, char *filename);
    61 bool            pmModelWritePSFs (psArray *sources, psMetadata *config, char *filename, pmPSF *psf);
    62 bool            pmModelWriteFLTs (psArray *sources, char *filename);
    63 bool            pmModelWriteNULLs (psArray *sources, char *filename);
    6476
     77bool            psphotSamplePSFs (psMetadata *config, pmPSF *psf, psImage *image);
     78bool            psphotDumpMoments (psMetadata *config, psArray *sources);
     79int             psphotSaveImage (psMetadata *header, psImage *image, char *filename);
     80bool            psphotUpdateHeader (psMetadata *header, psMetadata *config);
    6581int             pmSourcesDophotType (pmSource *source);
     82bool            psMetadataItemTransfer (psMetadata *out, psMetadata *in, char *key);
    6683
    67 // psphotModelTest functions
    68 bool            psphotEnsemblePSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
    69 float           psphotCrossProduct (pmSource *Mi, pmSource *Mj);
    70 psPolynomial2D *psphotImageBackground (eamReadout *imdata, psMetadata *config, psStats *sky);
    71 bool            psphotReapplyPSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
     84// PSF / DBL / EXT evaluation functions
     85bool            psphotEvalPSF (pmSource *source, pmModel *model);
     86bool            psphotEvalDBL (pmSource *source, pmModel *model);
     87bool            psphotEvalEXT (pmSource *source, pmModel *model);
    7288
    73 pmModel        *pmModelCopy (pmModel *model);
    74 psArray        *pmSourceContour_EAM (psImage *image, int x, int y, float threshold);
    75 bool            psphotBasicDeblend (psArray *sources, psMetadata *config, psStats *sky);
     89// functions to support simultaneous multi-source fitting
     90bool            psphotFitSet (pmSource *oneSrc, pmModel *oneModel, char *fitset, bool PSF);
     91bool            pmSourceFitSet (pmSource *source, psArray *modelSet, const bool PSF);
     92psF32           pmModelFitSet (psVector *deriv, const psVector *params, const psVector *x);
     93bool            pmModelFitSetInit (pmModelType type);
    7694
    77 bool psphotFullFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
    78 bool psphotInitLimitsPSF (psMetadata *config);
    79 bool psphotEvalPSF (pmSource *source, pmModel *model);
    80 bool psphotEvalDBL (pmSource *source, pmModel *model);
    81 bool psphotEvalFLT (pmSource *source, pmModel *model);
    82 bool psphotInitRadiusPSF (psMetadata *config, psStats *sky, pmModelType type);
    83 bool psphotCheckRadiusPSF (eamReadout *imdata, pmSource *source, pmModel *model);
    84 bool psphotInitRadiusFLT (psMetadata *config, psStats *sky, pmModelType type);
    85 bool psphotCheckRadiusFLT (eamReadout *imdata, pmSource *source, pmModel *model);
    86 bool psphotSamplePSFs (psMetadata *config, pmPSF *psf, psImage *image);
    87 bool psphotReplaceUnfit (psArray *sources);
    88 bool psphotDumpMoments (psMetadata *config, psArray *sources);
    89 bool psphotApResid (eamReadout *imdata, psArray *sources, psMetadata *config, pmPSF *psf);
    90 bool psphotAssessPSF (eamReadout *imdata, psMetadata *config, pmPSF *psf);
     95//  functions to support the source fitting process
     96bool            psphotInitLimitsPSF (psMetadata *config);
     97bool            psphotInitLimitsEXT (psMetadata *config, psStats *sky);
     98bool            psphotFitBlend (eamReadout *imdata, pmSource *source);
     99bool            psphotFitBlob (eamReadout *imdata, pmSource *source, psArray *sources);
     100bool            psphotFitPSF (eamReadout *imdata, pmSource *source);
     101pmModel        *psphotFitEXT (eamReadout *imdata, pmSource *source);
     102psArray        *psphotFitDBL (eamReadout *imdata, pmSource *source);
    91103
    92 bool psphotWritePSF (pmPSF *psf, char *filename);
    93 pmPSF *psphotReadPSF (char *filename);
     104// eamReadout functions
     105eamReadout     *eamReadoutAlloc (psImage *image, psImage *noise, psImage *mask, psMetadata *header);
    94106
    95 bool psPolynomial2DtoMD (psMetadata *md, psPolynomial2D *poly, char *format, ...);
    96 bool psPolynomial3DtoMD (psMetadata *md, psPolynomial3D *poly, char *format, ...);
    97 bool psPolynomial4DtoMD (psMetadata *md, psPolynomial4D *poly, char *format, ...);
    98 psPolynomial2D *psPolynomial2DfromMD (psMetadata *folder);
    99 psPolynomial3D *psPolynomial3DfromMD (psMetadata *folder);
    100 psPolynomial4D *psPolynomial4DfromMD (psMetadata *folder);
    101 bool psphotModelTest (eamReadout *imdata, psMetadata *config);
     107// bicubic interpolation
     108psPolynomial2D *psImageBicubeFit (psImage *image, int x, int y);
     109psPlane         psImageBicubeMin (psPolynomial2D *poly);
    102110
    103 bool psphotFitSet (pmSource *oneSrc, pmModel *oneModel, char *fitset, bool PSF);
    104 bool pmSourceFitSet (pmSource *source, psArray *modelSet, const bool PSF);
    105 psF32 pmModelFitSet (psVector *deriv, const psVector *params, const psVector *x);
    106 bool pmModelFitSetInit (pmModelType type);
    107 
    108 bool psphotBlendFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);
    109 
    110 bool psphotInitLimitsFLT (psMetadata *config, psStats *sky);
    111 
    112 bool psphotFitPSF (eamReadout *imdata, pmSource *source);
    113 bool psphotFitBlend (eamReadout *imdata, pmSource *source);
    114 bool psphotFitBlob (eamReadout *imdata, pmSource *source, psArray *sources);
    115 
    116 pmModel *psphotFitFLT (eamReadout *imdata, pmSource *source);
    117 psArray *psphotFitDBL (eamReadout *imdata, pmSource *source);
    118 
    119 psPolynomial2D *psImageBicubeFit (psImage *image, int x, int y);
    120 psPlane psImageBicubeMin (psPolynomial2D *poly);
    121 void psphotTestArguments (int *argc, char **argv);
    122 
    123 bool psphotGrowthCurve (eamReadout *imdata, pmPSF *psf);
    124 
     111// optional mode for clip fit?
    125112psPolynomial4D *psVectorChiClipFitPolynomial4D(
    126113    psPolynomial4D *poly,
     
    134121    const psVector *z,
    135122    const psVector *t);
    136 
    137 // XXX deprecated
    138 // bool psphotApResidFullFit (psVector *x, psVector *y, psVector *radius, psVector *rflux, psVector *apresid, psVector *dmag);
    139 // bool psphotApResidPolyFit (psVector *x, psVector *y, psVector *radius, psVector *rflux, psVector *apresid, psVector *dmag);
  • trunk/psphot/src/psphotApResid.c

    r5980 r5993  
    11# include "psphot.h"
    2 
    3 psPolynomial4D *psVectorChiClipFitPolynomial4D(
    4     psPolynomial4D *poly,
    5     psStats *stats,
    6     const psVector *mask,
    7     psMaskType maskValue,
    8     const psVector *f,
    9     const psVector *fErr,
    10     const psVector *x,
    11     const psVector *y,
    12     const psVector *z,
    13     const psVector *t)
    14 {
    15     PS_ASSERT_POLY_NON_NULL(poly, NULL);
    16     PS_ASSERT_POLY_TYPE(poly, PS_POLYNOMIAL_ORD, NULL);
    17     PS_ASSERT_PTR_NON_NULL(stats, NULL);
    18     PS_ASSERT_VECTOR_NON_NULL(f, NULL);
    19     PS_ASSERT_VECTOR_TYPE_F32_OR_F64(f, NULL);
    20     if (mask != NULL) {
    21         PS_ASSERT_VECTORS_SIZE_EQUAL(f, mask, NULL);
    22         PS_ASSERT_VECTOR_TYPE(mask, PS_TYPE_U8, NULL);
    23     }
    24     PS_ASSERT_VECTOR_NON_NULL(x, NULL);
    25     PS_ASSERT_VECTORS_SIZE_EQUAL(f, x, NULL);
    26     PS_ASSERT_VECTOR_TYPE_F32_OR_F64(x, NULL);
    27     PS_ASSERT_VECTOR_NON_NULL(y, NULL);
    28     PS_ASSERT_VECTORS_SIZE_EQUAL(f, y, NULL);
    29     PS_ASSERT_VECTOR_TYPE_F32_OR_F64(y, NULL);
    30     PS_ASSERT_VECTOR_NON_NULL(z, NULL);
    31     PS_ASSERT_VECTORS_SIZE_EQUAL(f, z, NULL);
    32     PS_ASSERT_VECTOR_TYPE_F32_OR_F64(z, NULL);
    33     PS_ASSERT_VECTOR_NON_NULL(t, NULL);
    34     PS_ASSERT_VECTORS_SIZE_EQUAL(f, t, NULL);
    35     PS_ASSERT_VECTOR_TYPE_F32_OR_F64(t, NULL);
    36     PS_ASSERT_VECTOR_NON_NULL(fErr, NULL);
    37     PS_ASSERT_VECTORS_SIZE_EQUAL(fErr, mask, NULL);
    38     PS_ASSERT_VECTOR_TYPE_F32_OR_F64(fErr, NULL);
    39 
    40     // clipping range defined by min and max and/or clipSigma
    41     float minClipSigma;
    42     float maxClipSigma;
    43     if (isfinite(stats->max)) {
    44         maxClipSigma = +fabs(stats->max);
    45     } else {
    46         maxClipSigma = +fabs(stats->clipSigma);
    47     }
    48     if (isfinite(stats->min)) {
    49         minClipSigma = -fabs(stats->min);
    50     } else {
    51         minClipSigma = -fabs(stats->clipSigma);
    52     }
    53     psVector *fit   = NULL;
    54     psVector *resid = psVectorAlloc (x->n, PS_TYPE_F64);
    55 
    56     // eventual expansion: user supplies one of various stats option pairs,
    57     // eg (SAMPLE_MEAN | SAMPLE_STDEV) and the correct pair is used to
    58     // evaluate the clipping sigma
    59     // for now, for the SAMPLE_MEDIAN and SAMPLE_STDEV to be used
    60     stats->options |= (PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_STDEV);
    61 
    62     for (int N = 0; N < stats->clipIter; N++) {
    63         int Nkeep = 0;
    64 
    65         poly = psVectorFitPolynomial4D (poly, mask, maskValue, f, fErr, x, y, z, t);
    66         fit = psPolynomial4DEvalVector (poly, x, y, z, t);
    67         resid = (psVector *) psBinaryOp (resid, (void *) f, "-", (void *) fit);
    68 
    69         stats  = psVectorStats (stats, resid, NULL, mask, maskValue);
    70         psTrace (".psphot.VectorClipFit", 5, "resid stats: %f +/- %f\n", stats->sampleMedian, stats->sampleStdev);
    71 
    72         // set mask if pts are not valid
    73         // we are masking out any point which is out of range
    74         // recovery is not allowed with this scheme
    75         for (int i = 0; i < resid->n; i++) {
    76             if ((mask != NULL) && (mask->data.U8[i] & maskValue)) {
    77                 continue;
    78             }
    79             float sigma = hypot (psVectorGet (fErr, i), stats->sampleStdev);
    80             if (resid->data.F64[i] - stats->sampleMedian > sigma*maxClipSigma) {
    81                 if (mask != NULL) {
    82                     mask->data.U8[i] |= 0x01;
    83                 }
    84                 continue;
    85             }
    86             if (resid->data.F64[i] - stats->sampleMedian < sigma*minClipSigma) {
    87                 if (mask != NULL) {
    88                     mask->data.U8[i] |= 0x01;
    89                 }
    90                 continue;
    91             }
    92             Nkeep ++;
    93         }
    94 
    95         psTrace (".psphot.VectorClipFit", 4, "keeping %d of %d pts for fit\n",
    96                  Nkeep, x->n);
    97 
    98         stats->clippedNvalues = Nkeep;
    99         psFree (fit);
    100     }
    101     // Free local temporary variables
    102     psFree (resid);
    103 
    104     if (poly == NULL) {
    105         psError(PS_ERR_UNKNOWN, true, "Could not fit a polynomial to the data.  Returning NULL.\n");
    106         return(NULL);
    107     }
    108     return(poly);
    109 }
    1102
    1113// measure the aperture residual statistics
     
    347239    psf->nApResid = residStats->clippedNvalues;
    348240
    349     /*
    350       (aprMag' - fitMag) = rflux*skyBias + ApTrend(x,y)
    351       (aprMag - rflux*skyBias) - fitMag = ApTrend(x,y)
    352       (aprMag - rflux*skyBias) = fitMag + ApTrend(x,y)
    353     */
     241    // save results for later output
     242    psMetadataAdd (config, PS_LIST_TAIL, "SKYBIAS",  PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias",   psf->skyBias);
     243    psMetadataAdd (config, PS_LIST_TAIL, "SKYSAT",   PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias",   psf->skySat);
     244    psMetadataAdd (config, PS_LIST_TAIL, "APMIFIT",  PS_DATA_F32 | PS_META_REPLACE, "aperture residual",   psf->ApResid);
     245    psMetadataAdd (config, PS_LIST_TAIL, "DAPMIFIT", PS_DATA_F32 | PS_META_REPLACE, "ap residual scatter", psf->dApResid);
     246    psMetadataAdd (config, PS_LIST_TAIL, "APLOSS",   PS_DATA_F32 | PS_META_REPLACE, "ap residual scatter", psf->growth->apLoss);
     247    psMetadataAdd (config, PS_LIST_TAIL, "NAPMIFIT", PS_DATA_S32 | PS_META_REPLACE, "ap residual scatter", psf->nApResid);
    354248
    355249    psLogMsg ("psphot.apresid", 3, "measure full-frame aperture residual: %f sec\n", psTimerMark ("psphot"));
     
    370264}
    371265
     266/*
     267  (aprMag' - fitMag) = rflux*skyBias + ApTrend(x,y)
     268  (aprMag - rflux*skyBias) - fitMag = ApTrend(x,y)
     269  (aprMag - rflux*skyBias) = fitMag + ApTrend(x,y)
     270*/
     271
  • trunk/psphot/src/psphotApplyPSF.c

    r5828 r5993  
    2525
    2626        // use the source moments, etc to guess basic model parameters
    27         pmModel *modelFLT = pmSourceModelGuess (source, psf->type);
     27        pmModel *modelEXT = pmSourceModelGuess (source, psf->type);
    2828
    2929        // set PSF parameters for this model
    30         pmModel *model = pmModelFromPSF (modelFLT, psf);
    31         psFree (modelFLT);
     30        pmModel *model = pmModelFromPSF (modelEXT, psf);
     31        psFree (modelEXT);
    3232
    3333        source->modelPSF = model;
  • trunk/psphot/src/psphotArguments.c

    r5986 r5993  
    123123    psMetadataAdd (config, PS_LIST_TAIL, "PSF_MODEL", PS_DATA_METADATA_MULTI, "folder for psf model entries", NULL);
    124124
    125     config = psMetadataConfigParse (config, &Nfail, argv[3], FALSE);
     125    // config file values override defaults set here
     126    config = psMetadataConfigParse (config, &Nfail, argv[3], TRUE);
    126127
    127128    psMetadataItem *item = NULL;
     
    129130    while ((item = psMetadataGetAndIncrement (iter)) != NULL) {
    130131        psMetadataAddItem (config, item, PS_LIST_TAIL, PS_META_REPLACE);
    131         // psFree (item);
     132        psFree (item);
    132133    }
    133     // psFree (iter);
     134    psFree (iter);
    134135
    135136    // identify input image & optional weight & mask images
  • trunk/psphot/src/psphotBasicDeblend.c

    r5986 r5993  
    3636    psArray *overlap = psArrayAlloc (100);
    3737
    38     // XXX make sure this results in decreasing, not increasing, SN
     38    // examine sources in decreasing SN order
    3939    for (int i = sources->n - 1; i >= 0; i--) {
    4040        N = index->data.U32[i];
     
    7373        // generate source contour (1/4 peak counts)
    7474        if (overlap->n > 0) {
    75             // XXX EAM : make the 1/4 user-defined.
    76             // XXX keep threshold from dropping too low (N*sky.sigma)
     75            // set the threshold based on user inputs
    7776            threshold = FRACTION * (source->peak->counts - source->moments->Sky) + source->moments->Sky;
    7877            threshold = PS_MAX (threshold, minThreshold);
    7978
    80             // XXX EAM : should the contour input coordinate be in parent or subimage coords? parent, for now
     79            // generate a basic contour (set of x,y coordinates at-or-below flux level)
    8180            psArray *contour = pmSourceContour_EAM (source->pixels, source->peak->x, source->peak->y, threshold);
    8281            if (contour == NULL) continue;
     
    9796                    if (xv->data.F32[j+1] < testSource->peak->x) break;
    9897
    99                     # if (0)
    100                     int xp0 = source->moments->x - source->pixels->col0;
    101                     int xp1 = source->peak->x - source->pixels->col0;
    102                     int xp2 = testSource->moments->x - source->pixels->col0;
    103                     int xp3 = testSource->peak->x - source->pixels->col0;
    104 
    105                     int yp0 = source->moments->y - source->pixels->row0;
    106                     int yp1 = source->peak->y - source->pixels->row0;
    107                     int yp2 = testSource->moments->y - testSource->pixels->row0;
    108                     int yp3 = testSource->peak->y - testSource->pixels->row0;
    109                    
    110                     fprintf (f, "%d %d (%f, %f) :  %d %d (%f, %f)  vs %f\n",
    111                              source->peak->x, source->peak->y,
    112                              source->pixels->data.F32[yp0][xp0], source->pixels->data.F32[yp1][xp1],
    113                              testSource->peak->x, testSource->peak->y,
    114                              testSource->pixels->data.F32[yp2][xp2], testSource->pixels->data.F32[yp3][xp3], threshold
    115                        );
    116                     # endif
    117                    
    11898                    testSource->mode |= PM_SOURCE_BLEND;
    11999
  • trunk/psphot/src/psphotBlendFit.c

    r5828 r5993  
    11# include "psphot.h"
    22
    3 bool psphotBlendFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky)
    4 {
     3// XXX I don't like this name
     4bool psphotBlendFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky) {
    55
    66    psTimerStart ("psphot");
     
    1010   
    1111    psphotInitLimitsPSF (config);
    12     psphotInitLimitsFLT (config, sky);
     12    psphotInitLimitsEXT (config, sky);
    1313    psphotInitRadiusPSF (config, sky, psf->type);
    1414
  • trunk/psphot/src/psphotChoosePSF.c

    r5986 r5993  
    22
    33// try PSF models and select best option
     4pmPSF *psphotChoosePSF (psMetadata *config, psArray *sources, psStats *skystats) {
    45
    5 pmPSF *psphotChoosePSF (psMetadata *config, psArray *sources, psStats *skystats)
    6 {
    76    bool            status;
    87    char           *modelName;
     
    5554    }
    5655    psFree (iter);
    57     // psFree (list); XXX EAM - is list freed with iter?
     56    // psFree (list); XXX is list freed with iter?
    5857    psFree (stars);
    5958
     
    7877    for (int i = 0; i < try->sources->n; i++) {
    7978        pmSource *source = try->sources->data[i];
    80         if (try->mask->data.U8[i] & PSFTRY_MASK_FLT_FAIL) {
     79        if (try->mask->data.U8[i] & PSFTRY_MASK_EXT_FAIL) {
    8180            source->mode &= ~PM_SOURCE_PSFSTAR;
    8281        }
     
    8685    pmPSF *psf = psMemCopy(try->psf);
    8786    psFree (models);
     87
     88    psMetadataAdd (config, PS_LIST_TAIL, "NPSFSTAR", PS_DATA_S32 | PS_META_REPLACE, "number of stars used to make PSF", psf->nPSFstars);
    8889
    8990    modelName = pmModelGetType (psf->type);
  • trunk/psphot/src/psphotDefinePixels.c

    r5980 r5993  
    4949    if (extend) {
    5050        // Grab a new subimage
    51         // psFree (mySource->pixels);
    52         // psFree (mySource->weight);
    53         // psFree (mySource->mask);
     51        psFree (mySource->pixels);
     52        psFree (mySource->weight);
     53        psFree (mySource->mask);
    5454
    55         // fprintf (stderr, "extend %f,%f\n", x, y);
    5655        mySource->pixels = psImageSubset(imdata->image,  newRegion);
    5756        mySource->weight = psImageSubset(imdata->weight, newRegion);
     
    6261    return extend;
    6362}
    64 
    65 
    66 //**** this function was ALWAYS restricting to model->radius
    67 //     should have left it larger (PSF_FIT_RAD) for the faint sources
  • trunk/psphot/src/psphotEnsemblePSF.c

    r5980 r5993  
    11# include "psphot.h"
    2 
    3 psPolynomial2D *psImageBicubeFit (psImage *image, int x, int y) {
    4 
    5     int ix = x - image->col0;
    6     int iy = y - image->row0;
    7 
    8     psF32 *Fm = &image->data.F32[iy - 1][ix];
    9     psF32 *Fo = &image->data.F32[iy + 0][ix];
    10     psF32 *Fp = &image->data.F32[iy + 1][ix];
    11 
    12     double Fxm = Fm[-1] + Fo[-1] + Fp[-1];
    13     double Fxp = Fm[+1] + Fo[+1] + Fp[+1];
    14     double Fym = Fm[-1] + Fm[+0] + Fm[+1];
    15     double Fyp = Fp[-1] + Fp[+0] + Fp[+1];
    16     double Foo = Fym + Fyp + Fo[-1] + Fo[+0] + Fo[+1];
    17 
    18     psPolynomial2D *poly = psPolynomial2DAlloc (2, 2, PS_POLYNOMIAL_ORD);
    19     poly->mask[2][2] = 1;
    20     poly->mask[1][2] = 1;
    21     poly->mask[2][1] = 1;
    22 
    23     poly->coeff[0][0] = Foo*(5.0/9.0) - (Fxp + Fxm)/3.0 - (Fyp + Fym)/3.0 ;
    24 
    25     poly->coeff[1][0] = (Fxp - Fxm)/6.0;
    26     poly->coeff[0][1] = (Fyp - Fym)/6.0;
    27    
    28     poly->coeff[2][0] = (Fxp + Fxm)/2.0 - Foo/3.0;
    29     poly->coeff[0][2] = (Fyp + Fym)/2.0 - Foo/3.0;
    30    
    31     poly->coeff[1][1] = (Fp[+1] + Fm[-1] - Fm[+1] - Fp[-1])/4.0;
    32    
    33     return (poly);
    34 }
    35 
    36 psPlane psImageBicubeMin (psPolynomial2D *poly) {
    37 
    38     psPlane min;
    39 
    40     min.xErr = min.yErr = 0;
    41 
    42     double det = 4*poly->coeff[2][0]*poly->coeff[0][2] - PS_SQR(poly->coeff[1][1]);
    43 
    44     min.x = (poly->coeff[1][1]*poly->coeff[0][1] - 2*poly->coeff[0][2]*poly->coeff[1][0]) / det;
    45     min.y = (poly->coeff[1][1]*poly->coeff[1][0] - 2*poly->coeff[2][0]*poly->coeff[0][1]) / det;
    46     return (min);
    47 }
    482
    493bool psphotEnsemblePSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky) {
     
    10761        }
    10862
    109         // XXX EAM : add option to use FLT or PSF form
     63        // XXX EAM : add option to use EXT or PSF form
    11064        // use the source moments, etc to guess basic model parameters
    111         pmModel *modelFLT = pmSourceModelGuess (inSource, psf->type);
     65        pmModel *modelEXT = pmSourceModelGuess (inSource, psf->type);
    11266        if (inSource->mode &  PM_SOURCE_SATSTAR) {
    113             modelFLT->params->data.F32[2] = inSource->moments->x;
    114             modelFLT->params->data.F32[3] = inSource->moments->y;
     67            modelEXT->params->data.F32[2] = inSource->moments->x;
     68            modelEXT->params->data.F32[3] = inSource->moments->y;
    11569        } else {
    11670            // peak-up on peak (for non-sat objects)
     
    12377
    12478            psTrace ("psphotEnsemblePSF", 5, "peak coord: %f %f -> %f %f\n",
    125                      modelFLT->params->data.F32[2], modelFLT->params->data.F32[3], min.x + ix, min.y + iy);
     79                     modelEXT->params->data.F32[2], modelEXT->params->data.F32[3], min.x + ix, min.y + iy);
    12680           
    12781            // if min point is too deviant, keep the old value
    12882            if ((fabs(min.x) < 1.5) && (fabs(min.y) < 1.5)) {
    129                 modelFLT->params->data.F32[2] = min.x + ix;
    130                 modelFLT->params->data.F32[3] = min.y + iy;
     83                modelEXT->params->data.F32[2] = min.x + ix;
     84                modelEXT->params->data.F32[3] = min.y + iy;
    13185            }
    13286            psFree (bicube);
     
    13488
    13589        // set PSF parameters for this model
    136         pmModel *model = pmModelFromPSF (modelFLT, psf);
    137         psFree (modelFLT);
     90        pmModel *model = pmModelFromPSF (modelEXT, psf);
     91        psFree (modelEXT);
    13892
    13993        // save the original coords
     
    185139
    186140        // diagonal element (auto-cross-product)
    187         f = psphotCrossProduct (Mi, Mi);
     141        f = pmSourceCrossProduct (Mi, Mi);
    188142        psSparseMatrixElement (sparse, i, i, f);
    189143
    190144        // find the image x model value
    191         f = psphotCrossProduct (Fi, Mi);
     145        f = pmSourceCrossProduct (Fi, Mi);
    192146        psSparseVectorElement (sparse, i, f);
    193147
     
    203157           
    204158            // got an overlap; calculate cross-product and add to output array
    205             f = psphotCrossProduct (Mi, Mj);
     159            f = pmSourceCrossProduct (Mi, Mj);
    206160            psSparseMatrixElement (sparse, j, i, f);
    207161        }
     
    235189    return true;
    236190}
    237 
    238 
    239 float psphotCrossProduct (pmSource *Mi, pmSource *Mj) {
    240 
    241     int Xs, Xe, Ys, Ye;
    242     int xi, xj, yi, yj;
    243     int xIs, xJs, yIs, yJs;
    244     int xIe, yIe;
    245     float flux;
    246 
    247     psImage *Pi = Mi->pixels;
    248     psImage *Pj = Mj->pixels;
    249 
    250     psImage *Ti = Mi->mask;
    251     psImage *Tj = Mj->mask;
    252 
    253     Xs = PS_MAX (Pi->col0, Pj->col0);
    254     Xe = PS_MIN (Pi->col0 + Pi->numCols, Pj->col0 + Pj->numCols);
    255    
    256     Ys = PS_MAX (Pi->row0, Pj->row0);
    257     Ye = PS_MIN (Pi->row0 + Pi->numRows, Pj->row0 + Pj->numRows);
    258    
    259     xIs = Xs - Pi->col0;
    260     xJs = Xs - Pj->col0;
    261     yIs = Ys - Pi->row0;
    262     yJs = Ys - Pj->row0;
    263 
    264     xIe = Xe - Pi->col0;
    265     yIe = Ye - Pi->row0;
    266 
    267     flux = 0;
    268     for (yi = yIs, yj = yJs; yi < yIe; yi++, yj++) {
    269         for (xi = xIs, xj = xJs; xi < xIe; xi++, xj++) {
    270             if (Ti->data.U8[yi][xi]) continue;
    271             if (Tj->data.U8[yj][xj]) continue;
    272             flux += Pi->data.F32[yi][xi] * Pj->data.F32[yj][xj];
    273         }
    274     }
    275     return (flux);
    276 }
  • trunk/psphot/src/psphotEvalFLT.c

    r5828 r5993  
    11# include "psphot.h"
    22
    3 bool psphotEvalFLT (pmSource *source, pmModel *model)
     3bool psphotEvalEXT (pmSource *source, pmModel *model)
    44{
    55    int keep;
    66
    7     // do we actually have a valid FLT model?
     7    // do we actually have a valid EXT model?
    88    if (model == NULL) {
    99        source->mode &= ~PM_SOURCE_FITTED;
     
    2222      case PM_MODEL_OFFIMAGE:
    2323      default:
    24         psLogMsg ("psphot", 5, "GAL fail fit\n");
     24        psLogMsg ("psphot", 5, "EXT fail fit\n");
    2525        source->mode |= PM_SOURCE_FAIL;
    2626        return false;
    2727    }
    2828
    29     // unless we prove otherwise, this object is a galaxy.
    30     // XXX EAM : do we need to save the old type?
    31     source->type = PM_SOURCE_GALAXY;
     29    // unless we prove otherwise, this object is extended
     30    source->type = PM_SOURCE_EXTENDED;
    3231
    33     // the following source->mode information pertains to modelPSF:
    34     source->mode |= PM_SOURCE_FLTMODEL;
     32    // the following source->mode information pertains to modelEXT:
     33    source->mode |= PM_SOURCE_EXTMODEL;
    3534
    3635    // if the object has a fitted peak below 0, the fit did not converge cleanly
     
    4443
    4544    // poor-quality fit; only keep if nothing else works...
    46     psLogMsg ("psphot", 5, "GAL poor fit\n");
     45    psLogMsg ("psphot", 5, "EXT poor fit\n");
    4746    source->mode |= PM_SOURCE_POOR;
    4847    return false;
  • trunk/psphot/src/psphotEvalPSF.c

    r5828 r5993  
    1919
    2020// saturated stars should fall outside (larger), but have peaks above SATURATION
    21 // galaxies should be larger, cosmic rays smaller
     21// extended sources should be larger, cosmic rays smaller
    2222// we also reject objects with S/N too low or ChiSquare to high
    2323
     
    138138    }
    139139
    140     // object appears to be large, suspected galaxy
     140    // object appears to be large, suspected extended source
    141141    if ((nSx >= PSF_SHAPE_NSIGMA) || (nSy >= PSF_SHAPE_NSIGMA)) {
    142         source->type = PM_SOURCE_GALAXY;
     142        source->type = PM_SOURCE_EXTENDED;
    143143        return false;
    144144    }
  • trunk/psphot/src/psphotFitGalaxies.c

    r5828 r5993  
    11# include "psphot.h"
    22
    3 bool psphotFitGalaxies (eamReadout *imdata, psMetadata *config, psArray *sources, psStats *skyStats)
     3bool psphotFitExtended (eamReadout *imdata, psMetadata *config, psArray *sources, psStats *skyStats)
    44{
    55    bool  status;
     
    1212    psTimerStart ("psphot");
    1313
    14     float GAL_MIN_SN       = psMetadataLookupF32 (&status, config, "GAL_MIN_SN");
    15     float GAL_MOMENTS_RAD  = psMetadataLookupF32 (&status, config, "GAL_MOMENTS_RADIUS");
    16     char       *modelName  = psMetadataLookupPtr (&status, config, "GAL_MODEL");
     14    float EXT_MIN_SN       = psMetadataLookupF32 (&status, config, "EXT_MIN_SN");
     15    float EXT_MOMENTS_RAD  = psMetadataLookupF32 (&status, config, "EXT_MOMENTS_RADIUS");
     16    char       *modelName  = psMetadataLookupPtr (&status, config, "EXT_MODEL");
    1717    pmModelType modelType  = pmModelSetType (modelName);
    1818
    19     psphotInitRadiusFLT (config, skyStats, modelType);
     19    psphotInitRadiusEXT (config, skyStats, modelType);
    2020
    2121    for (int i = 0; i < sources->n; i++) {
     
    2323
    2424        // only fit suspected extended sources
    25         if (source->type != PM_SOURCE_GALAXY) continue;
     25        if (source->type != PM_SOURCE_EXTENDED) continue;
    2626        if (source->mode  & PM_SOURCE_BLEND) continue;
    2727
    2828        // skip possible extended sources below fit threshold
    29         if (source->moments->SN < GAL_MIN_SN) continue;
     29        if (source->moments->SN < EXT_MIN_SN) continue;
    3030
    31         // recalculate the source moments using the larger galaxy moments radius
    32         status = pmSourceMoments (source, GAL_MOMENTS_RAD);
     31        // recalculate the source moments using the larger extended-source moments radius
     32        status = pmSourceMoments (source, EXT_MOMENTS_RAD);
    3333        if (!status) {
    3434          source->mode |= PM_SOURCE_FAIL;  // better choice?
     
    3838        // use the source moments, etc to guess basic model parameters
    3939        pmModel  *model  = pmSourceModelGuess (source, modelType);
    40         source->modelFLT = model;
     40        source->modelEXT = model;
    4141        x = model->params->data.F32[2];
    4242        y = model->params->data.F32[3];
    4343
    4444        // sets the model radius (via source->model) and adjusts pixels as needed
    45         psphotCheckRadiusFLT (imdata, source, model);
     45        psphotCheckRadiusEXT (imdata, source, model);
    4646
    47         // fit FLT (not PSF) model (set/unset the pixel mask)
     47        // fit EXT (not PSF) model (set/unset the pixel mask)
    4848        psImageKeepCircle (source->mask, x, y, model->radius, "OR", PSPHOT_MASK_MARKED);
    4949        pmSourceFitModel (source, model, false);
     
    6161        }
    6262    }
    63     psLogMsg ("psphot", 3, "fit GAL models: %f sec for %d galaxies (%d total iterations)\n", psTimerMark ("psphot"), Nfit, Niter);
    64     psLogMsg ("psphot", 4, "subtracted %d GAL models\n", Nsub);
     63    psLogMsg ("psphot", 3, "fit EXT models: %f sec for %d objects (%d total iterations)\n", psTimerMark ("psphot"), Nfit, Niter);
     64    psLogMsg ("psphot", 4, "subtracted %d EXT objects\n", Nsub);
    6565    return (true);
    6666}
  • trunk/psphot/src/psphotFullFit.c

    r5828 r5993  
    1414    sources = psArraySort (sources, psphotSortBySN);
    1515   
    16     // galaxy model parameters
    17     float GAL_MIN_SN       = psMetadataLookupF32 (&status, config, "GAL_MIN_SN");
    18     float GAL_MOMENTS_RAD  = psMetadataLookupF32 (&status, config, "GAL_MOMENTS_RADIUS");
     16    // extended source model parameters
     17    float EXT_MIN_SN       = psMetadataLookupF32 (&status, config, "EXT_MIN_SN");
     18    float EXT_MOMENTS_RAD  = psMetadataLookupF32 (&status, config, "EXT_MOMENTS_RADIUS");
    1919
    20     // 'galaxy' model descriptions
    21     char         *modelNameFLT = psMetadataLookupPtr (&status, config, "GAL_MODEL");
    22     pmModelType   modelTypeFLT = pmModelSetType (modelNameFLT);
     20    // extended source model descriptions
     21    char         *modelNameEXT = psMetadataLookupPtr (&status, config, "EXT_MODEL");
     22    pmModelType   modelTypeEXT = pmModelSetType (modelNameEXT);
    2323
    2424    psphotInitLimitsPSF (config);
    2525    psphotInitRadiusPSF (config, sky, psf->type);
    26     psphotInitRadiusFLT (config, sky, modelTypeFLT);
     26    psphotInitRadiusEXT (config, sky, modelTypeEXT);
    2727
    2828    for (int i = 0; i < sources->n; i++) {
     
    8282
    8383        // skip the source if we don't think it is extended
    84         if (source->type != PM_SOURCE_GALAXY) goto subLINEAR;
    85         if (source->moments->SN < GAL_MIN_SN) goto subLINEAR;
     84        if (source->type != PM_SOURCE_EXTENDED) goto subLINEAR;
     85        if (source->moments->SN < EXT_MIN_SN) goto subLINEAR;
    8686
    8787        // add the double-PSF fit mode
    8888        // how do we compare the results?  chisq?
    8989       
    90         // recalculate the source moments using the larger galaxy moments radius
    91         if (!pmSourceMoments (source, GAL_MOMENTS_RAD)) goto subLINEAR;
     90        // recalculate the source moments using the larger extended-source moments radius
     91        if (!pmSourceMoments (source, EXT_MOMENTS_RAD)) goto subLINEAR;
    9292
    9393        // use the source moments, etc to guess basic model parameters
    94         source->modelFLT = pmSourceModelGuess (source, modelTypeFLT);
    95         pmModel *modelFLT = source->modelFLT;
     94        source->modelEXT = pmSourceModelGuess (source, modelTypeEXT);
     95        pmModel *modelEXT = source->modelEXT;
    9696
    97         psphotCheckRadiusFLT (imdata, source, modelFLT);
     97        psphotCheckRadiusEXT (imdata, source, modelEXT);
    9898
    99         x = modelFLT->params->data.F32[2];
    100         y = modelFLT->params->data.F32[3];
     99        x = modelEXT->params->data.F32[2];
     100        y = modelEXT->params->data.F32[3];
    101101
    102         // fit FLT (not PSF) model (set/unset the pixel mask)
    103         psImageKeepCircle (source->mask, x, y, modelFLT->radius, "OR", PSPHOT_MASK_MARKED);
    104         pmSourceFitModel (source, modelFLT, false);
    105         psImageKeepCircle (source->mask, x, y, modelFLT->radius, "AND", ~PSPHOT_MASK_MARKED);
     102        // fit EXT (not PSF) model (set/unset the pixel mask)
     103        psImageKeepCircle (source->mask, x, y, modelEXT->radius, "OR", PSPHOT_MASK_MARKED);
     104        pmSourceFitModel (source, modelEXT, false);
     105        psImageKeepCircle (source->mask, x, y, modelEXT->radius, "AND", ~PSPHOT_MASK_MARKED);
    106106
    107107        // track model evaluations
    108         Niter += modelFLT[0].nIter;
     108        Niter += modelEXT[0].nIter;
    109109        Nfit++;
    110110
    111         // does the FLT model succeed?
    112         if (psphotEvalFLT (source, source->modelFLT)) {
    113             pmSourceSubModel (source->pixels, source->mask, source->modelFLT, false, false);
     111        // does the EXT model succeed?
     112        if (psphotEvalEXT (source, source->modelEXT)) {
     113            pmSourceSubModel (source->pixels, source->mask, source->modelEXT, false, false);
    114114            source->mode |=  PM_SOURCE_SUBTRACTED;
    115115            source->mode &= ~PM_SOURCE_TEMPSUB;
  • trunk/psphot/src/psphotMagnitudes.c

    r5980 r5993  
    2121        break;
    2222
    23       case PM_SOURCE_GALAXY:
    24         model = source->modelFLT;
     23      case PM_SOURCE_EXTENDED:
     24        model = source->modelEXT;
    2525        if (model == NULL) return NULL;
    2626        radius = model->radius;
  • trunk/psphot/src/psphotModelTest.c

    r5986 r5993  
    66    bool status;
    77    int modelType;
     8    unsigned int Nfail;
    89    float obsMag, fitMag, value;
    910    char name[64];
     
    1819    char *psfModeWord = psMetadataLookupPtr (&status, config, "TEST_FIT_MODE");
    1920    if (!status) {
    20         psfModeWord = psStringCopy ("FLT");
     21        psfModeWord = psStringCopy ("EXT");
    2122    }
    2223    bool psfMode = !strcasecmp (psfModeWord, "PSF");
     
    2627        char *psfFile = psMetadataLookupPtr (&status, config, "PSF_INPUT_FILE");
    2728        if (!status) psAbort ("psphotModelTest", "PSF_INPUT_FILE not supplied");
    28         psf = psphotReadPSF (psfFile);
     29        psMetadata *psfData = psMetadataConfigParse (NULL, &Nfail, psfFile, FALSE);
     30        psf = pmPSFfromMD (psfData);
    2931        modelType = psf->type;
    3032    } else {
  • trunk/psphot/src/psphotOutput.c

    r5986 r5993  
    1414
    1515    if (residImage != NULL) psphotSaveImage (imdata->header, imdata->image, residImage);
    16     if (psfFile != NULL) psphotWritePSF (psf, psfFile);
    1716    psphotSamplePSFs (config, psf, imdata->image);
    1817
     18    if (psfFile != NULL) {
     19        psMetadata *psfData = pmPSFtoMD (NULL, psf);
     20        psMetadataConfigWrite (psfData, psfFile);
     21        psFree (psfData);
     22    }
    1923    if (outputFile == NULL) {
    2024        psLogMsg ("output", 3, "no data output file selected");
     
    166170    float ZERO_POINT = psMetadataLookupF32 (&status, config, "ZERO_POINT");
    167171    if (!status) ZERO_POINT = 25.0;
    168     char *PHOTCODE = psMetadataLookupPtr (&status, config, "PHOTCODE");
    169172
    170173    // write necessary information to output header
    171     psMetadataAdd (imdata->header, PS_LIST_TAIL, "NSTARS",   PS_DATA_S32 | PS_META_REPLACE, "NUMBER OF STARS",     sources->n);
    172     psMetadataAdd (imdata->header, PS_LIST_TAIL, "ZERO_PT",  PS_DATA_F32 | PS_META_REPLACE, "zero point",          ZERO_POINT);
    173     psMetadataAdd (imdata->header, PS_LIST_TAIL, "APMIFIT",  PS_DATA_F32 | PS_META_REPLACE, "aperture residual",   psf->ApResid);
    174     psMetadataAdd (imdata->header, PS_LIST_TAIL, "DAPMIFIT", PS_DATA_F32 | PS_META_REPLACE, "ap residual scatter", psf->dApResid);
    175     psMetadataAdd (imdata->header, PS_LIST_TAIL, "NAPMIFIT", PS_DATA_S32 | PS_META_REPLACE, "ap residual scatter", psf->nApResid);
    176     psMetadataAdd (imdata->header, PS_LIST_TAIL, "NPSFSTAR", PS_DATA_S32 | PS_META_REPLACE, "ap residual scatter", psf->nPSFstars);
    177     psMetadataAdd (imdata->header, PS_LIST_TAIL, "SKYBIAS",  PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias",   psf->skyBias);
    178     psMetadataAdd (imdata->header, PS_LIST_TAIL, "SKYSAT",   PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias",   psf->skySat);
    179     psMetadataAdd (imdata->header, PS_LIST_TAIL, "PHOTCODE", PS_DATA_STRING | PS_META_REPLACE, "photometry code",     PHOTCODE);
    180     psMetadataAdd (imdata->header, PS_LIST_TAIL, "FWHM_X",   PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM X",          0.0);
    181     psMetadataAdd (imdata->header, PS_LIST_TAIL, "FWHM_Y",   PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Y",          0.0);
    182     psMetadataAdd (imdata->header, PS_LIST_TAIL, "ANGLE",    PS_DATA_F32 | PS_META_REPLACE, "PSF ANGLE",           0.0);
    183     psMetadataAdd (imdata->header, PS_LIST_TAIL, "FSATUR",   PS_DATA_F32 | PS_META_REPLACE, "SATURATION MAG",      0.0);
    184     psMetadataAdd (imdata->header, PS_LIST_TAIL, "FLIMIT",   PS_DATA_F32 | PS_META_REPLACE, "COMPLETENESS MAG",    0.0);
     174    psphotUpdateHeader (imdata->header, config);
     175    psMetadataAdd (imdata->header, PS_LIST_TAIL, "NSTARS",   PS_DATA_S32 | PS_META_REPLACE, "NUMBER OF STARS", sources->n);
    185176
    186177    // create file, write-out header
     
    227218        psLineAdd (line, "%2d ",   type);
    228219        psLineAdd (line, "%3.1f ", lsky);
    229         psLineAdd (line, "%6.3f ", 99.999);    // should be 'Mgal
     220        psLineAdd (line, "%6.3f ", 99.999); // should be 'Mgal
    230221        psLineAdd (line, "%6.3f ", PS_MIN (99.999, source->apMag + ZERO_POINT));
    231         psLineAdd (line, "%6.2f ", PAR[4]);  // should be 'FHWM x'
    232         psLineAdd (line, "%6.2f ", PAR[5]);  // should be 'FHWM y'
    233         psLineAdd (line, "%5.1f\n", 0);   // should be theta
     222        psLineAdd (line, "%6.2f ", PAR[4]); // should be 'FHWM x'
     223        psLineAdd (line, "%6.2f ", PAR[5]); // should be 'FHWM y'
     224        psLineAdd (line, "%5.1f\n", 0); // should be theta
    234225        fwrite (line->line, 1, line->Nline, f);
    235226    }
     
    256247    float RADIUS = psMetadataLookupF32 (&status, config, "AP_RADIUS");
    257248    float ZERO_POINT = psMetadataLookupF32 (&status, config, "ZERO_POINT");
    258     char *PHOTCODE = psMetadataLookupPtr (&status, config, "PHOTCODE");
    259249
    260250    // write necessary information to output header
    261     psMetadataAdd (imdata->header, PS_LIST_TAIL, "NSTARS",   PS_DATA_S32 | PS_META_REPLACE, "NUMBER OF STARS",     sources->n);
    262     psMetadataAdd (imdata->header, PS_LIST_TAIL, "ZERO_PT",  PS_DATA_F32 | PS_META_REPLACE, "zero point",          ZERO_POINT);
    263     psMetadataAdd (imdata->header, PS_LIST_TAIL, "APMIFIT",  PS_DATA_F32 | PS_META_REPLACE, "aperture residual",   psf->ApResid);
    264     psMetadataAdd (imdata->header, PS_LIST_TAIL, "dAPMIFIT", PS_DATA_F32 | PS_META_REPLACE, "ap residual scatter", psf->dApResid);
    265     psMetadataAdd (imdata->header, PS_LIST_TAIL, "SKYBIAS",  PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias",   psf->skyBias);
    266     psMetadataAdd (imdata->header, PS_LIST_TAIL, "PHOTCODE", PS_DATA_STRING | PS_META_REPLACE, "photometry code",     PHOTCODE);
    267     psMetadataAdd (imdata->header, PS_LIST_TAIL, "FWHM_X",   PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM X",          0.0);
    268     psMetadataAdd (imdata->header, PS_LIST_TAIL, "FWHM_Y",   PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Y",          0.0);
    269     psMetadataAdd (imdata->header, PS_LIST_TAIL, "ANGLE",    PS_DATA_F32 | PS_META_REPLACE, "PSF ANGLE",           0.0);
    270     psMetadataAdd (imdata->header, PS_LIST_TAIL, "FSATUR",   PS_DATA_F32 | PS_META_REPLACE, "SATURATION MAG",      0.0);
    271     psMetadataAdd (imdata->header, PS_LIST_TAIL, "FLIMIT",   PS_DATA_F32 | PS_META_REPLACE, "COMPLETENESS MAG",    0.0);
    272 
    273     // set NAXIS to 0
    274     mdi = psMetadataLookup (imdata->header, "NAXIS");
    275     mdi->data.S32 = 0;
    276     mdi->type = PS_DATA_S32;
     251    psphotUpdateHeader (imdata->header, config);
    277252
    278253    table = psArrayAlloc (sources->n);
     
    299274        psMetadataAdd (row, PS_LIST_TAIL, "MAG_GAL", PS_DATA_F32, "", type);
    300275        psMetadataAdd (row, PS_LIST_TAIL, "MAG_AP",  PS_DATA_F32, "", lsky);
    301         psMetadataAdd (row, PS_LIST_TAIL, "LOG_SKY", PS_DATA_F32, "", 32.0);    // should be 'Mgal'
     276        psMetadataAdd (row, PS_LIST_TAIL, "LOG_SKY", PS_DATA_F32, "", 32.0);
    302277        psMetadataAdd (row, PS_LIST_TAIL, "FWHM_X",  PS_DATA_F32, "", source->apMag + ZERO_POINT);
    303         psMetadataAdd (row, PS_LIST_TAIL, "FWHM_Y",  PS_DATA_F32, "", PAR[4]);  // should be 'FHWM x'
    304         psMetadataAdd (row, PS_LIST_TAIL, "THETA",   PS_DATA_F32, "", PAR[5]);  // should be 'FHWM y'
    305         psMetadataAdd (row, PS_LIST_TAIL, "DOPHOT",  PS_TYPE_S32, "", 0);   // should be theta
    306         // psMetadataAdd (header, PS_LIST_HEAD, "DUMMY",   PS_DATA_STRING, "", NULL);
     278        psMetadataAdd (row, PS_LIST_TAIL, "FWHM_Y",  PS_DATA_F32, "", PAR[4]);
     279        psMetadataAdd (row, PS_LIST_TAIL, "THETA",   PS_DATA_F32, "", PAR[5]);
     280        psMetadataAdd (row, PS_LIST_TAIL, "DOPHOT",  PS_DATA_STRING, "", "0");
     281        psMetadataAdd (row, PS_LIST_TAIL, "DUMMY",   PS_DATA_STRING, "", "123");
    307282   
    308283        psArrayAdd (table, 100, row);
     
    310285    }
    311286
    312     // psAbort ("psphotOutput", "FITS table output not finished");
    313 
    314     // psImage *image = psImageAlloc (1, 1, PS_TYPE_F32);
    315     // XXX missing: theader = psFitsHeaderFromTable (NULL, table, "SMPFILE");
    316     // psFitsWriteImage (fits, imdata->header, image, 0);
    317 
     287    // write the correct number of sources in the header
     288    psMetadataAdd (imdata->header, PS_LIST_TAIL, "NSTARS", PS_DATA_S32 | PS_META_REPLACE, "NUMBER OF STARS", table->n);
     289    psMetadataAdd (imdata->header, PS_LIST_TAIL, "EXTEND", PS_DATA_BOOL | PS_META_REPLACE, "this file has extensions", true);
     290
     291    // set NAXIS to 0 (we don't write out the data array)
     292    mdi = psMetadataLookup (imdata->header, "NAXIS");
     293    mdi->data.S32 = 0;
     294    mdi->type = PS_DATA_S32;
     295
     296    // create the basic table header
    318297    theader = psMetadataAlloc ();
    319298    psMetadataAdd (theader, PS_LIST_HEAD, "EXTNAME", PS_DATA_STRING, "extension name", "SMPFILE");
    320299
    321     psImage *image;
    322 
    323     image = psImageAlloc (512, 512, PS_DATA_F32);
    324     for (int j = 0; j < 512; j++) {
    325         for (int i = 0; i < 512; i++) {
    326             image->data.F32[j][i] = i;
    327         }
    328     }
    329 
     300    // write out the header and table
    330301    psFits *fits = psFitsOpen (filename, "w");
    331     // psFitsWriteHeader (imdata->header, fits);
    332     // psFitsWriteTable (fits, theader, table);
    333 
    334     psFitsWriteImage (fits, NULL, image, 0);
    335     psFitsWriteTable (fits, NULL, table);
     302    psFitsWriteHeader (imdata->header, fits);
     303    psFitsWriteTable (fits, theader, table);
    336304    psFitsClose (fits);
    337305
     
    348316    pmModelWritePSFs (sources, config, name, psf);
    349317
    350     sprintf (name, "%s.flt.dat", filename);
    351     pmModelWriteFLTs (sources, name);
     318    sprintf (name, "%s.ext.dat", filename);
     319    pmModelWriteEXTs (sources, name);
    352320
    353321    sprintf (name, "%s.nul.dat", filename);
     
    417385
    418386// dump the sources to an output file
    419 bool pmModelWriteFLTs (psArray *sources, char *filename) {
     387bool pmModelWriteEXTs (psArray *sources, char *filename) {
    420388
    421389    double dPos, dMag;
     
    427395    f = fopen (filename, "w");
    428396    if (f == NULL) {
    429         psLogMsg ("pmModelWriteFLTs", 3, "can't open output file for moments%s\n", filename);
     397        psLogMsg ("pmModelWriteEXTs", 3, "can't open output file for moments%s\n", filename);
    430398        return false;
    431399    }
     
    435403        pmSource *source = (pmSource *) sources->data[i];
    436404
    437         if (source->type != PM_SOURCE_GALAXY) continue;
     405        if (source->type != PM_SOURCE_EXTENDED) continue;
    438406        model = pmSourceMagnitudes (source, NULL, 0.0);
    439407        if (model == NULL) continue;
     
    491459        source = sources->data[i];
    492460
    493         // skip these sources (in PSF or FLT)
     461        // skip these sources (in PSF or EXT)
    494462        if (source->type == PM_SOURCE_STAR) continue;
    495         if (source->type == PM_SOURCE_GALAXY) continue;
     463        if (source->type == PM_SOURCE_EXTENDED) continue;
    496464           
    497465        if (source->moments == NULL) {
     
    580548        return (1);
    581549
    582       case PM_SOURCE_GALAXY:
     550      case PM_SOURCE_EXTENDED:
    583551        return (2);
    584552
     
    597565}
    598566
    599 psImage *pmModelPSFatXY (psImage *image, pmModel *modelFLT, pmPSF *psf, int x, int y, int dx, int dy) {
     567psImage *pmModelPSFatXY (psImage *image, pmModel *modelEXT, pmPSF *psf, int x, int y, int dx, int dy) {
    600568
    601569    psRegion region = {x - dx, x + dx, y - dy, y + dy};
     
    603571    psImage *sample = psImageCopy (NULL, view, PS_TYPE_F32);
    604572    psImageInit (sample, 0);
    605     modelFLT->params->data.F32[2] = x;
    606     modelFLT->params->data.F32[3] = y;
    607     pmModel *modelPSF = pmModelFromPSF (modelFLT, psf);
     573    modelEXT->params->data.F32[2] = x;
     574    modelEXT->params->data.F32[3] = y;
     575    pmModel *modelPSF = pmModelFromPSF (modelEXT, psf);
    608576    pmSourceAddModel (sample, NULL, modelPSF, false, false);
    609577    psFree (modelPSF);
     
    625593    if (output[0] == 0) return false;
    626594
    627     pmModel *modelFLT = pmModelAlloc (psf->type);
    628     modelFLT->params->data.F32[0] = 0;
    629     modelFLT->params->data.F32[1] = 1;
     595    pmModel *modelEXT = pmModelAlloc (psf->type);
     596    modelEXT->params->data.F32[0] = 0;
     597    modelEXT->params->data.F32[1] = 1;
    630598
    631599    psFits *fits = psFitsOpen (output, "w");
    632600
    633     sample = pmModelPSFatXY (image, modelFLT, psf, 25, 25, 25, 25);
     601    sample = pmModelPSFatXY (image, modelEXT, psf, 25, 25, 25, 25);
    634602    psFitsWriteImage (fits, NULL, sample, 0);
    635     sample = pmModelPSFatXY (image, modelFLT, psf, image->numCols - 25, image->numRows - 25, 25, 25);
     603    sample = pmModelPSFatXY (image, modelEXT, psf, image->numCols - 25, image->numRows - 25, 25, 25);
    636604    psFitsWriteImage (fits, NULL, sample, 0);
    637     sample = pmModelPSFatXY (image, modelFLT, psf, image->numCols - 25, 25, 25, 25);
     605    sample = pmModelPSFatXY (image, modelEXT, psf, image->numCols - 25, 25, 25, 25);
    638606    psFitsWriteImage (fits, NULL, sample, 0);
    639     sample = pmModelPSFatXY (image, modelFLT, psf, 25, image->numRows - 25, 25, 25);
     607    sample = pmModelPSFatXY (image, modelEXT, psf, 25, image->numRows - 25, 25, 25);
    640608    psFitsWriteImage (fits, NULL, sample, 0);
    641     sample = pmModelPSFatXY (image, modelFLT, psf, image->numCols / 2, image->numRows / 2, 25, 25);
     609    sample = pmModelPSFatXY (image, modelEXT, psf, image->numCols / 2, image->numRows / 2, 25, 25);
    642610    psFitsWriteImage (fits, NULL, sample, 0);
    643611
    644612    psFitsClose (fits);
    645613    return (TRUE);
    646 }
    647 
    648 psPolynomial2D *psPolynomial2DfromMD (psMetadata *folder) {
    649 
    650     bool status;
    651     char keyword[80];
    652 
    653     // get polynomial orders
    654     // XXX add status failures tests
    655     int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");
    656     int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");
    657 
    658     psPolynomial2D *poly = psPolynomial2DAlloc (nXorder, nYorder, PS_POLYNOMIAL_ORD);
    659 
    660     for (int nx = 0; nx < poly->nX + 1; nx++) {
    661         for (int ny = 0; ny < poly->nY + 1; ny++) {
    662             sprintf (keyword, "VAL_X%02d_Y%02d", nx, ny);
    663             poly->coeff[nx][ny] = psMetadataLookupF32 (&status, folder, keyword);
    664             if (!status) poly->mask[nx][ny] = 1;
    665 
    666             sprintf (keyword, "ERR_X%02d_Y%02d", nx, ny);
    667             poly->coeffErr[nx][ny] = psMetadataLookupF32 (&status, folder, keyword);
    668         }
    669     }
    670     return (poly);
    671 }
    672 
    673 psPolynomial3D *psPolynomial3DfromMD (psMetadata *folder) {
    674 
    675     bool status;
    676     char keyword[80];
    677 
    678     // get polynomial orders
    679     // XXX add status failures tests
    680     int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");
    681     int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");
    682     int nZorder = psMetadataLookupS32 (&status, folder, "NORDER_Z");
    683 
    684     psPolynomial3D *poly = psPolynomial3DAlloc (nXorder, nYorder, nZorder, PS_POLYNOMIAL_ORD);
    685 
    686     for (int nx = 0; nx < poly->nX + 1; nx++) {
    687         for (int ny = 0; ny < poly->nY + 1; ny++) {
    688             for (int nz = 0; nz < poly->nZ + 1; nz++) {
    689                 sprintf (keyword, "VAL_X%02d_Y%02d_Z%02d", nx, ny, nz);
    690                 poly->coeff[nx][ny][nz] = psMetadataLookupF32 (&status, folder, keyword);
    691                 if (!status) poly->mask[nx][ny][nz] = 1;
    692 
    693                 sprintf (keyword, "ERR_X%02d_Y%02d_Z%02d", nx, ny, nz);
    694                 poly->coeffErr[nx][ny][nz] = psMetadataLookupF32 (&status, folder, keyword);
    695             }
    696         }
    697     }
    698     return (poly);
    699 }
    700 
    701 psPolynomial4D *psPolynomial4DfromMD (psMetadata *folder) {
    702 
    703     bool status;
    704     char keyword[80];
    705 
    706     // get polynomial orders
    707     // XXX add status failures tests
    708     int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");
    709     int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");
    710     int nZorder = psMetadataLookupS32 (&status, folder, "NORDER_Z");
    711     int nTorder = psMetadataLookupS32 (&status, folder, "NORDER_T");
    712 
    713     psPolynomial4D *poly = psPolynomial4DAlloc (nXorder, nYorder, nZorder, nTorder, PS_POLYNOMIAL_ORD);
    714 
    715     for (int nx = 0; nx < poly->nX + 1; nx++) {
    716         for (int ny = 0; ny < poly->nY + 1; ny++) {
    717             for (int nz = 0; nz < poly->nZ + 1; nz++) {
    718                 for (int nt = 0; nt < poly->nT + 1; nt++) {
    719                     sprintf (keyword, "VAL_X%02d_Y%02d_Z%02d_T%02d", nx, ny, nz, nt);
    720                     poly->coeff[nx][ny][nz][nt] = psMetadataLookupF32 (&status, folder, keyword);
    721                     if (!status) poly->mask[nx][ny][nz][nt] = 1;
    722                    
    723                     sprintf (keyword, "ERR_X%02d_Y%02d_Z%02d_T%02d", nx, ny, nz, nt);
    724                     poly->coeffErr[nx][ny][nz][nt] = psMetadataLookupF32 (&status, folder, keyword);
    725                 }
    726             }
    727         }
    728     }
    729     return (poly);
    730 }
    731 
    732 // XXX : these may need F64, or %g format for output
    733 bool psPolynomial2DtoMD (psMetadata *md, psPolynomial2D *poly, char *format, ...) {
    734 
    735     int Nbyte;
    736     char tmp;
    737     char *root;
    738     va_list argp; 
    739 
    740     va_start (argp, format);
    741     Nbyte = vsnprintf (&tmp, 0, format, argp);
    742     va_end (argp);
    743 
    744     if (!Nbyte) return false;
    745 
    746     va_start (argp, format);
    747     root = (char *) psAlloc (Nbyte + 1);
    748     memset (root, 0, Nbyte + 1);
    749     vsnprintf (root, Nbyte + 1, format, argp);
    750     va_end (argp);
    751 
    752     psMetadata *folder = psMetadataAlloc ();
    753     psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 2D polynomial", folder);
    754     psFree (root);
    755 
    756     // specify the polynomial orders
    757     psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);
    758     psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);
    759 
    760     // place polynomial entries on folder
    761     for (int nx = 0; nx < poly->nX + 1; nx++) {
    762         for (int ny = 0; ny < poly->nY + 1; ny++) {
    763             if (poly->mask[nx][ny]) continue;
    764             psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d", PS_DATA_F32, "polynomial coefficient", poly->coeff[nx][ny], nx, ny);
    765             psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d", PS_DATA_F32, "polynomial coefficient error", poly->coeffErr[nx][ny], nx, ny);
    766         }
    767     }
    768     return true;
    769 }
    770 
    771 bool psPolynomial3DtoMD (psMetadata *md, psPolynomial3D *poly, char *format, ...) {
    772 
    773     int Nbyte;
    774     char tmp;
    775     char *root;
    776     va_list argp; 
    777 
    778     va_start (argp, format);
    779     Nbyte = vsnprintf (&tmp, 0, format, argp);
    780     va_end (argp);
    781 
    782     if (!Nbyte) return false;
    783 
    784     va_start (argp, format);
    785     root = (char *) psAlloc (Nbyte + 1);
    786     memset (root, 0, Nbyte + 1);
    787     vsnprintf (root, Nbyte + 1, format, argp);
    788     va_end (argp);
    789 
    790     psMetadata *folder = psMetadataAlloc ();
    791     psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 3D polynomial", folder);
    792     psFree (root);
    793 
    794     // specify the polynomial orders
    795     psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);
    796     psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);
    797     psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Z", PS_DATA_S32, "number of z orders", poly->nZ);
    798 
    799     // place polynomial entries on folder
    800     for (int nx = 0; nx < poly->nX + 1; nx++) {
    801         for (int ny = 0; ny < poly->nY + 1; ny++) {
    802             for (int nz = 0; nz < poly->nZ + 1; nz++) {
    803                 if (poly->mask[nx][ny][nz]) continue;
    804                 psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d_Z%02d", PS_DATA_F32, "polynomial coefficient", poly->coeff[nx][ny][nz], nx, ny, nz);
    805                 psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d_Z%02d", PS_DATA_F32, "polynomial coeffficient error", poly->coeffErr[nx][ny][nz], nx, ny, nz);
    806             }
    807         }
    808     }
    809     return true;
    810 }
    811 
    812 bool psPolynomial4DtoMD (psMetadata *md, psPolynomial4D *poly, char *format, ...) {
    813 
    814     int Nbyte;
    815     char tmp;
    816     char *root;
    817     va_list argp; 
    818 
    819     va_start (argp, format);
    820     Nbyte = vsnprintf (&tmp, 0, format, argp);
    821     va_end (argp);
    822 
    823     if (!Nbyte) return false;
    824 
    825     va_start (argp, format);
    826     root = (char *) psAlloc (Nbyte + 1);
    827     memset (root, 0, Nbyte + 1);
    828     vsnprintf (root, Nbyte + 1, format, argp);
    829     va_end (argp);
    830 
    831     psMetadata *folder = psMetadataAlloc ();
    832     psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 4D polynomial", folder);
    833     psFree (root);
    834 
    835     // specify the polynomial orders
    836     psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);
    837     psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);
    838     psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Z", PS_DATA_S32, "number of z orders", poly->nZ);
    839     psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_T", PS_DATA_S32, "number of z orders", poly->nT);
    840 
    841     // place polynomial entries on folder
    842     for (int nx = 0; nx < poly->nX + 1; nx++) {
    843         for (int ny = 0; ny < poly->nY + 1; ny++) {
    844             for (int nz = 0; nz < poly->nZ + 1; nz++) {
    845                 for (int nt = 0; nt < poly->nT + 1; nt++) {
    846                     if (poly->mask[nx][ny][nz][nt]) continue;
    847                     psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d_Z%02d_T%02d", PS_DATA_F32, "polynomial coefficient", poly->coeff[nx][ny][nz][nt], nx, ny, nz, nt);
    848                     psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d_Z%02d_T%02d", PS_DATA_F32, "polynomial coeffficient error", poly->coeffErr[nx][ny][nz][nt], nx, ny, nz, nt);
    849                 }
    850             }
    851         }
    852     }
    853     return true;
    854 }
    855 
    856 bool psphotWritePSF (pmPSF *psf, char *filename) {
    857 
    858     psMetadata *psfdata = psMetadataAlloc ();
    859 
    860     char *modelName = pmModelGetType (psf->type);
    861     psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_MODEL_NAME", PS_DATA_STRING, "PSF model name", modelName);
    862 
    863     int nPar = pmModelParameterCount (psf->type)    ;
    864     psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_MODEL_NPAR", PS_DATA_S32, "PSF model parameter count", nPar);
    865 
    866     for (int i = 0; i < nPar - 4; i++) {
    867         psPolynomial2D *poly = psf->params->data[i];
    868         psPolynomial2DtoMD (psfdata, poly, "PSF_PAR%02d", i);
    869     }
    870     psPolynomial4DtoMD (psfdata, psf->ApTrend, "APTREND");
    871 
    872     psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_AP_RESID", PS_DATA_F32, "aperture residual", psf->ApResid);
    873     psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_dAP_RESID", PS_DATA_F32, "aperture residual scatter", psf->dApResid);
    874     psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_SKY_BIAS", PS_DATA_F32, "sky bias level", psf->skyBias);
    875 
    876     psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "chi-square for fit", psf->chisq);
    877     psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_NSTARS", PS_DATA_S32, "number of stars used to measure PSF", psf->nPSFstars);
    878    
    879     psMetadataConfigWrite (psfdata, filename);
    880     psFree (psfdata);
    881 
    882     return true;
    883 }
    884 
    885 pmPSF *psphotReadPSF (char *filename) {
    886 
    887     bool status;
    888     unsigned int Nfail;
    889     char keyword[80];
    890 
    891     psMetadata *psfdata = psMetadataConfigParse (NULL, &Nfail, filename, FALSE);
    892 
    893     char *modelName = psMetadataLookupPtr (&status, psfdata, "PSF_MODEL_NAME");
    894     pmModelType type = pmModelSetType (modelName);
    895 
    896     pmPSF *psf = pmPSFAlloc (type);
    897 
    898     int nPar = psMetadataLookupS32 (&status, psfdata, "PSF_MODEL_NPAR");
    899     if (nPar != pmModelParameterCount (psf->type)) psAbort ("read PSF" , "mismatch model par count");
    900 
    901     for (int i = 0; i < nPar - 4; i++) {
    902         sprintf (keyword, "PSF_PAR%02d", i);
    903         psMetadata *folder = psMetadataLookupPtr (&status, psfdata, keyword);
    904         psPolynomial2D *poly = psPolynomial2DfromMD (folder);
    905         psFree (psf->params->data[i]);
    906         psf->params->data[i] = poly;
    907     }
    908     sprintf (keyword, "APTREND");
    909     psMetadata *folder = psMetadataLookupPtr (&status, psfdata, keyword);
    910     psPolynomial4D *poly = psPolynomial4DfromMD (folder);
    911     psFree (psf->ApTrend);
    912     psf->ApTrend = poly;
    913 
    914     psf->ApResid = psMetadataLookupF32 (&status, psfdata, "PSF_AP_RESID");
    915     psf->dApResid = psMetadataLookupF32 (&status, psfdata, "PSF_dAP_RESID");
    916     psf->skyBias = psMetadataLookupF32 (&status, psfdata, "PSF_SKY_BIAS");
    917 
    918     psf->chisq = psMetadataLookupF32 (&status, psfdata, "PSF_CHISQ");
    919     psf->nPSFstars = psMetadataLookupS32 (&status, psfdata, "PSF_NSTARS");
    920 
    921     psFree (psfdata);
    922     return (psf);
    923614}
    924615
     
    937628    return true;
    938629}
     630
     631bool psphotUpdateHeader (psMetadata *header, psMetadata *config) {
     632
     633    // write necessary information to output header
     634    psMetadataItemTransfer (header, config, "NSTARS");
     635    psMetadataItemTransfer (header, config, "ZERO_PT");
     636    psMetadataItemTransfer (header, config, "APMIFIT");
     637    psMetadataItemTransfer (header, config, "dAPMIFIT");
     638    psMetadataItemTransfer (header, config, "SKYBIAS");
     639    psMetadataItemTransfer (header, config, "PHOTCODE");
     640   
     641    // write necessary information to output header
     642    psMetadataItemTransfer (header, config, "NPSFSTAR");
     643    psMetadataItemTransfer (header, config, "SKYBIAS");
     644    psMetadataItemTransfer (header, config, "SKYSAT");
     645    psMetadataItemTransfer (header, config, "APMIFIT");
     646    psMetadataItemTransfer (header, config, "DAPMIFIT");
     647    psMetadataItemTransfer (header, config, "NAPMIFIT");
     648    psMetadataItemTransfer (header, config, "APLOSS");
     649
     650    // XXX these need to be defined from elsewhere
     651    psMetadataAdd (header, PS_LIST_TAIL, "FWHM_X",   PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM X",          0.0);
     652    psMetadataAdd (header, PS_LIST_TAIL, "FWHM_Y",   PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Y",          0.0);
     653    psMetadataAdd (header, PS_LIST_TAIL, "ANGLE",    PS_DATA_F32 | PS_META_REPLACE, "PSF ANGLE",           0.0);
     654    psMetadataAdd (header, PS_LIST_TAIL, "FSATUR",   PS_DATA_F32 | PS_META_REPLACE, "SATURATION MAG",      0.0);
     655    psMetadataAdd (header, PS_LIST_TAIL, "FLIMIT",   PS_DATA_F32 | PS_META_REPLACE, "COMPLETENESS MAG",    0.0);
     656
     657    return true;
     658}
  • trunk/psphot/src/psphotRadiusChecks.c

    r5980 r5993  
    3131    }
    3232
    33 # if (1)
    3433    bool status = psphotRedefinePixels (source, imdata, model->params->data.F32[2], model->params->data.F32[3], model->radius);
    3534    return status;
    36 
    37 # else
    38 
    39     if (model->radius > PSF_OUTER_RADIUS) {
    40         // (re)-allocate image, weight, mask arrays for each peak (square of radius OUTER)
    41         psphotDefinePixels (source, imdata, model->params->data.F32[2], model->params->data.F32[3], model->radius);
    42         return true;
    43     } else {
    44         fprintf (stderr, "skipping %f,%f\n", model->params->data.F32[2], model->params->data.F32[3]);
    45     }
    46     return false;
    47 # endif
    4835}
    4936
     37static float EXT_OUTER_RADIUS;
     38static float EXT_FIT_PADDING;
     39static float EXT_FLUX_LIMIT;
     40static pmModelRadius modelRadiusEXT;
    5041
    51 static float GAL_OUTER_RADIUS;
    52 static float GAL_FIT_PADDING;
    53 static float GAL_FLUX_LIMIT;
    54 static pmModelRadius modelRadiusGAL;
    55 
    56 bool psphotInitRadiusFLT (psMetadata *config, psStats *sky, pmModelType type) {
     42bool psphotInitRadiusEXT (psMetadata *config, psStats *sky, pmModelType type) {
    5743
    5844    bool status;
    5945
    60     float GAL_FIT_NSIGMA = psMetadataLookupF32 (&status, config, "GAL_FIT_NSIGMA");
    61     GAL_OUTER_RADIUS     = psMetadataLookupF32 (&status, config, "GAL_OUTER_RADIUS");
    62     GAL_FIT_PADDING      = psMetadataLookupF32 (&status, config, "GAL_FIT_PADDING");
    63     GAL_FLUX_LIMIT       = GAL_FIT_NSIGMA * sky->sampleStdev;
     46    float EXT_FIT_NSIGMA = psMetadataLookupF32 (&status, config, "EXT_FIT_NSIGMA");
     47    EXT_OUTER_RADIUS     = psMetadataLookupF32 (&status, config, "EXT_OUTER_RADIUS");
     48    EXT_FIT_PADDING      = psMetadataLookupF32 (&status, config, "EXT_FIT_PADDING");
     49    EXT_FLUX_LIMIT       = EXT_FIT_NSIGMA * sky->sampleStdev;
    6450
    6551    // this function specifies the radius at this the model hits the given flux
    66     modelRadiusGAL       = pmModelRadius_GetFunction (type);
     52    modelRadiusEXT       = pmModelRadius_GetFunction (type);
    6753    return true;
    6854}
    6955
    70 bool psphotCheckRadiusFLT (eamReadout *imdata, pmSource *source, pmModel *model) {
     56bool psphotCheckRadiusEXT (eamReadout *imdata, pmSource *source, pmModel *model) {
    7157
    7258    // set the fit radius based on the object flux limit and the model
    73     model->radius = modelRadiusGAL (model->params, GAL_FLUX_LIMIT) + GAL_FIT_PADDING;
    74     if (isnan(model->radius)) psAbort ("fit_galaxies", "error in radius");
     59    model->radius = modelRadiusEXT (model->params, EXT_FLUX_LIMIT) + EXT_FIT_PADDING;
     60    if (isnan(model->radius)) psAbort (__func__, "error in radius");
    7561
    76 # if (1)
    7762    // redefine the pixels if needed
    7863    bool status = psphotRedefinePixels (source, imdata, model->params->data.F32[2], model->params->data.F32[3], model->radius);
    7964    return status;
    80 
    81 # else
    82 
    83     // check if we need to redefine the pixels
    84     if (model->radius > GAL_OUTER_RADIUS) {
    85         // (re)-allocate image, weight, mask arrays for each peak (square of radius OUTER)
    86         // do I need to save the old pixel and mask data?
    87         psphotDefinePixels (source, imdata, model->params->data.F32[2], model->params->data.F32[3], model->radius);
    88         return true;
    89     }
    90     return false;
    91 # endif
    9265}
  • trunk/psphot/src/psphotReplaceUnfit.c

    r5828 r5993  
    2020    return true;
    2121}
    22 
    23 # if (0)
    24 if (source->mode &  PM_SOURCE_BLEND) continue;
    25 if (source->type == PM_SOURCE_SATURATED) continue;
    26 
    27 if (source->type == PM_SOURCE_DEFECT) {
    28     if (source->mode &  PM_SOURCE_SUBTRACTED) goto addPSF;
    29     continue;
    30 }
    31 
    32 if (source->type == PM_SOURCE_GALAXY) {
    33     if (source->mode & PM_SOURCE_FAIL) goto addPSF;
    34     if (source->mode & PM_SOURCE_POOR) goto addPSF;
    35     continue;
    36 }
    37 
    38 // need to skip the successful fits
    39 if (source->type == PM_SOURCE_STAR) {
    40     if (source->mode & PM_SOURCE_FAIL) goto addPSF;
    41     if (source->mode & PM_SOURCE_POOR) goto addPSF;
    42     continue;
    43 }
    44 # endif
  • trunk/psphot/src/psphotRoughClass.c

    r5986 r5993  
    99    psfClump = pmSourcePSFClump (sources, config);
    1010
    11     // group into STAR, COSMIC, GALAXY, SATURATED, etc.
     11    // group into STAR, COSMIC, EXTENDED, SATURATED, etc.
    1212    pmSourceRoughClass (sources, config, psfClump);
    1313
  • trunk/psphot/src/psphotSourceFits.c

    r5828 r5993  
    4141
    4242
    43 static float GAL_MIN_SN;
    44 static float GAL_MOMENTS_RAD;
    45 static pmModelType modelTypeFLT;
    46 
    47 bool psphotInitLimitsFLT (psMetadata *config, psStats *sky) {
     43static float EXT_MIN_SN;
     44static float EXT_MOMENTS_RAD;
     45static pmModelType modelTypeEXT;
     46
     47bool psphotInitLimitsEXT (psMetadata *config, psStats *sky) {
    4848
    4949    bool status;
    5050
    51     // galaxy model parameters
    52     GAL_MIN_SN       = psMetadataLookupF32 (&status, config, "GAL_MIN_SN");
    53     GAL_MOMENTS_RAD  = psMetadataLookupF32 (&status, config, "GAL_MOMENTS_RADIUS");
    54 
    55     // 'galaxy' model descriptions
    56     char *modelNameFLT = psMetadataLookupPtr (&status, config, "GAL_MODEL");
    57     modelTypeFLT = pmModelSetType (modelNameFLT);
    58     psphotInitRadiusFLT (config, sky, modelTypeFLT);
     51    // extended source model parameters
     52    EXT_MIN_SN       = psMetadataLookupF32 (&status, config, "EXT_MIN_SN");
     53    EXT_MOMENTS_RAD  = psMetadataLookupF32 (&status, config, "EXT_MOMENTS_RADIUS");
     54
     55    // extended source model descriptions
     56    char *modelNameEXT = psMetadataLookupPtr (&status, config, "EXT_MODEL");
     57    modelTypeEXT = pmModelSetType (modelNameEXT);
     58    psphotInitRadiusEXT (config, sky, modelTypeEXT);
    5959
    6060    return true;
     
    6363bool psphotFitBlob (eamReadout *imdata, pmSource *source, psArray *sources) {
    6464
    65     bool okFLT, okDBL;
    66     float chiFLT, chiDBL;
     65    bool okEXT, okDBL;
     66    float chiEXT, chiDBL;
    6767
    6868    // skip the source if we don't think it is extended
     
    7070    if (source->type == PM_SOURCE_DEFECT) return false;
    7171    if (source->type == PM_SOURCE_SATURATED) return false;
    72     if (source->moments->SN < GAL_MIN_SN) return false;
    73 
    74     // recalculate the source moments using the larger galaxy moments radius
    75     if (!pmSourceMoments (source, GAL_MOMENTS_RAD)) return false;
     72    if (source->moments->SN < EXT_MIN_SN) return false;
     73
     74    // recalculate the source moments using the larger extended-source moments radius
     75    if (!pmSourceMoments (source, EXT_MOMENTS_RAD)) return false;
    7676
    7777    psTrace ("psphot.blend", 5, "trying blob...\n");
     
    7979    pmSource *tmpSrc = pmSourceAlloc ();
    8080
    81     pmModel *FLT = psphotFitFLT (imdata, source);
    82     okFLT = psphotEvalFLT (tmpSrc, FLT);
    83     chiFLT = FLT->chisq / FLT->nDOF;
     81    pmModel *EXT = psphotFitEXT (imdata, source);
     82    okEXT = psphotEvalEXT (tmpSrc, EXT);
     83    chiEXT = EXT->chisq / EXT->nDOF;
    8484
    8585    psArray *DBL = psphotFitDBL (imdata, source);
     
    8989    chiDBL = ONE->chisq / ONE->nDOF;
    9090
    91     if (okFLT && okDBL) {
    92         psTrace ("psphot.blend", 5, "blob chisq: %f vs %f\n", chiFLT, chiDBL);
     91    if (okEXT && okDBL) {
     92        psTrace ("psphot.blend", 5, "blob chisq: %f vs %f\n", chiEXT, chiDBL);
    9393        // XXX EAM : a bogus bias: need to examine this better
    94         if (3*chiFLT > chiDBL) goto keepDBL;
    95         goto keepFLT;
    96     }
    97 
    98     if (okFLT && !okDBL) goto keepFLT;
    99     if (!okFLT && okDBL) goto keepDBL;
     94        if (3*chiEXT > chiDBL) goto keepDBL;
     95        goto keepEXT;
     96    }
     97
     98    if (okEXT && !okDBL) goto keepEXT;
     99    if (!okEXT && okDBL) goto keepDBL;
    100100    return false;
    101101
    102 keepFLT:
    103     // sub FLT
    104     pmSourceSubModel (source->pixels, source->mask, FLT, false, false);
    105     psTrace ("psphot.blend", 5, "blob as FLT: %f %f\n", FLT->params->data.F32[2], FLT->params->data.F32[3]);
     102keepEXT:
     103    // sub EXT
     104    pmSourceSubModel (source->pixels, source->mask, EXT, false, false);
     105    psTrace ("psphot.blend", 5, "blob as EXT: %f %f\n", EXT->params->data.F32[2], EXT->params->data.F32[3]);
    106106
    107107    // save new model
    108     source->modelFLT = FLT;
     108    source->modelEXT = EXT;
    109109    source->mode |=  PM_SOURCE_SUBTRACTED;
    110110    source->mode &= ~PM_SOURCE_TEMPSUB;
     
    168168    y = PSF->params->data.F32[3];
    169169
    170     // fit FLT (not PSF) model (set/unset the pixel mask)
     170    // fit EXT (not PSF) model (set/unset the pixel mask)
    171171    psImageKeepCircle (source->mask, x, y, PSF->radius, "OR", PSPHOT_MASK_MARKED);
    172172    pmSourceFitSet (source, modelSet, true);
     
    176176}
    177177
    178 pmModel *psphotFitFLT (eamReadout *imdata, pmSource *source) {
     178pmModel *psphotFitEXT (eamReadout *imdata, pmSource *source) {
    179179
    180180    float x, y;
    181181
    182182    // use the source moments, etc to guess basic model parameters
    183     pmModel *FLT = pmSourceModelGuess (source, modelTypeFLT);
    184 
    185     psphotCheckRadiusFLT (imdata, source, FLT);
    186 
    187     x = FLT->params->data.F32[2];
    188     y = FLT->params->data.F32[3];
    189 
    190     // fit FLT (not PSF) model (set/unset the pixel mask)
    191     psImageKeepCircle (source->mask, x, y, FLT->radius, "OR", PSPHOT_MASK_MARKED);
    192     pmSourceFitModel (source, FLT, false);
    193     psImageKeepCircle (source->mask, x, y, FLT->radius, "AND", ~PSPHOT_MASK_MARKED);
    194 
    195     return (FLT);
     183    pmModel *EXT = pmSourceModelGuess (source, modelTypeEXT);
     184
     185    psphotCheckRadiusEXT (imdata, source, EXT);
     186
     187    x = EXT->params->data.F32[2];
     188    y = EXT->params->data.F32[3];
     189
     190    // fit EXT (not PSF) model (set/unset the pixel mask)
     191    psImageKeepCircle (source->mask, x, y, EXT->radius, "OR", PSPHOT_MASK_MARKED);
     192    pmSourceFitModel (source, EXT, false);
     193    psImageKeepCircle (source->mask, x, y, EXT->radius, "AND", ~PSPHOT_MASK_MARKED);
     194
     195    return (EXT);
    196196}
    197197
  • trunk/psphot/src/psphotTest.c

    r5980 r5993  
    11# include "psphot.h"
    2 bool apResidSetPower (float value);
    32
    43void psExit (int status, char *process, char *format, ...) {
     
    1615int main (int argc, char **argv) {
    1716
    18     // read in a file consisting of:
    19     // x y radius fitmag apmag dmag
     17    psMetadata *row;
     18    psArray *table;
    2019
    21     double fit;
    22     double ap;
     20    psMetadataItem *mdi;
     21    psRegion region = {0,0,0,0};        // a region representing the entire array
    2322
    2423    psphotTestArguments (&argc, argv);
    2524
    26     FILE *f = fopen (argv[1], "r");
    27     if (f == NULL) psExit (2, "test", "no file\n");
     25    psFits *file = psFitsOpen (argv[1], "r");
     26    psMetadata *header = psFitsReadHeader (NULL, file);
     27    psImage *image = psFitsReadImage (NULL, file, region, 0);
     28    psFitsClose (file);
    2829
    29     float power = atof (argv[2]);
    30     apResidSetPower (power);
     30    psMetadataConfigWrite (header, argv[2]);
    3131
    32     psVector *x     = psVectorAlloc (100, PS_TYPE_F64);
    33     psVector *y     = psVectorAlloc (100, PS_TYPE_F64);
    34     psVector *rad   = psVectorAlloc (100, PS_TYPE_F64);
    35     psVector *rflux = psVectorAlloc (100, PS_TYPE_F64);
    36     psVector *apres = psVectorAlloc (100, PS_TYPE_F64);
    37     psVector *dmag  = psVectorAlloc (100, PS_TYPE_F64);
     32    // attempt to write image with NAXIS = 0
     33    mdi = psMetadataLookup (header, "NAXIS");
     34    mdi->data.S32 = 0;
     35    mdi->type = PS_DATA_S32;
     36   
     37    // create a test image
     38    // psImage *tmpimage = psImageAlloc (10, 10, PS_DATA_F32);
    3839
    39     int Npt = 0;
    40     while (fscanf (f, "%lf %lf %lf %lf %lf %lf",
    41                    &x->data.F64[Npt],
    42                    &y->data.F64[Npt],
    43                    &rad->data.F64[Npt],
    44                    &fit, &ap,
    45                    &dmag->data.F64[Npt]) != EOF) {
     40    // create a test table
     41    table = psArrayAlloc (10);
     42    table->n = 0;
    4643
    47         if (fabs(ap-fit) > 0.1) continue;
    48         if (fit > -10) continue;
     44    for (int i = 0; i < 10; i++) {
     45        row = psMetadataAlloc ();
     46        psMetadataAdd (row, PS_LIST_TAIL, "ROW",   PS_DATA_S32,    "", i);
     47        psMetadataAdd (row, PS_LIST_TAIL, "FROW",  PS_TYPE_F32,    "", 0.1*i);
     48        psMetadataAdd (row, PS_LIST_TAIL, "DUMMY", PS_DATA_STRING, "", "test line");
     49   
     50        table->data[i] = row;
     51    }
     52    table->n = 10;
     53   
     54    psMetadata *theader = psMetadataAlloc ();
     55    psMetadataAdd (theader, PS_LIST_HEAD, "EXTNAME", PS_DATA_STRING, "extension name", "SMPFILE");
    4956
    50         apres->data.F64[Npt] = ap-fit;
    51         rflux->data.F64[Npt] = pow(10.0, 0.4*fit);
     57    psFits *fits = psFitsOpen (argv[3], "w");
     58    // psFitsWriteImage (fits, header, tmpimage, 0);
     59    psFitsWriteHeader (header, fits);
     60    psFitsWriteTable (fits, theader, table);
     61    psFitsClose (fits);
    5262
    53         psVectorExtend (x,     100, 1);
    54         psVectorExtend (y,     100, 1);
    55         psVectorExtend (rad,   100, 1);
    56         psVectorExtend (rflux, 100, 1);
    57         psVectorExtend (apres, 100, 1);
    58         psVectorExtend (dmag,  100, 1);
    59         Npt ++;
    60     }
    61     x->n = y->n = rad->n = rflux->n = apres->n = dmag->n = Npt;
    62 
    63     psphotApResidPolyFit (x, y, rad, rflux, apres, dmag);
    64 
     63    psFree (header);
     64    psFree (image);
    6565    exit (0);
    6666}
  • trunk/psphot/src/psphotTestArguments.c

    r5980 r5993  
    88  psArgumentVerbosity (argc, argv);
    99
    10   if (*argc != 3) usage ();
     10  if (*argc != 4) usage ();
    1111
    1212  return;
     
    1515static int usage () {
    1616
    17     fprintf (stderr, "USAGE: psphotModelTest (apresid.dat) (power)\n");
     17    fprintf (stderr, "USAGE: psphotTest (input.fits) (output.hdr) (out.fits)\n");
    1818    exit (2);
    1919}
Note: See TracChangeset for help on using the changeset viewer.