IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Sep 25, 2005, 9:26:46 PM (21 years ago)
Author:
eugene
Message:

fixed TGAUSS for current model implementation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot/src/models/pmModel_TGAUSS.c

    r4954 r5130  
    1212    params->data.F32[6] = Sxy;
    1313    params->data.F32[7] =
     14    params->data.F32[8] =
    1415*****************************************************************************/
    1516
    16 psF64 psModelFunc_TGAUSS(psVector *deriv,
     17/* XXX EAM : we need a way to have user-set values for fix parameters */
     18# define TG_S  2.60
     19# define dTG_S 1.60
     20# define TRF 0.50
     21/* dTG_S is TG_S - 1.0 */
     22
     23psF32 pmModelFunc_TGAUSS(psVector *deriv,
    1724                         const psVector *params,
    1825                         const psVector *x)
     
    2532    psF32 py = PAR[5]*Y;
    2633    psF32 z  = 0.5*PS_SQR(px) + 0.5*PS_SQR(py) + PAR[6]*X*Y;
    27    
    28     psF32 p  = pow(z, 1.2);
    29     psF32 r  = 1.0 / (1 + z + PAR[7]*z*p);
     34    psF32 er = exp(TRF*z);
     35
     36    psF32 r  = 1.0 / (er + PAR[7]*z + pow(z, TG_S));    // (1/R)
    3037    psF32 f  = PAR[1]*r + PAR[0];
    3138
    3239    if (deriv != NULL) {
    33         // note difference from a pure gaussian: q = params->data.F32[1]*r
    34         psF32 t = PAR[1]*r*r;
    35         psF32 q = t*(1 + PAR[7]*2.2*p);
     40        psF32 t = PAR[1]*r*r;                            // df/dR
     41        psF32 q = t*(TRF*er + PAR[7] + TG_S*pow(z, dTG_S));  // (df/dR)(dR/dz)
    3642
    3743        deriv->data.F32[0] = +1.0;
    3844        deriv->data.F32[1] = +r;
    3945        deriv->data.F32[2] = q*(2.0*px*PAR[4] + PAR[6]*Y);
    40         deriv->data.F32[3] = q*(2.0*py*PAR[5] + PAR[6]*X);
     46        deriv->data.F32[3] = q*(2.0*py*PAR[5] + PAR[6]*X);
    4147        deriv->data.F32[4] = -2.0*q*px*X;
    4248        deriv->data.F32[5] = -2.0*q*py*Y;
    4349        deriv->data.F32[6] = -q*X*Y;
    44         deriv->data.F32[7] = -t*z*p;
     50        deriv->data.F32[7] = -t*z;
    4551    }
    4652    return(f);
    4753}
    4854
    49 psF64 psModelFlux_TGAUSS(const psVector *params)
     55bool pmModelLimits_TGAUSS (psVector **beta_lim, psVector **params_min, psVector **params_max) {
     56
     57    *beta_lim   = psVectorAlloc (8, PS_TYPE_F32);
     58    *params_min = psVectorAlloc (8, PS_TYPE_F32);
     59    *params_max = psVectorAlloc (8, PS_TYPE_F32);
     60
     61    beta_lim[0][0].data.F32[0] = 1000;
     62    beta_lim[0][0].data.F32[1] = 10000;
     63    beta_lim[0][0].data.F32[2] = 5;
     64    beta_lim[0][0].data.F32[3] = 5;
     65    beta_lim[0][0].data.F32[4] = 0.5;
     66    beta_lim[0][0].data.F32[5] = 0.5;
     67    beta_lim[0][0].data.F32[6] = 0.5;
     68    beta_lim[0][0].data.F32[7] = 0.5;
     69
     70    params_min[0][0].data.F32[0] = -1000;
     71    params_min[0][0].data.F32[1] = 0;
     72    params_min[0][0].data.F32[2] = -100;
     73    params_min[0][0].data.F32[3] = -100;
     74    params_min[0][0].data.F32[4] = 0.01;
     75    params_min[0][0].data.F32[5] = 0.01;
     76    params_min[0][0].data.F32[6] = -5.0;
     77    params_min[0][0].data.F32[7] = 0.1;
     78
     79    params_max[0][0].data.F32[0] = 1e5;
     80    params_max[0][0].data.F32[1] = 1e6;
     81    params_max[0][0].data.F32[2] = 1e4;  // this should be set by image dimensions!
     82    params_max[0][0].data.F32[3] = 1e4;  // this should be set by image dimensions!
     83    params_max[0][0].data.F32[4] = 2.0;
     84    params_max[0][0].data.F32[5] = 2.0;
     85    params_max[0][0].data.F32[6] = +5.0;
     86    params_max[0][0].data.F32[7] = 10.0;
     87
     88    return (TRUE);
     89}
     90
     91bool pmModelGuess_TGAUSS (pmModel *model, pmSource *source) {
     92
     93    pmMoments *moments = source->moments;
     94    pmPeak    *peak    = source->peak;
     95    psF32     *params  = model->params->data.F32;
     96
     97    params[0] = moments->Sky;
     98    params[1] = moments->Peak - moments->Sky;
     99    params[2] = peak->x;
     100    params[3] = peak->y;
     101    params[4] = 1.2 / moments->Sx;
     102    params[5] = 1.2 / moments->Sy;
     103    params[6] = 0.0;
     104    params[7] = 1.0;
     105    return(true);
     106}
     107
     108psF64 pmModelFlux_TGAUSS(const psVector *params)
    50109{
    51     psF64 A1   = 1 / PS_SQR(params->data.F32[4]);
    52     psF64 A2   = 1 / PS_SQR(params->data.F32[5]);
    53     psF64 A3   = params->data.F32[6];
    54     psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - PS_SQR(A3));
     110    float f, norm, z;
     111
     112    psF32 *PAR = params->data.F32;
     113
     114    psF64 A1   = PS_SQR(PAR[4]);
     115    psF64 A2   = PS_SQR(PAR[5]);
     116    psF64 A3   = PS_SQR(PAR[6]);
     117    psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - A3);
    55118    // Area is equivalent to 2 pi sigma^2
    56119
    57     psF64 Flux = params->data.F32[1] * Area;
     120    // the area needs to be multiplied by the integral of f(z)
     121    norm = 0.0;
     122    for (z = 0.005; z < 50; z += 0.01) {
     123        psF32 er = exp(TRF*z);
     124        f = 1.0 / (er + PAR[7]*z + pow(z, TG_S));
     125        norm += f;
     126    }
     127    norm *= 0.01;
     128   
     129    psF64 Flux = PAR[1] * Area * norm;
    58130
    59131    return(Flux);
     
    62134// define this function so it never returns Inf or NaN
    63135// return the radius which yields the requested flux
    64 psF64 psModelRadius_TGAUSS  (const psVector *params, psF64 flux)
     136psF64 pmModelRadius_TGAUSS  (const psVector *params, psF64 flux)
    65137{
     138    psF64 z, f;
     139    psF32 *PAR = params->data.F32;
     140
    66141    if (flux <= 0) return (1.0);
    67     if (params->data.F32[1] <= 0) return (1.0);
    68     if (flux >= params->data.F32[1]) return (1.0);
    69 
    70     psF64 sigma  = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]);
    71     psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux));
     142    if (PAR[1] <= 0) return (1.0);
     143    if (flux >= PAR[1]) return (1.0);
     144
     145    // if Sx == Sy, sigma = Sx == Sy
     146    psF64 sigma = hypot (1.0 / PAR[4], 1.0 / PAR[5]) / sqrt(2.0);
     147    psF64 dz = 1.0 / (2.0 * sigma*sigma);
     148    psF64 limit = flux / PAR[1];
     149
     150    // we can do this much better with intelligent choices here
     151    for (z = 0.0; z < 20.0; z += dz) {
     152        psF32 er = exp(TRF*z);
     153        f = 1.0 / (er + PAR[7]*z + pow(z, TG_S));
     154        if (f < limit) break;
     155    }
     156    psF64 radius = sigma * sqrt (2.0 * z);
    72157    if (isnan(radius)) {
    73158      fprintf (stderr, "error in code\n");
     
    76161}
    77162
    78 bool psModelGuess_TGAUSS (psModel *model, psSource *source) {
    79 
    80     psVector *params = model->params;
    81 
    82     params->data.F32[0] = source->moments->Sky;
    83     params->data.F32[1] = source->peak->counts - source->moments->Sky;
    84     params->data.F32[2] = source->moments->x;
    85     params->data.F32[3] = source->moments->y;
    86     params->data.F32[4] = 1.0/source->moments->Sx;
    87     params->data.F32[5] = 1.0/source->moments->Sy;
    88     // params->data.F32[6] = source->moments->Sxy;
    89     params->data.F32[6] = 0.0;
    90     params->data.F32[7] = 5.0;
    91     return(true);
    92 }
    93 
    94 bool psModelFromPSF_TGAUSS (psModel *modelPSF, psModel *modelFLT, pmPSF *psf) {
     163bool pmModelFromPSF_TGAUSS (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf) {
    95164
    96165    psF32 *out = modelPSF->params->data.F32;
     
    104173    for (int i = 4; i < 8; i++) {
    105174        psPolynomial2D *poly = psf->params->data[i-4];
    106         out[i] = Polynomial2DEval (poly, out[2], out[3]);
     175        out[i] = Polynomial2DEval_EAM (poly, out[2], out[3]);
    107176    }
    108177    return(true);
    109178}
     179
     180bool pmModelFitStatus_TGAUSS (pmModel *model) {
     181
     182    psF32 dP;
     183    bool  status;
     184
     185    psF32 *PAR  = model->params->data.F32;
     186    psF32 *dPAR = model->dparams->data.F32;
     187
     188    dP = 0;
     189    dP += PS_SQR(dPAR[4] / PAR[4]);
     190    dP += PS_SQR(dPAR[5] / PAR[5]);
     191    dP = sqrt (dP);
     192
     193    status = true;
     194    status &= (dP < 0.5);
     195    status &= (PAR[1] > 0);
     196    status &= ((dPAR[1]/PAR[1]) < 0.5);
     197
     198    if (status) return true;
     199    return false;
     200}
Note: See TracChangeset for help on using the changeset viewer.