IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 2, 2009, 12:04:51 PM (16 years ago)
Author:
Paul Price
Message:

Merging Gene's work on adding a window function to the stamps. I'd been thinking about something like this for a while, so glad someone's done it. It's got visualisation turned on though.

Location:
branches/pap/psModules/src/imcombine
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/pap/psModules/src/imcombine

  • branches/pap/psModules/src/imcombine/pmSubtractionEquation.c

    r26035 r26321  
    1818
    1919#define USE_WEIGHT                      // Include weight (1/variance) in equation?
     20#define USE_WINDOW                      // Include weight (1/variance) in equation?
    2021
    2122
     
    3031                                  const psKernel *reference, // Reference image (convolution source)
    3132                                  const psKernel *weight,  // Weight image
     33                                  const psKernel *window,  // Window image
    3234                                  const psArray *convolutions,         // Convolutions for each kernel
    3335                                  const pmSubtractionKernels *kernels, // Kernels
     
    7678#ifdef USE_WEIGHT
    7779                    cc *= weight->kernel[y][x];
     80#endif
     81#ifdef USE_WINDOW
     82                    if (window) {
     83                        cc *= window->kernel[y][x];
     84                    }
    7885#endif
    7986                    sumCC += cc;
     
    107114                rc *= wtVal;
    108115                c *= wtVal;
     116#endif
     117#ifdef USE_WINDOW
     118                if (window) {
     119                    float winVal = window->kernel[y][x];
     120                    ic *= winVal;
     121                    rc *= winVal;
     122                    c  *= winVal;
     123                }
    109124#endif
    110125                sumIC += ic;
     
    144159            ref *= wtVal;
    145160            one *= wtVal;
     161#endif
     162#ifdef USE_WINDOW
     163            if (window) {
     164                float  winVal = window->kernel[y][x];
     165                rr      *= winVal;
     166                ir      *= winVal;
     167                in      *= winVal;
     168                ref *= winVal;
     169                one *= winVal;
     170            }
    146171#endif
    147172            sumRR += rr;
     
    603628#endif
    604629
     630    // XXX visualize the set of convolved stamps
     631
    605632    psImage *polyValues = p_pmSubtractionPolynomial(NULL, spatialOrder,
    606633                                                    stamp->xNorm, stamp->yNorm); // Polynomial terms
     
    620647      case PM_SUBTRACTION_MODE_1:
    621648        status = calculateMatrixVector(stamp->matrix1, stamp->vector1, stamp->image2, stamp->image1,
    622                                        stamp->weight, stamp->convolutions1, kernels, polyValues,
    623                                       footprint);
     649                                       stamp->weight, stamps->window, stamp->convolutions1, kernels,
     650                                       polyValues, footprint);
    624651        break;
    625652      case PM_SUBTRACTION_MODE_2:
    626653        status = calculateMatrixVector(stamp->matrix1, stamp->vector1, stamp->image1, stamp->image2,
    627                                        stamp->weight, stamp->convolutions2, kernels, polyValues,
    628                                       footprint);
     654                                       stamp->weight, stamps->window, stamp->convolutions2, kernels,
     655                                       polyValues, footprint);
    629656        break;
    630657      case PM_SUBTRACTION_MODE_DUAL:
     
    11471174    double devNorm = 1.0 / (double)numPixels; // Normalisation for deviations
    11481175    int numKernels = kernels->num;      // Number of kernels
     1176    double norm = NAN;
    11491177
    11501178    psImage *polyValues = NULL;         // Polynomial values
    11511179    psKernel *residual = psKernelAlloc(-footprint, footprint, -footprint, footprint); // Residual image
     1180
     1181    // set up holding images for the visualization
     1182    pmSubtractionVisualShowFitInit (stamps);
    11521183
    11531184    for (int i = 0; i < stamps->num; i++) {
     
    11601191        // Calculate coefficients of the kernel basis functions
    11611192        polyValues = p_pmSubtractionPolynomial(polyValues, kernels->spatialOrder, stamp->xNorm, stamp->yNorm);
    1162         double norm = p_pmSubtractionSolutionNorm(kernels); // Normalisation
     1193        norm = p_pmSubtractionSolutionNorm(kernels); // Normalisation
    11631194        double background = p_pmSubtractionSolutionBackground(kernels, polyValues);// Difference in background
    11641195
     
    12141245                }
    12151246            }
     1247
     1248            // XXX visualize the target, source, convolution and residual
     1249            pmSubtractionVisualShowFitAddStamp (target, source, residual, background, norm, i);
     1250
    12161251            for (int y = - footprint; y <= footprint; y++) {
    12171252                for (int x = - footprint; x <= footprint; x++) {
     
    13001335        }
    13011336#endif
    1302 
     1337   
    13031338    }
    13041339    psFree(residual);
    13051340    psFree(polyValues);
    13061341
     1342    psLogMsg("psModules.imcombine", PS_LOG_INFO, "normalization: %f", norm);
     1343    pmSubtractionVisualShowFit();
     1344    pmSubtractionVisualPlotFit(kernels);
     1345
    13071346    return deviations;
    13081347}
  • branches/pap/psModules/src/imcombine/pmSubtractionKernels.c

    r26156 r26321  
    111111
    112112pmSubtractionKernels *p_pmSubtractionKernelsRawISIS(int size, int spatialOrder,
    113                                                     const psVector *fwhms, const psVector *orders,
     113                                                    const psVector *fwhmsIN, const psVector *ordersIN,
    114114                                                    float penalty, pmSubtractionMode mode)
    115115{
    116     PS_ASSERT_VECTOR_NON_NULL(fwhms, NULL);
    117     PS_ASSERT_VECTOR_TYPE(fwhms, PS_TYPE_F32, NULL);
    118     PS_ASSERT_VECTOR_NON_NULL(orders, NULL);
    119     PS_ASSERT_VECTOR_TYPE(orders, PS_TYPE_S32, NULL);
    120     PS_ASSERT_VECTORS_SIZE_EQUAL(fwhms, orders, NULL);
     116    PS_ASSERT_VECTOR_NON_NULL(fwhmsIN, NULL);
     117    PS_ASSERT_VECTOR_TYPE(fwhmsIN, PS_TYPE_F32, NULL);
     118    PS_ASSERT_VECTOR_NON_NULL(ordersIN, NULL);
     119    PS_ASSERT_VECTOR_TYPE(ordersIN, PS_TYPE_S32, NULL);
     120    PS_ASSERT_VECTORS_SIZE_EQUAL(fwhmsIN, ordersIN, NULL);
    121121    PS_ASSERT_INT_POSITIVE(size, NULL);
    122122    PS_ASSERT_INT_NONNEGATIVE(spatialOrder, NULL);
     123
     124    // check the requested fwhm values: any values <= 0.0 should be dropped
     125    psVector *fwhms  = psVectorAllocEmpty (fwhmsIN->n, PS_TYPE_F32);
     126    psVector *orders = psVectorAllocEmpty (ordersIN->n, PS_TYPE_S32);
     127    for (int i = 0; i < fwhmsIN->n; i++) {
     128        if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue;
     129        psVectorAppend(fwhms, fwhmsIN->data.F32[i]);
     130        psVectorAppend(orders, ordersIN->data.S32[i]);
     131    }
    123132
    124133    int numGaussians = fwhms->n;       // Number of Gaussians
  • branches/pap/psModules/src/imcombine/pmSubtractionMatch.c

    r26035 r26321  
    483483            }
    484484
     485
     486            // generate the window function from the set of stamps
     487            if (!pmSubtractionStampsGetWindow(stamps, size)) {
     488                goto MATCH_ERROR;
     489            }
    485490
    486491            // Define kernel basis functions
     
    550555                }
    551556
     557                // generate the window function from the set of stamps
     558                if (!pmSubtractionStampsGetWindow(stamps, size)) {
     559                    goto MATCH_ERROR;
     560                }
     561
    552562                psTrace("psModules.imcombine", 3, "Calculating equation...\n");
    553563                if (!pmSubtractionCalculateEquation(stamps, kernels)) {
     
    587597            }
    588598
     599            // if we hit the max number of iterations and we have rejected stamps, re-solve
    589600            if (numRejected > 0) {
    590601                psTrace("psModules.imcombine", 3, "Solving equation...\n");
  • branches/pap/psModules/src/imcombine/pmSubtractionStamps.c

    r26046 r26321  
    4646    psFree(list->y);
    4747    psFree(list->flux);
     48    psFree(list->window);
    4849}
    4950
     
    220221    list->y = NULL;
    221222    list->flux = NULL;
     223    list->window = NULL;
    222224    list->footprint = footprint;
    223225    list->sysErr = sysErr;
     
    239241    out->y = NULL;
    240242    out->flux = NULL;
     243    out->window = psMemIncrRefCounter(in->window);
    241244    out->footprint = in->footprint;
    242245
     
    606609}
    607610
     611
     612bool pmSubtractionStampsGetWindow(pmSubtractionStampList *stamps, int kernelSize)
     613{
     614    PM_ASSERT_SUBTRACTION_STAMP_LIST_NON_NULL(stamps, false);
     615    PS_ASSERT_INT_NONNEGATIVE(kernelSize, false);
     616
     617    int size = kernelSize + stamps->footprint; // Size of postage stamps
     618
     619    psFree (stamps->window);
     620    stamps->window = psKernelAlloc(-size, size, -size, size);
     621    psImageInit(stamps->window->image, 0.0);
     622
     623    // generate normalizations for each stamp
     624    psVector *norm1 = psVectorAlloc(stamps->num, PS_TYPE_F32);
     625    psVector *norm2 = psVectorAlloc(stamps->num, PS_TYPE_F32);
     626    for (int i = 0; i < stamps->num; i++) {
     627        pmSubtractionStamp *stamp = stamps->stamps->data[i]; // Stamp of interest
     628        if (!stamp) continue;
     629        if (!stamp->image1) continue;
     630        if (!stamp->image2) continue;
     631
     632        float sum1 = 0.0;
     633        float sum2 = 0.0;
     634        for (int y = -size; y <= size; y++) {
     635            for (int x = -size; x <= size; x++) {
     636                sum1 += stamp->image1->kernel[y][x];
     637                sum2 += stamp->image2->kernel[y][x];
     638            }
     639        }
     640        norm1->data.F32[i] = sum1;
     641        norm2->data.F32[i] = sum2;
     642    }
     643
     644    // storage vector for flux data
     645    psStats *stats = psStatsAlloc (PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV);
     646    psVector *flux = psVectorAllocEmpty(2*stamps->num, PS_TYPE_F32);
     647
     648    // generate the window pixels
     649    for (int y = -size; y <= size; y++) {
     650        for (int x = -size; x <= size; x++) {
     651
     652            flux->n = 0;
     653            for (int i = 0; i < stamps->num; i++) {
     654                pmSubtractionStamp *stamp = stamps->stamps->data[i]; // Stamp of interest
     655                if (!stamp) continue;
     656                if (!stamp->image1) continue;
     657                if (!stamp->image2) continue;
     658               
     659                psVectorAppend (flux, stamp->image1->kernel[y][x] / norm1->data.F32[i]);
     660                psVectorAppend (flux, stamp->image2->kernel[y][x] / norm2->data.F32[i]);
     661            }
     662
     663            psStatsInit (stats);
     664            if (!psVectorStats (stats, flux, NULL, NULL, 0)) {
     665                psAbort ("failed to generate stats");
     666            }
     667            stamps->window->kernel[y][x] = stats->robustMedian;
     668        }
     669    }
     670
     671    // XXX TESTING:
     672    {
     673        psFits *fits = psFitsOpen ("window.fits", "w");
     674        psFitsWriteImage (fits, NULL, stamps->window->image, 0, NULL);
     675        psFitsClose (fits);
     676    }
     677
     678    psFree (stats);
     679    psFree (flux);
     680    psFree (norm1);
     681    psFree (norm2);
     682    return true;
     683}
    608684
    609685bool pmSubtractionStampsExtract(pmSubtractionStampList *stamps, psImage *image1, psImage *image2,
  • branches/pap/psModules/src/imcombine/pmSubtractionStamps.h

    r26035 r26321  
    2424    psArray *flux;                      ///< Fluxes for possible stamps (or NULL)
    2525    int footprint;                      ///< Half-size of stamps
     26    psKernel *window;                   ///< window function generated from ensemble of stamps
    2627    float sysErr;                       ///< Systematic error
    2728} pmSubtractionStampList;
     
    136137    );
    137138
     139bool pmSubtractionStampsGetWindow(pmSubtractionStampList *stamps, int kernelSize);
     140
    138141/// Extract stamps from the images
    139142bool pmSubtractionStampsExtract(pmSubtractionStampList *stamps, ///< Stamps
  • branches/pap/psModules/src/imcombine/pmSubtractionVisual.c

    r23487 r26321  
    1616
    1717#include "pmKapaPlots.h"
     18#include "pmSubtraction.h"
    1819#include "pmSubtractionStamps.h"
     20#include "pmSubtractionEquation.h"
    1921
    2022#include "pmVisual.h"
     
    3234static bool plotLeastSquares     = true;
    3335static bool plotImage            = true;
     36
    3437// variables to store plotting window indices
    35 static int kapa  = -1;
     38static int kapa1 = -1;
    3639static int kapa2 = -1;
     40static int kapa3 = -1;
    3741
    3842/** function prototypes*/
     
    4650bool pmSubtractionVisualClose(void)
    4751{
    48     if(kapa != -1)
    49         KiiClose(kapa);
    50     if(kapa2 != -1)
    51         KiiClose(kapa2);
     52    if(kapa1 != -1) KiiClose(kapa1);
     53    if(kapa2 != -1) KiiClose(kapa2);
    5254    return true;
    5355}
     
    6062bool pmSubtractionVisualPlotConvKernels(psImage *convKernels) {
    6163    if (!pmVisualIsVisual() || !plotConvKernels) return true;
    62     if (!pmVisualInitWindow(&kapa, "ppSub:Images")) {
    63         return false;
    64     }
    65     pmVisualScaleImage(kapa, convKernels, "Convolution_Kernels", 0, true);
     64    if (!pmVisualInitWindow(&kapa1, "ppSub:Images")) {
     65        return false;
     66    }
     67    pmVisualScaleImage(kapa1, convKernels, "Convolution_Kernels", 0, true);
    6668    pmVisualAskUser(&plotConvKernels);
    6769    return true;
     
    7476bool pmSubtractionVisualPlotStamps(pmSubtractionStampList *stamps, pmReadout *ro) {
    7577    if (!pmVisualIsVisual() || !plotStamps) return true;
    76     if (!pmVisualInitWindow (&kapa, "ppSub:Images")) {
     78    if (!pmVisualInitWindow (&kapa1, "ppSub:Images")) {
    7779        return false;
    7880    }
     
    134136        stampNum++;
    135137    }
    136     pmVisualScaleImage(kapa, canvas, "Subtraction_Stamps", 0, true);
     138    pmVisualScaleImage(kapa1, canvas, "Subtraction_Stamps", 0, true);
    137139
    138140    pmVisualAskUser(&plotStamps);
     
    144146
    145147    if (!pmVisualIsVisual() || !plotLeastSquares) return true;
    146     if (!pmVisualInitWindow (&kapa, "PPSub:Images")) {
     148    if (!pmVisualInitWindow (&kapa1, "PPSub:Images")) {
    147149        return false;
    148150    }
     
    197199
    198200    psImage *canvas32 = pmVisualImageToFloat(canvas);
    199     pmVisualScaleImage(kapa, canvas32, "Least_Squares", 0, true);
     201    pmVisualScaleImage(kapa1, canvas32, "Least_Squares", 0, true);
    200202
    201203    pmVisualAskUser(&plotLeastSquares);
     
    207209bool pmSubtractionVisualShowSubtraction(psImage *image, psImage *ref, psImage *sub) {
    208210    if (!pmVisualIsVisual() || !plotImage) return true;
    209     if (!pmVisualInitWindow (&kapa, "PPSub:Images")) {
    210         return false;
    211     }
    212 
    213     pmVisualScaleImage(kapa, image, "Image", 0, true);
    214     pmVisualScaleImage(kapa, ref, "Reference", 1, true);
    215     pmVisualScaleImage(kapa, sub, "Subtraction", 2, true);
     211    if (!pmVisualInitWindow (&kapa1, "PPSub:Images")) {
     212        return false;
     213    }
     214
     215    pmVisualScaleImage(kapa1, image, "Image", 0, true);
     216    pmVisualScaleImage(kapa1, ref, "Reference", 1, true);
     217    pmVisualScaleImage(kapa1, sub, "Subtraction", 2, true);
    216218    pmVisualAskUser(&plotImage);
    217219    return true;
     
    255257}
    256258
     259static int footprint = 0;
     260static int NX = 0;
     261static int NY = 0;
     262static psImage *sourceImage      = NULL;
     263static psImage *targetImage      = NULL;
     264static psImage *residualImage    = NULL;
     265static psImage *differenceImage  = NULL;
     266static psImage *convolutionImage = NULL;
     267
     268bool pmSubtractionVisualShowFitInit(pmSubtractionStampList *stamps) {
     269
     270    // if (!pmVisualIsVisual()) return true;
     271
     272    // generate 4 storage images large enough to hold the N stamps:
     273
     274    footprint = stamps->footprint;
     275
     276    float NXf = sqrt(stamps->num);
     277    NX = (int) NXf == NXf ? NXf : NXf + 1.0;
     278   
     279    float NYf = stamps->num / NX;
     280    NY = (int) NYf == NY ? NYf : NYf + 1.0;
     281
     282    int NXpix = (2*footprint + 1) * NX;
     283    NXpix += (NX > 1) ? 3 * NX : 0;
     284
     285    int NYpix = (2*footprint + 1) * NY;
     286    NYpix += (NY > 1) ? 3 * NY : 0;
     287
     288    sourceImage      = psImageAlloc (NXpix, NYpix, PS_TYPE_F32);
     289    targetImage      = psImageAlloc (NXpix, NYpix, PS_TYPE_F32);
     290    residualImage    = psImageAlloc (NXpix, NYpix, PS_TYPE_F32);
     291    differenceImage  = psImageAlloc (NXpix, NYpix, PS_TYPE_F32);
     292    convolutionImage = psImageAlloc (NXpix, NYpix, PS_TYPE_F32);
     293   
     294    psImageInit (sourceImage,      0.0);
     295    psImageInit (targetImage,      0.0);
     296    psImageInit (residualImage,    0.0);
     297    psImageInit (differenceImage,  0.0);
     298    psImageInit (convolutionImage, 0.0);
     299
     300    return true;
     301}
     302
     303bool pmSubtractionVisualShowFitAddStamp(psKernel *target, psKernel *source, psKernel *convolution, double background, double norm, int index) {
     304
     305    // if (!pmVisualIsVisual()) return true;
     306
     307    int NXoff = index % NX;
     308    int NYoff = index / NX;
     309
     310    int NXpix = NXoff * (2*footprint + 1 + 3) + footprint;
     311    int NYpix = NYoff * (2*footprint + 1 + 3) + footprint;
     312
     313    // insert the (target) kernel into the (target) image:
     314    for (int y = -footprint; y <= footprint; y++) {
     315        for (int x = -footprint; x <= footprint; x++) {
     316            targetImage->data.F32[y + NYpix][x + NXpix] = target->kernel[y][x];
     317        }
     318    }
     319
     320    // insert the (source) kernel into the (source) image:
     321    for (int y = -footprint; y <= footprint; y++) {
     322        for (int x = -footprint; x <= footprint; x++) {
     323            sourceImage->data.F32[y + NYpix][x + NXpix] = source->kernel[y][x];
     324        }
     325    }
     326   
     327    // insert the (convolution) kernel into the (convolution) image:
     328    for (int y = -footprint; y <= footprint; y++) {
     329        for (int x = -footprint; x <= footprint; x++) {
     330            convolutionImage->data.F32[y + NYpix][x + NXpix] = -convolution->kernel[y][x];
     331        }
     332    }
     333   
     334    // insert the (difference) kernel into the (difference) image:
     335    for (int y = -footprint; y <= footprint; y++) {
     336        for (int x = -footprint; x <= footprint; x++) {
     337            differenceImage->data.F32[y + NYpix][x + NXpix] = target->kernel[y][x] - background - source->kernel[y][x] * norm;
     338        }
     339    }
     340
     341    // insert the (residual) kernel into the (residual) image:
     342    for (int y = -footprint; y <= footprint; y++) {
     343        for (int x = -footprint; x <= footprint; x++) {
     344            residualImage->data.F32[y + NYpix][x + NXpix] = target->kernel[y][x] - background - source->kernel[y][x] * norm + convolution->kernel[y][x];
     345        }
     346    }
     347    return true;
     348}
     349
     350bool pmSubtractionVisualShowFit() {
     351
     352    // if (!pmVisualIsVisual()) return true;
     353    if (!pmVisualInitWindow(&kapa1, "ppSub:Images")) return false;
     354    if (!pmVisualInitWindow(&kapa2, "ppSub:Misc")) return false;
     355
     356    pmVisualScaleImage(kapa1, targetImage, "Target Stamps", 0, true);
     357    pmVisualScaleImage(kapa1, sourceImage, "Source Stamps", 1, true);
     358    pmVisualScaleImage(kapa1, convolutionImage, "Convolution Stamps", 2, true);
     359
     360    pmVisualScaleImage(kapa2, differenceImage, "Difference Stamps", 0, true);
     361    pmVisualScaleImage(kapa2, residualImage, "Residual Stamps", 1, true);
     362    pmVisualAskUser(NULL);
     363
     364    psFree(targetImage);
     365    psFree(sourceImage);
     366    psFree(convolutionImage);
     367    psFree(differenceImage);
     368    psFree(residualImage);
     369
     370    targetImage = NULL;
     371    sourceImage = NULL;
     372    convolutionImage = NULL;
     373    differenceImage = NULL;
     374    residualImage = NULL;
     375
     376    return true;
     377}
     378
     379bool pmSubtractionVisualPlotFit(const pmSubtractionKernels *kernels) {
     380
     381    Graphdata graphdata;
     382
     383    // if (!pmVisualIsVisual()) return true;
     384    if (!pmVisualInitWindow(&kapa3, "ppSub:plots")) return false;
     385
     386    KapaClearSections (kapa3);
     387    KapaInitGraph (&graphdata);
     388
     389    psVector *x = psVectorAllocEmpty (kernels->num, PS_TYPE_F32);
     390    psVector *y = psVectorAllocEmpty (kernels->num, PS_TYPE_F32);
     391
     392    graphdata.xmin = -1.0;
     393    graphdata.xmax = kernels->num + 1.0;
     394    graphdata.ymin = +32.0;
     395    graphdata.ymax = -32.0;
     396
     397    psImage *polyValues = p_pmSubtractionPolynomial(NULL, kernels->spatialOrder, 0.0, 0.0);
     398
     399    // construct the plot vectors
     400    for (int i = 0; i < kernels->num; i++) {
     401        x->data.F32[i] = i;
     402        y->data.F32[i] = p_pmSubtractionSolutionCoeff(kernels, polyValues, i, false);
     403        graphdata.ymin = PS_MIN(graphdata.ymin, y->data.F32[i]);
     404        graphdata.ymax = PS_MAX(graphdata.ymax, y->data.F32[i]);
     405    }
     406    x->n = y->n = kernels->num;
     407
     408    float range;
     409    range = graphdata.xmax - graphdata.xmin;
     410    graphdata.xmax += 0.05*range;
     411    graphdata.xmin -= 0.05*range;
     412    range = graphdata.ymax - graphdata.ymin;
     413    graphdata.ymax += 0.05*range;
     414    graphdata.ymin -= 0.05*range;
     415
     416    KapaSetLimits (kapa3, &graphdata);
     417
     418    KapaSetFont (kapa3, "helvetica", 14);
     419    KapaBox (kapa3, &graphdata);
     420    KapaSendLabel (kapa3, "kernel number", KAPA_LABEL_XM);
     421    KapaSendLabel (kapa3, "coeff", KAPA_LABEL_YM);
     422
     423    graphdata.color = KapaColorByName ("black");
     424    graphdata.ptype = 2;
     425    graphdata.size = 0.5;
     426    graphdata.style = 2;
     427
     428    KapaPrepPlot   (kapa3, x->n, &graphdata);
     429    KapaPlotVector (kapa3, x->n, x->data.F32, "x");
     430    KapaPlotVector (kapa3, x->n, y->data.F32, "y");
     431
     432    psFree (x);
     433    psFree (y);
     434
     435    pmVisualAskUser(NULL);
     436    return true;
     437}
     438
    257439#else
    258440bool pmSubtractionVisualClose(void) {return true;}
     
    261443bool pmSubtractionVisualPlotLeastSquares(pmSubtractionStampList *stamps) {return true;}
    262444bool pmSubtractionVisualShowSubtraction(psImage *image, psImage *ref, psImage *sub) {return true;}
     445bool pmSubtractionVisualShowFitInit(pmSubtractionStampList *stamps) {return true;}
     446bool pmSubtractionVisualShowFitAddStamp(psKernel *target, psKernel *source, psKernel *convolution, double background, double norm, int index) {return true;}
     447bool pmSubtractionVisualShowFit() {return true;}
     448bool pmSubtractionVisualPlotFit(const pmSubtractionKernels *kernels);
    263449#endif
  • branches/pap/psModules/src/imcombine/pmSubtractionVisual.h

    r23487 r26321  
    77bool pmSubtractionVisualPlotLeastSquares(pmSubtractionStampList *stamps);
    88bool pmSubtractionVisualShowSubtraction(psImage *image, psImage *ref, psImage *sub);
     9bool pmSubtractionVisualShowFitInit(pmSubtractionStampList *stamps);
     10bool pmSubtractionVisualShowFitAddStamp(psKernel *target, psKernel *source, psKernel *convolution, double background, double norm, int index);
     11bool pmSubtractionVisualShowFit();
     12bool pmSubtractionVisualPlotFit(const pmSubtractionKernels *kernels);
    913
    1014#endif
Note: See TracChangeset for help on using the changeset viewer.