IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 24, 2010, 2:59:09 PM (16 years ago)
Author:
Paul Price
Message:

Merging trunk in advance of reintegrating into trunk.

Location:
branches/pap
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/pap

  • branches/pap/psModules

  • branches/pap/psModules/src/objects/pmPSF_IO.c

    r27531 r28484  
    174174    PS_ASSERT_PTR_NON_NULL(chip, false);
    175175
    176     if (!pmPSFmodelWrite(chip->analysis, view, file, config)) {
     176    // We need the readout as well, because that has the PSF analysis data (e.g., clumps)
     177    // There is only one, because photometry is done on chip-mosaicked data.
     178    pmFPAview *roView = pmFPAviewAlloc(0); // View to readout
     179    *roView = *view;
     180    roView->cell = 0;
     181    roView->readout = 0;
     182    pmReadout *ro = pmFPAviewThisReadout(roView, chip->parent); // Readout with analysis data
     183    psFree(roView);
     184
     185    if (!pmPSFmodelWrite(chip->analysis, ro ? ro->analysis : NULL, view, file, config)) {
    177186        psError(psErrorCodeLast(), false, "Failed to write PSF for chip");
    178187        return false;
     
    189198// else
    190199//   - psf table (+header) : FITS Table
    191 bool pmPSFmodelWrite (psMetadata *analysis, const pmFPAview *view,
     200bool pmPSFmodelWrite (const psMetadata *chipAnalysis, const psMetadata *roAnalysis, const pmFPAview *view,
    192201                      pmFPAfile *file, pmConfig *config)
    193202{
     
    198207    char *headName, *tableName, *residName;
    199208
    200     if (!analysis) {
     209    if (!chipAnalysis) {
    201210        psError(PM_ERR_PROG, true, "No analysis metadata for chip.");
    202211        return false;
     212    }
     213    if (!roAnalysis) {
     214        psWarning("No analysis metadata for PSF, clump parameters cannot be saved.");
    203215    }
    204216
     
    314326
    315327    // select the psf of interest
    316     pmPSF *psf = psMetadataLookupPtr (&status, analysis, "PSPHOT.PSF");
     328    pmPSF *psf = psMetadataLookupPtr (&status, chipAnalysis, "PSPHOT.PSF");
    317329    if (!psf) {
    318330        psError(PM_ERR_PROG, true, "missing PSF for this analysis metadata");
     
    346358
    347359        // we now save clump parameters for each region : need to save all of those
    348         int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS");
    349         psMetadataAddS32 (header, PS_LIST_TAIL, "PSF_CLN", PS_META_REPLACE, "number of psf clump regions", nRegions);
    350         for (int i = 0; i < nRegions; i++) {
    351             char regionName[64];
    352             snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i);
    353             psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName);
    354 
    355             psfClump.X  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");   assert (status);
    356             psfClump.Y  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");   assert (status);
    357             psfClump.dX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");  assert (status);
    358             psfClump.dY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");  assert (status);
    359 
    360             char key[16];
    361             snprintf (key, 9, "CLX_%03d", i);
    362             psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.X);
    363             snprintf (key, 9, "CLY_%03d", i);
    364             psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.Y);
    365             snprintf (key, 9, "CLDX_%03d", i);
    366             psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dX);
    367             snprintf (key, 9, "CLDY_%03d", i);
    368             psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dY);
     360        if (roAnalysis) {
     361            int nRegions = psMetadataLookupS32 (&status, roAnalysis, "PSF.CLUMP.NREGIONS");
     362            psMetadataAddS32 (header, PS_LIST_TAIL, "PSF_CLN", PS_META_REPLACE, "number of psf clump regions", nRegions);
     363            for (int i = 0; i < nRegions; i++) {
     364                char regionName[64];
     365                snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i);
     366                psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName);
     367
     368                psfClump.X  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X");   assert (status);
     369                psfClump.Y  = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y");   assert (status);
     370                psfClump.dX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX");  assert (status);
     371                psfClump.dY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY");  assert (status);
     372
     373                char key[16];
     374                snprintf (key, 9, "CLX_%03d", i);
     375                psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.X);
     376                snprintf (key, 9, "CLY_%03d", i);
     377                psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.Y);
     378                snprintf (key, 9, "CLDX_%03d", i);
     379                psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dX);
     380                snprintf (key, 9, "CLDY_%03d", i);
     381                psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dY);
     382            }
    369383        }
    370384
     
    492506
    493507        // write the residuals as planes of the image
    494         psArray *images = psArrayAllocEmpty (1);
    495         psArrayAdd (images, 1, psf->residuals->Ro);  // z = 0 is Ro
     508        psArray *images = psArrayAllocEmpty (1);
     509        psArrayAdd (images, 1, psf->residuals->Ro);  // z = 0 is Ro
    496510
    497511        if (psf->residuals->Rx) {
    498512            psArrayAdd (images, 1, psf->residuals->Rx);
    499513            psArrayAdd (images, 1, psf->residuals->Ry);
    500         }
    501 
    502         // note that all N plane are implicitly of the same type, so we convert the mask
    503         if (psf->residuals->mask) {
    504             psImage *mask = psImageCopy (NULL, psf->residuals->mask, psf->residuals->Ro->type.type);
    505             psArrayAdd (images, 1, mask);
    506             psFree (mask);
    507         }
    508 
    509         // psFitsWriteImageCube (file->fits, header, images, residName);
    510         // psFree (images);
    511 
    512         if (!psFitsWriteImageCube (file->fits, header, images, residName)) {
     514        }
     515
     516        // note that all N plane are implicitly of the same type, so we convert the mask
     517        if (psf->residuals->mask) {
     518            psImage *mask = psImageCopy (NULL, psf->residuals->mask, psf->residuals->Ro->type.type);
     519            psArrayAdd (images, 1, mask);
     520            psFree (mask);
     521        }
     522
     523        // psFitsWriteImageCube (file->fits, header, images, residName);
     524        // psFree (images);
     525
     526        if (!psFitsWriteImageCube (file->fits, header, images, residName)) {
    513527            psError(psErrorCodeLast(), false, "Unable to write PSF residuals.");
    514528            psFree(images);
     
    728742    PS_ASSERT_PTR_NON_NULL(file->fpa, false);
    729743
    730     if (!pmPSFmodelRead (chip->analysis, view, file, config)) {
     744    // We need the readout as well, because that has the PSF analysis data (e.g., clumps)
     745    // There may be only one, because photometry is done on chip-mosaicked data.
     746    if (chip->cells->n != 1) {
     747        psError(PM_ERR_PROG, true, "Chip to receive PSF has %ld cells (should be only one)",
     748                chip->cells->n);
     749        return false;
     750    }
     751    pmCell *cell = chip->cells->data[0]; // Cell to receive PSF
     752    pmReadout *ro = NULL;                // Readout to receive PSF
     753    if (cell->readouts->n == 0) {
     754        ro = pmReadoutAlloc(cell);
     755        psFree(ro);                     // Drop reference
     756    } else if (cell->readouts->n != 1) {
     757        psError(PM_ERR_PROG, true, "Cell to receive PSF has %ld readouts (should be only one)",
     758                cell->readouts->n);
     759        return false;
     760    } else {
     761        ro = cell->readouts->data[0];
     762    }
     763    PM_ASSERT_READOUT_NON_NULL(ro, false);
     764    if (!ro->analysis) {
     765        ro->analysis = psMetadataAlloc();
     766    }
     767
     768    if (!pmPSFmodelRead(chip->analysis, ro->analysis, view, file, config)) {
    731769        psError(psErrorCodeLast(), false, "Failed to write PSF for chip");
    732770        return false;
     
    737775// for each Readout (ie, analysed image), we write out: header + table with PSF model parameters,
    738776// and header + image for the PSF residual images
    739 bool pmPSFmodelRead (psMetadata *analysis, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
     777bool pmPSFmodelRead (psMetadata *chipAnalysis, psMetadata *roAnalysis, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)
    740778{
     779    PS_ASSERT_METADATA_NON_NULL(chipAnalysis, false);
    741780    PS_ASSERT_PTR_NON_NULL(view, false);
    742781    PS_ASSERT_PTR_NON_NULL(file, false);
     
    803842
    804843    // read the psf clump data for each region
    805     int nRegions = psMetadataLookupS32 (&status, header, "PSF_CLN");
    806     if (!status) {
    807         // read old-style psf clump data
    808 
    809         char regionName[64];
    810         snprintf (regionName, 64, "PSF.CLUMP.REGION.000");
    811         psMetadataAddS32 (analysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS",  PS_META_REPLACE, "psf clump regions", 1);
    812 
    813         psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName);
    814         if (!regionMD) {
    815             regionMD = psMetadataAlloc();
    816             psMetadataAddMetadata (analysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD);
    817             psFree (regionMD);
    818         }
    819 
    820         // psf clump data
    821         pmPSFClump psfClump;
    822 
    823         psfClump.X  = psMetadataLookupF32 (&status, header, "PSF_CLX" );  assert(status);
    824         psfClump.Y  = psMetadataLookupF32 (&status, header, "PSF_CLY" );  assert(status);
    825         psfClump.dX = psMetadataLookupF32 (&status, header, "PSF_CLDX");  assert(status);
    826         psfClump.dY = psMetadataLookupF32 (&status, header, "PSF_CLDY");  assert(status);
    827 
    828         psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X",  PS_META_REPLACE, "psf clump center", psfClump.X);
    829         psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.Y",  PS_META_REPLACE, "psf clump center", psfClump.Y);
    830         psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX);
    831         psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY);
    832     } else {
    833         psMetadataAddS32 (analysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS",  PS_META_REPLACE, "psf clump regions", nRegions);
    834 
    835         for (int i = 0; i < nRegions; i++) {
    836             char key[10];
     844    if (roAnalysis) {
     845        int nRegions = psMetadataLookupS32 (&status, header, "PSF_CLN");
     846        if (!status) {
     847            // read old-style psf clump data
     848
    837849            char regionName[64];
    838             snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i);
    839 
    840             psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName);
     850            snprintf (regionName, 64, "PSF.CLUMP.REGION.000");
     851            psMetadataAddS32 (roAnalysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS",  PS_META_REPLACE, "psf clump regions", 1);
     852
     853            psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName);
    841854            if (!regionMD) {
    842855                regionMD = psMetadataAlloc();
    843                 psMetadataAddMetadata (analysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD);
     856                psMetadataAddMetadata (roAnalysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD);
    844857                psFree (regionMD);
    845858            }
     
    848861            pmPSFClump psfClump;
    849862
    850             snprintf (key, 9, "CLX_%03d", i);
    851             psfClump.X  = psMetadataLookupF32 (&status, header, key);  assert(status);
    852             snprintf (key, 9, "CLY_%03d", i);
    853             psfClump.Y  = psMetadataLookupF32 (&status, header, key);  assert(status);
    854             snprintf (key, 9, "CLDX_%03d", i);
    855             psfClump.dX = psMetadataLookupF32 (&status, header, key);  assert(status);
    856             snprintf (key, 9, "CLDY_%03d", i);
    857             psfClump.dY = psMetadataLookupF32 (&status, header, key);  assert(status);
     863            psfClump.X  = psMetadataLookupF32 (&status, header, "PSF_CLX" );  assert(status);
     864            psfClump.Y  = psMetadataLookupF32 (&status, header, "PSF_CLY" );  assert(status);
     865            psfClump.dX = psMetadataLookupF32 (&status, header, "PSF_CLDX");  assert(status);
     866            psfClump.dY = psMetadataLookupF32 (&status, header, "PSF_CLDY");  assert(status);
    858867
    859868            psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X",  PS_META_REPLACE, "psf clump center", psfClump.X);
     
    861870            psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX);
    862871            psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY);
     872        } else {
     873            psMetadataAddS32 (roAnalysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS",  PS_META_REPLACE, "psf clump regions", nRegions);
     874
     875            for (int i = 0; i < nRegions; i++) {
     876                char key[10];
     877                char regionName[64];
     878                snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i);
     879
     880                psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName);
     881                if (!regionMD) {
     882                    regionMD = psMetadataAlloc();
     883                    psMetadataAddMetadata (roAnalysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD);
     884                    psFree (regionMD);
     885                }
     886
     887                // psf clump data
     888                pmPSFClump psfClump;
     889
     890                snprintf (key, 9, "CLX_%03d", i);
     891                psfClump.X  = psMetadataLookupF32 (&status, header, key);  assert(status);
     892                snprintf (key, 9, "CLY_%03d", i);
     893                psfClump.Y  = psMetadataLookupF32 (&status, header, key);  assert(status);
     894                snprintf (key, 9, "CLDX_%03d", i);
     895                psfClump.dX = psMetadataLookupF32 (&status, header, key);  assert(status);
     896                snprintf (key, 9, "CLDY_%03d", i);
     897                psfClump.dY = psMetadataLookupF32 (&status, header, key);  assert(status);
     898
     899                psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X",  PS_META_REPLACE, "psf clump center", psfClump.X);
     900                psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.Y",  PS_META_REPLACE, "psf clump center", psfClump.Y);
     901                psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX);
     902                psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY);
     903            }
    863904        }
    864905    }
     
    10191060        }
    10201061
    1021         // note that all N plane are implicitly of the same type, so we convert the mask
    1022         psImage *mask = psImageCopy(NULL, psf->residuals->mask, psf->residuals->Ro->type.type);
    1023         psImageInit (psf->residuals->mask, 0);
    1024         psImageInit (psf->residuals->Rx, 0.0);
    1025         psImageInit (psf->residuals->Ry, 0.0);
    1026         switch (Nz) {
    1027           case 1: // Ro only
    1028             break;
    1029           case 2: // Ro and mask
     1062        // note that all N plane are implicitly of the same type, so we convert the mask
     1063        psImage *mask = psImageCopy(NULL, psf->residuals->mask, psf->residuals->Ro->type.type);
     1064        psImageInit (psf->residuals->mask, 0);
     1065        psImageInit (psf->residuals->Rx, 0.0);
     1066        psImageInit (psf->residuals->Ry, 0.0);
     1067        switch (Nz) {
     1068          case 1: // Ro only
     1069            break;
     1070          case 2: // Ro and mask
    10301071            if (!psFitsReadImageBuffer(mask, file->fits, fullImage, 1)) {
    10311072                psError(psErrorCodeLast(), false, "Unable to read PSF residual image.");
    10321073                return false;
    10331074            }
    1034             psImageCopy (psf->residuals->mask, mask, PM_TYPE_RESID_MASK);
    1035             break;
    1036           case 3: // Ro, Rx and Ry, no mask
     1075            psImageCopy (psf->residuals->mask, mask, PM_TYPE_RESID_MASK);
     1076            break;
     1077          case 3: // Ro, Rx and Ry, no mask
    10371078            if (!psFitsReadImageBuffer(psf->residuals->Rx, file->fits, fullImage, 1)) {
    10381079                psError(psErrorCodeLast(), false, "Unable to read PSF residual image.");
     
    10431084                return false;
    10441085            }
    1045             break;
    1046           case 4: // Ro, Rx, Ry, and mask:
     1086            break;
     1087          case 4: // Ro, Rx, Ry, and mask:
    10471088            if (!psFitsReadImageBuffer(psf->residuals->Rx, file->fits, fullImage, 1)) {
    10481089                psError(psErrorCodeLast(), false, "Unable to read PSF residual image.");
     
    10571098                return false;
    10581099            }
    1059             psImageCopy (psf->residuals->mask, mask, PM_TYPE_RESID_MASK);
    1060             break;
    1061         }
    1062         psFree (mask);
    1063     }
    1064 
    1065     psMetadataAdd (analysis, PS_LIST_TAIL, "PSPHOT.PSF",     PS_DATA_UNKNOWN,  "psphot psf", psf);
     1100            psImageCopy (psf->residuals->mask, mask, PM_TYPE_RESID_MASK);
     1101            break;
     1102        }
     1103        psFree (mask);
     1104    }
     1105
     1106    psMetadataAdd (chipAnalysis, PS_LIST_TAIL, "PSPHOT.PSF",     PS_DATA_UNKNOWN,  "psphot psf", psf);
    10661107    psFree (psf);
    10671108
Note: See TracChangeset for help on using the changeset viewer.