IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 3, 2013, 2:37:22 PM (13 years ago)
Author:
eugene
Message:

deprecate KiiOpen,KiiClose (now KapaOpen,etc); major rework of psEllipse translations : use common functions pmModelAxesToParams and pmModelParamsToAxes ; use new convergence method in pmPCM_MinimizeChisq; add convergence crerition options to psMinimization; threaded versions of pmPSFtryFitEXT and pmPSFtryFitPSF

Location:
trunk/psModules
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules

  • trunk/psModules/src/objects/pmPSF.c

    r35560 r35768  
    249249// Mxy = SXY * (SXX^-4 + SYY^-4 - 2 SXY ^2)
    250250
     251// XXX deprecated
    251252// input: model->param, output: psf->param[PM_PAR_SXY]
    252 double pmPSF_SXYfromModel (psF32 *modelPar)
    253 {
    254     PS_ASSERT_PTR_NON_NULL(modelPar, NAN);
    255 
    256     double SXX = modelPar[PM_PAR_SXX];
    257     double SYY = modelPar[PM_PAR_SYY];
    258     double SXY = modelPar[PM_PAR_SXY];
    259 
    260     double par = SXY / PS_SQR(1.0 / PS_SQR(SXX) + 1.0 / PS_SQR(SYY));
    261     return (par);
    262 }
    263 
     253// XXX double pmPSF_SXYfromModel (psF32 *modelPar)
     254// XXX {
     255// XXX     PS_ASSERT_PTR_NON_NULL(modelPar, NAN);
     256// XXX
     257// XXX     double SXX = modelPar[PM_PAR_SXX];
     258// XXX     double SYY = modelPar[PM_PAR_SYY];
     259// XXX     double SXY = modelPar[PM_PAR_SXY];
     260// XXX
     261// XXX     double par = SXY / PS_SQR(1.0 / PS_SQR(SXX) + 1.0 / PS_SQR(SYY));
     262// XXX     return (par);
     263// XXX }
     264
     265// XXX deprecated
    264266// input: fitted psf->param, output: model->param[PM_PAR_SXY]
    265 double pmPSF_SXYtoModel (psF32 *fittedPar)
    266 {
    267     PS_ASSERT_PTR_NON_NULL(fittedPar, NAN);
    268 
    269     double SXX = fittedPar[PM_PAR_SXX];
    270     double SYY = fittedPar[PM_PAR_SYY];
    271     double fit = fittedPar[PM_PAR_SXY];
    272 
    273     double SXY = fit * PS_SQR(1.0 / PS_SQR(SXX) + 1.0 / PS_SQR(SYY));
    274 
    275     assert (!isnan(SXY));
    276 
    277     return SXY;
    278 }
    279 
    280 // New Concept: the PSF modelling function fits the polarization terms e0, e1, e2:
    281 
    282 // convert the parameters used in the fitted source model
    283 // to the parameters used in the 2D PSF model
    284 // XXX this function may be invalid for SERSIC, DEV, EXP models (SQRT2 not used?)
    285 bool pmPSF_FitToModel (psF32 *fittedPar, float minMinorAxis)
     267// XXX double pmPSF_SXYtoModel (psF32 *fittedPar)
     268// XXX {
     269// XXX     PS_ASSERT_PTR_NON_NULL(fittedPar, NAN);
     270// XXX
     271// XXX     double SXX = fittedPar[PM_PAR_SXX];
     272// XXX     double SYY = fittedPar[PM_PAR_SYY];
     273// XXX     double fit = fittedPar[PM_PAR_SXY];
     274// XXX
     275// XXX     double SXY = fit * PS_SQR(1.0 / PS_SQR(SXX) + 1.0 / PS_SQR(SYY));
     276// XXX
     277// XXX     assert (!isnan(SXY));
     278// XXX
     279// XXX     return SXY;
     280// XXX }
     281
     282// The PSF modelling function fits the polarization terms e0, e1, e2:
     283
     284// the FIT is the 2D representation of the shape using polarization parameters for the elliptical contour
     285// the MODEL is the realized psf model for a given location
     286
     287// convert the parameters (in situ) used in the fitted source model to the parameters used in
     288// the 2D PSF model
     289bool pmPSF_FitToModel (psF32 *fittedPar, float minMinorAxis, bool useReff)
    286290{
    287291    PS_ASSERT_PTR_NON_NULL(fittedPar, false);
     
    298302        return false;
    299303    }
    300     psEllipseShape shape = psEllipseAxesToShape (axes);
    301 
    302     fittedPar[PM_PAR_SXX] = shape.sx * M_SQRT2;
    303     fittedPar[PM_PAR_SYY] = shape.sy * M_SQRT2;
    304     fittedPar[PM_PAR_SXY] = shape.sxy;
    305 
     304
     305    pmModelAxesToParams (&fittedPar[PM_PAR_SXX], &fittedPar[PM_PAR_SXY], &fittedPar[PM_PAR_SYY], axes, useReff);
    306306    return true;
    307307}
    308308
    309 // convert the PSF parameters used in the 2D PSF model fit into the
    310 // parameters used in the source model
    311 // XXX this function may be invalid for SERSIC, DEV, EXP models (SQRT2 not used?)
    312 psEllipsePol pmPSF_ModelToFit (psF32 *modelPar)
     309// convert the parameters (in situ) used in the 2D PSF model fit into the parameters used in
     310// the source model
     311psEllipsePol pmPSF_ModelToFit (psF32 *modelPar, bool useReff)
    313312{
    314313    // must assert non-NULL input parameter
     
    319318    PS_ASSERT_PTR_NON_NULL(modelPar, pol);
    320319
    321     psEllipseShape shape;
    322 
    323     shape.sx  = modelPar[PM_PAR_SXX] / M_SQRT2;
    324     shape.sy  = modelPar[PM_PAR_SYY] / M_SQRT2;
    325     shape.sxy = modelPar[PM_PAR_SXY];
    326 
    327     pol = psEllipseShapeToPol (shape);
     320    psEllipseAxes axes;
     321    pmModelParamsToAxes (&axes, modelPar[PM_PAR_SXX], modelPar[PM_PAR_SXY], modelPar[PM_PAR_SYY], useReff);
     322
     323    pol = psEllipseAxesToPol (axes);
    328324
    329325    return pol;
     
    332328// convert the parameters used in the fitted source model to the psEllipseAxes representation
    333329// (major,minor,theta)
    334 psEllipseAxes pmPSF_ModelToAxes (psF32 *modelPar, double maxAR, pmModelType type)
    335 {
    336     psEllipseShape shape;
     330psEllipseAxes pmPSF_ModelToAxes (psF32 *modelPar, pmModelType type)
     331{
    337332    psEllipseAxes axes;
    338333    axes.major = NAN;
    339334    axes.minor = NAN;
    340335    axes.theta = NAN;
    341     //   XXX: must assert non-NULL input parameter
     336
    342337    PS_ASSERT_PTR_NON_NULL(modelPar, axes);
    343338
    344     bool useReff = false;
    345     useReff |= (type == pmModelClassGetType ("PS_MODEL_SERSIC"));
    346     useReff |= (type == pmModelClassGetType ("PS_MODEL_DEV"));
    347     useReff |= (type == pmModelClassGetType ("PS_MODEL_EXP"));
    348 
    349     if (useReff) {
    350         shape.sx  = modelPar[PM_PAR_SXX];
    351         shape.sy  = modelPar[PM_PAR_SYY];
    352         shape.sxy = modelPar[PM_PAR_SXY] / 2.0;
    353         // XXX I *think* dividing by 2.0 is the right direction, but this
    354         // needs to be checked with a real test
    355     } else {
    356         shape.sx  = modelPar[PM_PAR_SXX] / M_SQRT2;
    357         shape.sy  = modelPar[PM_PAR_SYY] / M_SQRT2;
    358         shape.sxy = modelPar[PM_PAR_SXY];
    359     }
    360 
    361     if ((shape.sx == 0) || (shape.sy == 0)) {
    362         axes.major = 0.0;
    363         axes.minor = 0.0;
    364         axes.theta = 0.0;
    365     } else {
    366         // XXX this is not really consistent with the model fit range above
    367         axes = psEllipseShapeToAxes (shape, maxAR);
    368     }
    369 
     339    bool useReff = pmModelUseReff (type);
     340    pmModelParamsToAxes (&axes, modelPar[PM_PAR_SXX], modelPar[PM_PAR_SXY], modelPar[PM_PAR_SYY], useReff);
    370341    return axes;
    371342}
     
    377348    PS_ASSERT_PTR_NON_NULL(modelPar, false);
    378349
     350    modelPar[PM_PAR_SXX] = 0.0;
     351    modelPar[PM_PAR_SYY] = 0.0;
     352    modelPar[PM_PAR_SXY] = 0.0;
     353   
    379354    if ((axes.major <= 0) || (axes.minor <= 0)) {
    380         modelPar[PM_PAR_SXX] = 0.0;
    381         modelPar[PM_PAR_SYY] = 0.0;
    382         modelPar[PM_PAR_SXY] = 0.0;
    383355        return true;
    384356    }
    385 
    386     psEllipseShape shape = psEllipseAxesToShape (axes);
    387 
    388     bool useReff = false;
    389     useReff |= ( type == pmModelClassGetType ("PS_MODEL_SERSIC"));
    390     useReff |= ( type == pmModelClassGetType ("PS_MODEL_DEV"));
    391     useReff |= ( type == pmModelClassGetType ("PS_MODEL_EXP"));
    392 
    393     if (useReff) {
    394         modelPar[PM_PAR_SXX] = shape.sx;
    395         modelPar[PM_PAR_SYY] = shape.sy;
    396         modelPar[PM_PAR_SXY] = shape.sxy * 2.0; // XXX NEED factor of 2 here for correct angle conversion
    397     } else {
    398         modelPar[PM_PAR_SXX] = shape.sx * M_SQRT2;
    399         modelPar[PM_PAR_SYY] = shape.sy * M_SQRT2;
    400         modelPar[PM_PAR_SXY] = shape.sxy;
    401     }
     357   
     358    bool useReff = pmModelUseReff (type);
     359    pmModelAxesToParams (&modelPar[PM_PAR_SXX], &modelPar[PM_PAR_SXY], &modelPar[PM_PAR_SYY], axes, useReff);
    402360    return true;
    403361}
     
    423381    par->data.F32[PM_PAR_SXY] = sxy;
    424382
    425     psEllipsePol pol = pmPSF_ModelToFit(par->data.F32);
     383    bool useReff = pmModelUseReff (options->type);
     384    psEllipsePol pol = pmPSF_ModelToFit(par->data.F32, useReff);
    426385
    427386    pmTrend2D *trend = NULL;
Note: See TracChangeset for help on using the changeset viewer.