IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 6921


Ignore:
Timestamp:
Apr 19, 2006, 6:28:00 PM (20 years ago)
Author:
Paul Price
Message:

Fringe subtraction is working; needs clipping and refinement.

Location:
trunk/psModules/src/detrend
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/detrend/pmFringeStats.c

    r6872 r6921  
    33 *  @author Eugene Magnier, IfA
    44 *
    5  *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
    6  *  @date $Date: 2006-04-17 18:01:05 $
     5 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
     6 *  @date $Date: 2006-04-20 04:28:00 $
    77 *
    88 *  Copyright 2004 IfA
     
    1212#include "pmFPA.h"
    1313#include "pmFringeStats.h"
     14
     15#define MAX(x,y) ((x) > (y) ? (x) : (y))
     16#define MIN(x,y) ((x) < (y) ? (x) : (y))
    1417
    1518static void fringeRegionsFree(pmFringeRegions *fringe)
     
    5659    stats->regions = psMemIncrRefCounter(regions);
    5760    stats->f = psVectorAlloc(regions->x->n, PS_TYPE_F32);
     61    stats->f->n = regions->x->n;
    5862    stats->df = psVectorAlloc(regions->x->n, PS_TYPE_F32);
     63    stats->df->n = regions->x->n;
    5964
    6065    return stats;
     
    7782    scale->coeff = psVectorAlloc(nFringeFrames + 1, PS_TYPE_F32);
    7883    scale->coeffErr = psVectorAlloc(nFringeFrames + 1, PS_TYPE_F32);
     84    scale->coeff->n = nFringeFrames + 1;
     85    scale->coeff->n = nFringeFrames + 1;
    7986
    8087    return scale;
    8188}
    8289
    83 bool pmFringeStatsCreatePoints(pmFringeRegions *fringe, psImage *image)
     90bool pmFringeRegionsCreatePoints(pmFringeRegions *fringe, psImage *image)
    8491{
    8592
     
    9299    fringe->y = psVectorRecycle(fringe->y, fringe->nRequested, PS_TYPE_F32);
    93100    fringe->mask = psVectorRecycle(fringe->mask, fringe->nRequested, PS_TYPE_U8);
     101    fringe->x->n = fringe->y->n = fringe->mask->n = fringe->nRequested;
    94102
    95103    int nX = image->numCols;
     
    116124    if (!fringe->x || !fringe->y) {
    117125        // create the fringe vectors for this image
    118         pmFringeStatsCreatePoints(fringe, readout->image);
     126        pmFringeRegionsCreatePoints(fringe, readout->image);
    119127    }
    120128
     
    138146
    139147    for (int i = 0; i < fringe->x->n; i++) {
    140         psRegion region = psRegionSet(xPt[i] - dX, yPt[i] - dY, xPt[i] + dX + 1, yPt[i] + dY + 1);
     148        psRegion region = psRegionSet(xPt[i] - dX, xPt[i] + dX + 1, yPt[i] - dY, yPt[i] + dY + 1);
    141149        region = psRegionForImage(image, region);
    142150        psImage *subImage = psImageSubset(image, region);
     
    144152        psImageStats(stats, subImage, subMask, maskVal);
    145153
    146         fPt[i] = stats->sampleMedian;
    147         dfPt[i] = stats->sampleStdev;
     154        fPt[i] = stats->robustMedian;
     155        dfPt[i] = stats->robustStdev;
     156
     157        psTrace(__func__, 7, "[%d:%d,%d:%d]: %f %f\n", region.x0, region.x1, region.y0, region.y1,
     158                fPt[i], dfPt[i]);
    148159    }
    149160
     
    154165pmFringeScale *pmFringeScaleMeasure(pmFringeStats *science, psArray *fringes)
    155166{
    156     double sum;
    157     psVector *v1;
    158     psVector *v2;
    159 
    160     pmFringeScale *scale = pmFringeScaleAlloc(fringes->n);
    161 
    162     int nCof = fringes->n + 1;
    163     int nPts = science->f->n;
    164 
    165     psImage *A = psImageAlloc(nCof, nCof, PS_TYPE_F64);
    166     psVector *B = psVectorAlloc(nCof, PS_TYPE_F64);
    167 
    168     for (int i = 0; i < nCof; i++) {
    169         psF32 *p1 = NULL;
     167    pmFringeScale *scale = pmFringeScaleAlloc(fringes->n); // The resultant fringe scales
     168
     169    int numCoeffs = fringes->n + 1;
     170    int numPoints = science->f->n;
     171
     172    psImage *A = psImageAlloc(numCoeffs, numCoeffs, PS_TYPE_F64);
     173    psVector *B = psVectorAlloc(numCoeffs, PS_TYPE_F64);
     174    B->n = numCoeffs;
     175
     176    for (int i = 0; i < numCoeffs; i++) {
     177        psVector *fringe1 = NULL;
    170178        if (i != 0) {
    171             v1 = fringes->data[i - 1];
    172             p1 = v1->data.F32;
     179            pmFringeStats *fringe = fringes->data[i - 1];
     180            fringe1 = fringe->f;
    173181        }
    174         for (int j = 0; j < nCof; j++) {
    175             psF32 *p2 = NULL;
     182        for (int j = 0; j < numCoeffs; j++) {
     183            psVector *fringe2 = NULL;
    176184            if (j != 0) {
    177                 v2 = fringes->data[j - 1];
    178                 p2 = v2->data.F32;
     185                pmFringeStats *fringe = fringes->data[j - 1];
     186                fringe2 = fringe->f;
    179187            }
    180188
    181             sum = 0;
    182             for (int k = 0; k < nPts; k++) {
    183                 psF32 f1 = (p1 == NULL) ? 1.0 : p1[k];
    184                 psF32 f2 = (p2 == NULL) ? 1.0 : p2[k];
     189            double sum = 0.0;
     190            for (int k = 0; k < numPoints; k++) {
     191                psF32 f1 = (fringe1 == NULL) ? 1.0 : fringe1->data.F32[k];
     192                psF32 f2 = (fringe2 == NULL) ? 1.0 : fringe2->data.F32[k];
    185193                sum += f1*f2;
    186194            }
    187             A->data.F32[i][j] = sum;
     195            A->data.F64[i][j] = sum;
    188196        }
    189197
    190         sum = 0;
    191         psF32 *p2 = science->f->data.F32;
    192         for (int j = 0; j < nPts; j++) {
    193             psF32 f1 = (p1 == NULL) ? 1.0 : p1[j];
    194             psF32 f2 = p2[j];
     198        double sum = 0.0;
     199        for (int j = 0; j < numPoints; j++) {
     200            psF32 f1 = (fringe1 == NULL) ? 1.0 : fringe1->data.F32[j];
     201            psF32 f2 = science->f->data.F32[j];
    195202            sum += f1*f2;
    196203        }
    197         B->data.F32[i] = sum;
     204        B->data.F64[i] = sum;
    198205    }
    199206
     
    202209    }
    203210
    204 
    205     for (int i = 0; i < nCof; i++) {
    206         scale->coeff->data.F32[i] = B->data.F32[i];
    207         scale->coeffErr->data.F32[i] = sqrt(A->data.F32[i][i]);
     211    for (int i = 0; i < numCoeffs; i++) {
     212        scale->coeff->data.F32[i] = B->data.F64[i];
     213        scale->coeffErr->data.F32[i] = sqrt(A->data.F64[i][i]);
    208214    }
    209215
     
    219225    psFree(scienceStats);
    220226
     227    psTrace(__func__, 7, "Fringe solution:\n");
     228    for (int i = 0; i < fringeImages->n; i++) {
     229        psTrace(__func__, 7, "%d: %f %f\n", i, scale->coeff->data.F32[i],
     230                scale->coeffErr->data.F32[i]);
     231    }
     232
    221233    // build the fringe correction image
    222234    // XXX we could save data space by making the first image the output image
    223     psImage *sumFringe = NULL;
     235    psImage *sumFringe = psImageAlloc(readout->image->numCols, readout->image->numRows, PS_TYPE_F32);
    224236    for (int i = 0; i < fringeImages->n; i++) {
    225237
  • trunk/psModules/src/detrend/pmFringeStats.h

    r6872 r6921  
    55 *  @author Eugene Magnier, IfA
    66 *
    7  *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
    8  *  @date $Date: 2006-04-17 18:01:05 $
     7 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
     8 *  @date $Date: 2006-04-20 04:28:00 $
    99 *
    1010 *  Copyright 2004 IfA, University of Hawaii
     
    5050pmFringeStats *pmFringeStatsAlloc(pmFringeRegions *regions);
    5151
     52// Generate the fringe points
     53bool pmFringeRegionsCreatePoints(pmFringeRegions *fringe, psImage *image);
    5254
    5355/** the pmFringeScale structure defines the relationship between two fringe measurements
Note: See TracChangeset for help on using the changeset viewer.