IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 31, 2013, 5:55:16 AM (13 years ago)
Author:
eugene
Message:

merge changes from EAM branch (pmModel_CentralPixel functions for sersic-like model support; add interactive mode to PCM LMM fitting; harder PCM LMM damping (nu scaled by 3 not 2); add EXT_AND SKY and SHAPE fitting modes, include sky in INDEX-only fits; ifdefs for trace-only values; allow positions to go to 100,000; major re-work of central pixel & flux for sersic-like models; add pmPCMMakeModel function to generate the flux for an arbitrary model

Location:
trunk/psModules
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules

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

    r35768 r36085  
    4242#include "pmPCMdata.h"
    4343
     44# define SAVE_IMAGES 0
     45# if (SAVE_IMAGES)
     46int psphotSaveImage (psMetadata *header, psImage *image, char *filename);
     47# endif
     48
    4449# define FACILITY "psModules.objects"
    4550
     
    9196    psF32 lambda = 0.001;
    9297    psF32 dLinear = 0.0;
    93     psF32 nu = 2.0;
     98    psF32 nu = 3.0;
    9499
    95100# if (USE_FFT && PRE_CONVOLVE)
     
    130135        }
    131136
     137        char key[10]; // used for interactive responses
     138        bool testValue = false;
     139
    132140        // set a new guess for Alpha, Beta, Params
    133141        if (!psMinLM_GuessABP(Alpha, Beta, Params, alpha, beta, params, paramMask, checkLimits, lambda, &dLinear)) {
     142            if (min->isInteractive) {
     143                fprintf (stdout, "guess failed (singular matrix or NaN values), continue? [Y,n] ");
     144                if (!fgets(key, 8, stdin)) {
     145                    psWarning("Unable to read option");
     146                }
     147                switch (key[0]) {
     148                  case 'n':
     149                  case 'N':
     150                    done = true;
     151                    break;
     152                  case 'y':
     153                  case 'Y':
     154                  case '\n':
     155                    lambda *= 10.0;
     156                    continue;
     157                  default:
     158                    lambda *= 10.0;
     159                    continue;
     160                }
     161                if (done) break;
     162            }
    134163            min->iter ++;
    135164            if (min->iter >=  min->maxIter) break;
     
    138167        }
    139168
     169        if (min->isInteractive) {
     170            p_psVectorPrint(psTraceGetDestination(), Params, "current parameters: ");
     171            fprintf (stdout, "last chisq : %f\n", min->value);
     172            bool getOptions = true;
     173            while (getOptions) {
     174                fprintf (stdout, "options: (m)odify, (g)o, (q)uit: ");
     175                if (!fgets(key, 8, stdin)) {
     176                    psWarning("Unable to read option");
     177                }
     178                switch (key[0]) {
     179                  case 'm':
     180                  case 'M':
     181                    testValue = TRUE;
     182                    fprintf (stdout, "enter (Npar) (value): ");
     183                    int Npar = 0;
     184                    float value= 0;
     185                    int Nscan = fscanf (stdin, "%d %f", &Npar, &value);
     186                    if (Nscan != 2) {
     187                      fprintf (stderr, "scan failure\n");
     188                    }
     189                    Params->data.F32[Npar] = value;
     190                    break;
     191                  case 'g':
     192                  case 'G':
     193                  case '\n':
     194                    getOptions = false;
     195                    break;
     196                  default:
     197                    done = true;
     198                    break;
     199                }
     200                fprintf (stderr, "foo\n");
     201            }
     202            if (done) break;
     203        }
     204           
    140205        // dump some useful info if trace is defined
    141206        if (psTraceGetLevel(FACILITY) >= 6) {
     
    202267        // XXX : Madsen gives suggestion for better use of rho
    203268        // rho is positive if the new chisq is smaller
    204         if (rho >= -1e-6) {
     269        if (testValue || (rho >= -1e-6)) {
    205270            min->value = Chisq;
    206271            alpha  = psImageCopy(alpha, Alpha, PS_TYPE_F32);
     
    215280          case 0:
    216281            if (rho >= -1e-6) {
    217                 lambda *= 0.25;
     282                lambda *= 0.1;
    218283            } else {
    219284                lambda *= 10.0;
     
    234299            if (rho > 0.0) {
    235300                lambda *= PS_MAX(0.33, (1.0 - pow(2.0*rho - 1.0, 3.0)));
    236                 nu = 2.0;
     301                nu = 3.0;
    237302            } else {
    238303                lambda *= nu;
    239                 nu *= 2.0;
     304                nu *= 3.0;
    240305            }
    241306            break;
     
    474539    // XXX TEST : SAVE IMAGES
    475540# if (SAVE_IMAGES)
    476     psphotSaveImage (NULL, pcm->psf->image, "psf.fits");
    477     psphotSaveImage (NULL, pcm->modelFlux, "model.fits");
    478     psphotSaveImage (NULL, pcm->modelConvFlux, "modelConv.fits");
    479     psphotSaveImage (NULL, source->pixels, "obj.fits");
    480     psphotSaveImage (NULL, source->maskObj, "mask.fits");
    481     psphotSaveImage (NULL, source->variance, "variance.fits");
     541    static int Npass = 0;
     542    char name[128];
     543    snprintf (name, 128, "psf.%03d.fits", Npass); psphotSaveImage (NULL, pcm->psf->image, name);
     544    snprintf (name, 128, "mod.%03d.fits", Npass); psphotSaveImage (NULL, pcm->modelFlux, name);
     545    snprintf (name, 128, "cnv.%03d.fits", Npass); psphotSaveImage (NULL, pcm->modelConvFlux, name);
     546    snprintf (name, 128, "obj.%03d.fits", Npass); psphotSaveImage (NULL, source->pixels, name);
     547    snprintf (name, 128, "msk.%03d.fits", Npass); psphotSaveImage (NULL, source->maskObj, name);
     548    snprintf (name, 128, "var.%03d.fits", Npass); psphotSaveImage (NULL, source->variance, name);
     549    for (int n = 0; n < pcm->dmodelsFlux->n; n++) {
     550        psImage *dmodelConv = pcm->dmodelsConvFlux->data[n];
     551        if (!dmodelConv) continue;
     552        snprintf (name, 128, "dpar.%01d.%03d.fits", n, Npass); psphotSaveImage (NULL, dmodelConv, name);
     553    }
     554    Npass ++;
    482555# endif
    483556
Note: See TracChangeset for help on using the changeset viewer.