IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 11, 2006, 6:44:01 PM (20 years ago)
Author:
Paul Price
Message:
  • Allow user to specify a random number generator for pmFringeRegionsCreatePoints.
  • Split pmFringeStatsWriteFits into pmFringeRegionsWriteFits and pmFringeStatsWriteFits.
  • Split pmFringeStatsReadFits into pmFringeRegionsReadFits and pmFringeStatsReadFits.
File:
1 edited

Legend:

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

    r7836 r7875  
    33 *  @author Eugene Magnier, IfA
    44 *
    5  *  @version $Revision: 1.12 $ $Name: not supported by cvs2svn $
    6  *  @date $Date: 2006-07-07 03:26:22 $
     5 *  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
     6 *  @date $Date: 2006-07-12 04:44:01 $
    77 *
    88 *  Copyright 2004 IfA
     
    5656}
    5757
    58 bool pmFringeRegionsCreatePoints(pmFringeRegions *fringe, const psImage *image)
     58bool pmFringeRegionsCreatePoints(pmFringeRegions *fringe, const psImage *image, psRandom *random)
    5959{
    6060    PS_ASSERT_PTR_NON_NULL(fringe, false);
     
    6565    // create fringe->nRequested
    6666
    67     psRandom *rnd = psRandomAlloc(PS_RANDOM_TAUS, 0);
     67    psRandom *rng;
     68    if (random) {
     69        rng = psMemIncrRefCounter(random);
     70    } else {
     71        rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
     72    }
    6873
    6974    fringe->x = psVectorRecycle(fringe->x, fringe->nRequested, PS_TYPE_F32);
     
    8489    // generate random points located within image bounds
    8590    for (int i = 0; i < fringe->nRequested; i++) {
    86         frnd = psRandomUniform(rnd);
     91        frnd = psRandomUniform(rng);
    8792        xPt[i] = (nX - 2*dX)* frnd + dX;
    88         frnd = psRandomUniform(rnd);
     93        frnd = psRandomUniform(rng);
    8994        yPt[i] = (nY - 2*dY)* frnd + dY;
    9095    }
     96
     97    psFree(rng);
     98
    9199    return true;
    92100}
    93101
     102bool pmFringeRegionsWriteFits(psFits *fits, psMetadata *header,
     103                              const pmFringeRegions *regions, const char *extname)
     104{
     105    // Make sure the input is well-behaved
     106    PS_ASSERT_PTR_NON_NULL(fits, false);
     107    PS_ASSERT_PTR_NON_NULL(regions, false);
     108    psVector *x = regions->x;           // The x positions
     109    psVector *y = regions->y;           // The y positions
     110    psVector *mask = regions->mask;     // The region mask
     111    int numRows = regions->nRequested;  // Number of rows in the table
     112    PS_ASSERT_INT_POSITIVE(numRows, false);
     113    PS_ASSERT_VECTOR_NON_NULL(x, false);
     114    PS_ASSERT_VECTOR_NON_NULL(y, false);
     115    PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, false);
     116    PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, false);
     117    PS_ASSERT_VECTOR_SIZE(x, numRows, false);
     118    PS_ASSERT_VECTOR_SIZE(y, numRows, false);
     119    if (mask) {
     120        PS_ASSERT_VECTOR_NON_NULL(mask, false);
     121        PS_ASSERT_VECTOR_TYPE(mask, PS_TYPE_U8, false);
     122        PS_ASSERT_VECTOR_SIZE(mask, numRows, false);
     123    }
     124
     125    // We need to write:
     126    // Scalars: dX, dY, nX, nY
     127    // Vectors: x, y
     128
     129    psMetadata *scalars = psMetadataAlloc(); // Metadata to hold the scalars; will be the header
     130    psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDX", PS_META_REPLACE, "Median box half-width",
     131                     regions->dX);
     132    psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDY", PS_META_REPLACE, "Median box half-height",
     133                     regions->dY);
     134    psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNX", PS_META_REPLACE, "Large-scale smoothing in x",
     135                     regions->nX);
     136    psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNY", PS_META_REPLACE, "Large-scale smoothing in y",
     137                     regions->nY);
     138
     139    psArray *table = psArrayAlloc(numRows); // The table
     140    table->n = numRows;
     141    // Translate the vectors into the required format for psFitsWriteTable()
     142    for (long i = 0; i < numRows; i++) {
     143        psMetadata *row = psMetadataAlloc();
     144        psMetadataAddF32(row, PS_LIST_TAIL, "x", PS_META_REPLACE, "Fringe position in x", x->data.F32[i]);
     145        psMetadataAddF32(row, PS_LIST_TAIL, "y", PS_META_REPLACE, "Fringe position in y", y->data.F32[i]);
     146        table->data[i] = row;
     147    }
     148
     149    bool success;                       // Success of operation
     150    if (!(success = psFitsWriteTable(fits, scalars, table, extname))) {
     151        psError(PS_ERR_IO, false, "Unable to write fringe data to extension %s\n", extname);
     152    }
     153    psFree(scalars);
     154    psFree(table);
     155
     156    return success;
     157}
     158
     159pmFringeRegions *pmFringeRegionsReadFits(psMetadata *header, const psFits *fits, const char *extname)
     160{
     161    PS_ASSERT_PTR_NON_NULL(fits, NULL);
     162
     163    if (extname && strlen(extname) > 0) {
     164        if (!psFitsMoveExtName(fits, extname)) {
     165            psError(PS_ERR_IO, false, "Unable to move to extension %s\n", extname);
     166            return NULL;
     167        }
     168    } else if (!psFitsMoveExtNum(fits, 0, false)) {
     169        psError(PS_ERR_IO, false, "Unable to move to PHU\n");
     170        return NULL;
     171    }
     172
     173    psMetadata *headerCopy = psMemIncrRefCounter(header); // Copy of the header, or NULL
     174
     175    headerCopy = psFitsReadHeader(headerCopy, fits); // The FITS header
     176    if (!headerCopy) {
     177        psError(PS_ERR_IO, false, "Unable to read header for extension %s\n", extname);
     178        psFree(header);
     179        return NULL;
     180    }
     181
     182    // Read the scalars from the header
     183    #define READ_SCALAR(SCALAR, NAME) \
     184    int SCALAR = psMetadataLookupS32(&mdok, header, NAME); \
     185    if (!mdok || SCALAR <= 0) { \
     186        psError(PS_ERR_IO, true, "Unable to find " NAME " in header of extension %s.\n", extname); \
     187        psFree(header); \
     188        return NULL; \
     189    }
     190
     191    // Need to retrieve the scalars: dX, dY, nX, nY
     192    bool mdok = true;                   // Status of MD lookup
     193    READ_SCALAR(dX, "PSFRNGDX");
     194    READ_SCALAR(dY, "PSFRNGDY");
     195    READ_SCALAR(nX, "PSFRNGNX");
     196    READ_SCALAR(nY, "PSFRNGNY");
     197    psFree(header);
     198
     199    // Now the vectors: x, y
     200    psArray *table = psFitsReadTable(fits); // The table
     201    long numRows = table->n;            // Number of rows
     202
     203    pmFringeRegions *regions = pmFringeRegionsAlloc(numRows, dX, dY, nX, nY); // The fringe regions
     204    psVector *x = psVectorAlloc(numRows, PS_TYPE_F32); // x position
     205    psVector *y = psVectorAlloc(numRows, PS_TYPE_F32); // y position
     206    x->n = y->n = numRows;
     207    regions->x = x;
     208    regions->y = y;
     209
     210    #define READ_REGIONS_ROW(VECTOR, TYPE, NAME, DESCRIPTION) \
     211    VECTOR->data.TYPE[i] = psMetadataLookup##TYPE(&mdok, row, NAME); \
     212    if (!mdok) { \
     213        psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
     214        psFree(table); \
     215        psFree(regions); \
     216        return NULL; \
     217    }
     218
     219    // Translate the table into vectors
     220    for (long i = 0; i < numRows; i++) {
     221        psMetadata *row = table->data[i]; // Table row
     222        READ_REGIONS_ROW(x, F32, "x", "x position");
     223        READ_REGIONS_ROW(y, F32, "y", "y position");
     224    }
     225    psFree(table);
     226
     227    return regions;
     228}
    94229
    95230//////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
    129264    if (!fringe->x || !fringe->y) {
    130265        // create the fringe vectors for this image
    131         pmFringeRegionsCreatePoints(fringe, readout->image);
     266        pmFringeRegionsCreatePoints(fringe, readout->image, NULL);
    132267    }
    133268
     
    167302            psImageStats(median, subImage, subMask, maskVal);
    168303            sky->data.F32[i][j] = median->sampleMedian;
     304            psFree(subImage);
     305            psFree(subMask);
    169306        }
    170307    }
     
    193330                (int)region.y0, (int)region.y1, fPt[i], dfPt[i]);
    194331    }
     332    psFree(sky);
     333    psFree(median);
     334    psFree(medianSd);
    195335
    196336    return measurements;
    197337}
    198338
    199 bool pmFringeStatsWriteFits(psFits *fits, const pmFringeStats *fringe, const char *extname)
     339bool pmFringeStatsWriteFits(psFits *fits,
     340                            psMetadata *header,
     341                            const pmFringeStats *fringe,
     342                            const char *extname
     343                           )
    200344{
    201345    // Make sure the input is well-behaved
     
    204348    pmFringeRegions *regions = fringe->regions; // The fringe regions
    205349    PS_ASSERT_PTR_NON_NULL(regions, false);
    206     psVector *x = regions->x;           // The x positions
    207     psVector *y = regions->y;           // The y positions
    208     psVector *mask = regions->mask;     // The region mask
    209     int numRows = x->n;                 // Number of rows in the table
    210     PS_ASSERT_INT_POSITIVE(regions->nRequested, false);
    211     PS_ASSERT_VECTOR_NON_NULL(x, false);
    212     PS_ASSERT_VECTOR_NON_NULL(y, false);
    213     PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, false);
    214     PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, false);
    215     PS_ASSERT_VECTOR_SIZE(y, numRows, false);
    216     if (mask) {
    217         PS_ASSERT_VECTOR_NON_NULL(mask, false);
    218         PS_ASSERT_VECTOR_TYPE(mask, PS_TYPE_U8, false);
    219         PS_ASSERT_VECTOR_SIZE(mask, numRows, false);
    220     }
     350    int numRows = regions->nRequested;  // Number of rows in the table
     351    PS_ASSERT_INT_POSITIVE(numRows, false);
    221352    psVector *f = fringe->f;            // The fringe measurements
    222353    psVector *df = fringe->df;      // The fringe standard deviatiations
     
    229360
    230361    // We need to write:
    231     // Scalars: dX, dY, nX, nY
    232     // Vectors: x, y, mask, f, df
    233 
    234     psMetadata *scalars = psMetadataAlloc(); // Metadata to hold the scalars; will be the header
    235     psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDX", PS_META_REPLACE, "Median box half-width",
    236                      regions->dX);
    237     psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDY", PS_META_REPLACE, "Median box half-height",
    238                      regions->dY);
    239     psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNX", PS_META_REPLACE, "Large-scale smoothing in x",
    240                      regions->nX);
    241     psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNY", PS_META_REPLACE, "Large-scale smoothing in y",
    242                      regions->nY);
    243 
     362    // Vectors: f, df
    244363    psArray *table = psArrayAlloc(numRows); // The table
    245364    table->n = numRows;
     
    247366    for (long i = 0; i < numRows; i++) {
    248367        psMetadata *row = psMetadataAlloc();
    249         psArraySet(table, i, row);
    250         psMetadataAddF32(row, PS_LIST_TAIL, "x", PS_META_REPLACE, "Fringe position in x", x->data.F32[i]);
    251         psMetadataAddF32(row, PS_LIST_TAIL, "y", PS_META_REPLACE, "Fringe position in y", y->data.F32[i]);
    252         if (mask) {
    253             psMetadataAddU8(row, PS_LIST_TAIL, "mask", PS_META_REPLACE, "Mask", mask->data.F32[i]);
    254         } else {
    255             psMetadataAddU8(row, PS_LIST_TAIL, "mask", PS_META_REPLACE, "Mask", 0);
    256         }
    257368        psMetadataAddF32(row, PS_LIST_TAIL, "f", PS_META_REPLACE, "Fringe measurement", f->data.F32[i]);
    258369        psMetadataAddF32(row, PS_LIST_TAIL, "df", PS_META_REPLACE, "Fringe stdev", df->data.F32[i]);
    259         psFree(row);                    // Drop reference
    260     }
    261 
    262     bool success;                       // Success of operation
    263     if (!(success = psFitsWriteTable(fits, scalars, table, extname))) {
     370        table->data[i] = row;
     371    }
     372
     373    if (!psFitsWriteTable(fits, header, table, extname)) {
    264374        psError(PS_ERR_IO, false, "Unable to write fringe data to extension %s\n", extname);
    265     }
    266     psFree(scalars);
     375        psFree(table);
     376        return false;
     377    }
     378
    267379    psFree(table);
    268 
    269     return success;
    270 }
    271 
    272 pmFringeStats *pmFringeStatsReadFits(const psFits *fits, const char *extname)
     380    return true;
     381}
     382
     383pmFringeStats *pmFringeStatsReadFits(psMetadata *header, const psFits *fits, const char *extname,
     384                                     pmFringeRegions *regions)
    273385{
    274386    PS_ASSERT_PTR_NON_NULL(fits, NULL);
     387    PS_ASSERT_PTR_NON_NULL(regions, NULL);
     388    PS_ASSERT_INT_POSITIVE(regions->nRequested, NULL);
     389    PS_ASSERT_VECTORS_SIZE_EQUAL(regions->x, regions->y, NULL);
     390    PS_ASSERT_VECTOR_SIZE(regions->x, regions->nRequested, NULL);
    275391
    276392    if (extname && strlen(extname) > 0) {
     
    284400    }
    285401
    286     psMetadata *header = psFitsReadHeader(NULL, fits); // The FITS header
    287     if (!header) {
     402    psMetadata *headerCopy = psMemIncrRefCounter(header); // Copy of the header, or NULL
     403
     404    headerCopy = psFitsReadHeader(headerCopy, fits); // The FITS header
     405    if (!headerCopy) {
    288406        psError(PS_ERR_IO, false, "Unable to read header for extension %s\n", extname);
     407        psFree(headerCopy);
    289408        return NULL;
    290409    }
    291 
    292     // Read the scalars from the header
    293     #define READ_SCALAR(SCALAR, NAME) \
    294     int SCALAR = psMetadataLookupS32(&mdok, header, NAME); \
    295     if (!mdok || SCALAR <= 0) { \
    296         psError(PS_ERR_IO, true, "Unable to find " NAME " in header of extension %s.\n", extname); \
    297         return NULL; \
    298     }
    299 
    300     // Need to retrieve the scalars: dX, dY, nX, nY
    301     bool mdok = true;                   // Status of MD lookup
    302     READ_SCALAR(dX, "PSFRNGDX");
    303     READ_SCALAR(dY, "PSFRNGDX");
    304     READ_SCALAR(nX, "PSFRNGDX");
    305     READ_SCALAR(nY, "PSFRNGDX");
    306     psFree(header);
    307 
    308     // Now the vectors: x, y, mask, f, df
     410    psFree(headerCopy);
     411
     412    // Now the vectors: f, df
    309413    psArray *table = psFitsReadTable(fits); // The table
    310414    long numRows = table->n;            // Number of rows
    311415
    312     pmFringeRegions *regions = pmFringeRegionsAlloc(numRows, dX, dY, nX, nY); // The fringe regions
    313     psVector *x = psVectorAlloc(numRows, PS_TYPE_F32); // x position
    314     psVector *y = psVectorAlloc(numRows, PS_TYPE_F32); // y position
    315     psVector *mask = psVectorAlloc(numRows, PS_TYPE_U8); // mask
    316     x->n = y->n = mask->n = numRows;
    317     regions->x = x;
    318     regions->y = y;
    319     regions->mask = mask;
    320416    pmFringeStats *fringes = pmFringeStatsAlloc(regions); // The fringe measurements
    321     psFree(regions);                    // Drop reference
    322417    psVector *f = fringes->f;           // fringe measurement
    323     psVector *df = fringes->df;     // fringe stdev
    324 
    325     #define READ_ROW(VECTOR, TYPE, NAME, DESCRIPTION) \
     418    psVector *df = fringes->df;         // fringe stdev
     419
     420    #define READ_STATS_ROW(VECTOR, TYPE, NAME, DESCRIPTION) \
    326421    VECTOR->data.TYPE[i] = psMetadataLookup##TYPE(&mdok, row, NAME); \
    327422    if (!mdok) { \
     
    333428
    334429    // Translate the table into vectors
     430    bool mdok;                          // Status of MD lookup
    335431    for (long i = 0; i < numRows; i++) {
    336432        psMetadata *row = table->data[i]; // Table row
    337         READ_ROW(x, F32, "x", "x position");
    338         READ_ROW(y, F32, "y", "y position");
    339         READ_ROW(mask, U8, "mask", "mask value");
    340         READ_ROW(f, F32, "f", "fringe measurement");
    341         READ_ROW(df, F32, "df", "fringe standard deviation");
     433        READ_STATS_ROW(f, F32, "f", "fringe measurement");
     434        READ_STATS_ROW(df, F32, "df", "fringe standard deviation");
    342435    }
    343436    psFree(table);
Note: See TracChangeset for help on using the changeset viewer.