IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 19189


Ignore:
Timestamp:
Aug 25, 2008, 12:14:04 PM (18 years ago)
Author:
Paul Price
Message:

Adding I/O of subtraction kernels to pmFPAfile stuff.

Location:
trunk/psModules/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/camera/pmFPAfile.c

    r19007 r19189  
    440440    PS_ASSERT_STRING_NON_EMPTY(type, PM_FPA_FILE_NONE);
    441441
    442     if (!strcasecmp (type, "SX"))     {
     442    if (!strcasecmp(type, "SX"))     {
    443443        return PM_FPA_FILE_SX;
    444444    }
    445     if (!strcasecmp (type, "OBJ"))     {
     445    if (!strcasecmp(type, "OBJ"))     {
    446446        return PM_FPA_FILE_OBJ;
    447447    }
    448     if (!strcasecmp (type, "CMP"))     {
     448    if (!strcasecmp(type, "CMP"))     {
    449449        return PM_FPA_FILE_CMP;
    450450    }
    451     if (!strcasecmp (type, "CMF"))     {
     451    if (!strcasecmp(type, "CMF"))     {
    452452        return PM_FPA_FILE_CMF;
    453453    }
    454     if (!strcasecmp (type, "RAW"))     {
     454    if (!strcasecmp(type, "RAW"))     {
    455455        return PM_FPA_FILE_RAW;
    456456    }
    457     if (!strcasecmp (type, "IMAGE"))     {
     457    if (!strcasecmp(type, "IMAGE"))     {
    458458        return PM_FPA_FILE_IMAGE;
    459459    }
    460     if (!strcasecmp (type, "PSF"))     {
     460    if (!strcasecmp(type, "PSF"))     {
    461461        return PM_FPA_FILE_PSF;
    462462    }
    463     if (!strcasecmp (type, "JPEG"))     {
     463    if (!strcasecmp(type, "JPEG"))     {
    464464        return PM_FPA_FILE_JPEG;
    465465    }
    466     if (!strcasecmp (type, "KAPA"))     {
     466    if (!strcasecmp(type, "KAPA"))     {
    467467        return PM_FPA_FILE_KAPA;
    468468    }
    469     if (!strcasecmp (type, "MASK"))     {
     469    if (!strcasecmp(type, "MASK"))     {
    470470        return PM_FPA_FILE_MASK;
    471471    }
    472     if (!strcasecmp (type, "WEIGHT"))     {
     472    if (!strcasecmp(type, "WEIGHT"))     {
    473473        return PM_FPA_FILE_WEIGHT;
    474474    }
    475     if (!strcasecmp (type, "FRINGE")) {
     475    if (!strcasecmp(type, "FRINGE")) {
    476476        return PM_FPA_FILE_FRINGE;
    477477    }
    478     if (!strcasecmp (type, "DARK"))     {
     478    if (!strcasecmp(type, "DARK"))     {
    479479        return PM_FPA_FILE_DARK;
    480480    }
    481     if (!strcasecmp (type, "HEADER"))     {
     481    if (!strcasecmp(type, "HEADER"))     {
    482482        return PM_FPA_FILE_HEADER;
    483483    }
    484484    // deprecate this?
    485     if (!strcasecmp (type, "ASTROM"))     {
     485    if (!strcasecmp(type, "ASTROM"))     {
    486486        return PM_FPA_FILE_ASTROM_MODEL;
    487487    }
    488     if (!strcasecmp (type, "ASTROM.MODEL"))     {
     488    if (!strcasecmp(type, "ASTROM.MODEL"))     {
    489489        return PM_FPA_FILE_ASTROM_MODEL;
    490490    }
    491     if (!strcasecmp (type, "ASTROM.REFSTARS"))     {
     491    if (!strcasecmp(type, "ASTROM.REFSTARS"))     {
    492492        return PM_FPA_FILE_ASTROM_REFSTARS;
     493    }
     494    if (!strcasecmp(type, "SUBKERNEL"))     {
     495        return PM_FPA_FILE_SUBKERNEL;
    493496    }
    494497
     
    531534      case PM_FPA_FILE_ASTROM_REFSTARS:
    532535        return ("ASTROM.REFSTARS");
     536      case PM_FPA_FILE_SUBKERNEL:
     537        return ("SUBKERNEL");
    533538      default:
    534539        return ("NONE");
  • trunk/psModules/src/camera/pmFPAfile.h

    r18843 r19189  
    44 * @author EAM, IfA
    55 *
    6  * @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
    7  * @date $Date: 2008-08-01 03:15:46 $
     6 * @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
     7 * @date $Date: 2008-08-25 22:14:04 $
    88 * Copyright 2004-2005 Institute for Astronomy, University of Hawaii
    99 */
     
    4545    PM_FPA_FILE_ASTROM_MODEL,
    4646    PM_FPA_FILE_ASTROM_REFSTARS,
     47    PM_FPA_FILE_SUBKERNEL,
    4748} pmFPAfileType;
    4849
  • trunk/psModules/src/camera/pmFPAfileIO.c

    r18601 r19189  
    4040#include "pmSourcePlots.h"
    4141#include "pmFPAConstruct.h"
     42#include "pmSubtractionIO.h"
    4243#include "pmConcepts.h"
    4344
     
    188189        }
    189190        break;
     191      case PM_FPA_FILE_SUBKERNEL:
     192        status = pmSubtractionReadKernels(view, file, config);
     193        break;
    190194      case PM_FPA_FILE_SX:
    191195      case PM_FPA_FILE_RAW:
     
    258262      case PM_FPA_FILE_FRINGE:
    259263      case PM_FPA_FILE_DARK: {
    260             // create FPA structure component based on view
    261             psMetadata *format = file->format; // Camera format configuration
    262             if (!format) {
    263                 format = config->format;
    264             }
    265 
    266             pmFPA *nameSource = file->src; // Source of FPA.OBS
    267             if (!nameSource) {
    268                 nameSource = file->fpa;
    269             }
    270             bool mdok;                  // Status of MD lookup
    271             const char *fpaObs = psMetadataLookupStr(&mdok, nameSource->concepts, "FPA.OBS"); // Obs. id
    272 
    273             pmFPAAddSourceFromView(file->fpa, fpaObs, view, format);
    274             psTrace ("psModules.camera", 5, "created fpa data elements for %s (%s) (%d:%d:%d)\n",
    275                      file->name, file->name, view->chip, view->cell, view->readout);
    276             break;
    277     }
    278     case PM_FPA_FILE_HEADER:
    279       psAbort ("Create not defined for HEADER");
    280       break;
    281     case PM_FPA_FILE_SX:
    282     case PM_FPA_FILE_RAW:
    283     case PM_FPA_FILE_OBJ:
    284     case PM_FPA_FILE_CMP:
    285     case PM_FPA_FILE_CMF:
    286     case PM_FPA_FILE_PSF:
    287     case PM_FPA_FILE_ASTROM_MODEL:
    288     case PM_FPA_FILE_ASTROM_REFSTARS:
    289     case PM_FPA_FILE_JPEG:
    290     case PM_FPA_FILE_KAPA:
    291         break;
    292 
    293     default:
     264          // create FPA structure component based on view
     265          psMetadata *format = file->format; // Camera format configuration
     266          if (!format) {
     267              format = config->format;
     268          }
     269
     270          pmFPA *nameSource = file->src; // Source of FPA.OBS
     271          if (!nameSource) {
     272              nameSource = file->fpa;
     273          }
     274          bool mdok;                  // Status of MD lookup
     275          const char *fpaObs = psMetadataLookupStr(&mdok, nameSource->concepts, "FPA.OBS"); // Obs. id
     276
     277          pmFPAAddSourceFromView(file->fpa, fpaObs, view, format);
     278          psTrace ("psModules.camera", 5, "created fpa data elements for %s (%s) (%d:%d:%d)\n",
     279                   file->name, file->name, view->chip, view->cell, view->readout);
     280          break;
     281      }
     282      case PM_FPA_FILE_HEADER:
     283        psAbort ("Create not defined for HEADER");
     284        break;
     285      case PM_FPA_FILE_SUBKERNEL:
     286      case PM_FPA_FILE_SX:
     287      case PM_FPA_FILE_RAW:
     288      case PM_FPA_FILE_OBJ:
     289      case PM_FPA_FILE_CMP:
     290      case PM_FPA_FILE_CMF:
     291      case PM_FPA_FILE_PSF:
     292      case PM_FPA_FILE_ASTROM_MODEL:
     293      case PM_FPA_FILE_ASTROM_REFSTARS:
     294      case PM_FPA_FILE_JPEG:
     295      case PM_FPA_FILE_KAPA:
     296        break;
     297
     298      default:
    294299        psError(PS_ERR_IO, true, "Unsupported type for %s: %d", file->name, file->type);
    295300        return false;
     
    435440            }
    436441        }
     442        break;
     443      case PM_FPA_FILE_SUBKERNEL:
     444        status = pmSubtractionWriteKernels(view, file, config);
    437445        break;
    438446      case PM_FPA_FILE_SX:
     
    512520      case PM_FPA_FILE_FRINGE:
    513521      case PM_FPA_FILE_DARK:
     522      case PM_FPA_FILE_SUBKERNEL:
    514523      case PM_FPA_FILE_CMF:
    515524      case PM_FPA_FILE_PSF:
     
    577586        status = pmFPAviewFreeData(view, file);
    578587        break;
     588      case PM_FPA_FILE_SUBKERNEL:
    579589      case PM_FPA_FILE_SX:
    580590      case PM_FPA_FILE_RAW:
     
    720730      case PM_FPA_FILE_FRINGE:
    721731      case PM_FPA_FILE_DARK:
     732      case PM_FPA_FILE_SUBKERNEL:
    722733      case PM_FPA_FILE_CMF:
    723734      case PM_FPA_FILE_PSF:
     
    899910        status = pmFPAviewFitsWritePHU (view, file, config);
    900911        break;
     912      case PM_FPA_FILE_SUBKERNEL:
     913        status = pmSubtractionWritePHU(view, file, config);
    901914      case PM_FPA_FILE_CMF:
    902915        status = pmSource_CMF_WritePHU (view, file, config);
    903916        break;
    904917      case PM_FPA_FILE_PSF:
    905         status = pmPSFmodelWritePHU (view, file, config);
     918        status = pmPSFmodelWritePHU(view, file, config);
    906919        break;
    907920      case PM_FPA_FILE_ASTROM_REFSTARS:
  • trunk/psModules/src/imcombine/pmSubtractionIO.c

    r18146 r19189  
    11#include <stdio.h>
    22#include <pslib.h>
     3#include <strings.h>
    34
    45#include "pmHDU.h"
    56#include "pmFPA.h"
     7#include "pmFPAview.h"
     8#include "pmFPAfile.h"
     9#include "pmFPAfileFitsIO.h"
     10#include "pmConcepts.h"
    611
    712#include "pmSubtraction.h"
     
    6267}
    6368
     69//////////////////////////////////////////////////////////////////////////////////////////////////////////////
     70
    6471bool pmReadoutWriteSubtractionKernels(pmReadout *ro, psFits *fits)
    6572{
    6673    PM_ASSERT_READOUT_NON_NULL(ro, false);
    6774    PS_ASSERT_FITS_NON_NULL(fits, false);
    68 
    6975
    7076    // Extract the regions and solutions used in the image matching
     
    159165    // CVS tags, used to identify the version of this file (in case incompatibilities are introduced)
    160166    psString cvsFile = psStringCopy("$RCSfile: pmSubtractionIO.c,v $");
    161     psString cvsRev  = psStringCopy("$Revision: 1.1 $");
    162     psString cvsDate = psStringCopy("$Date: 2008-06-16 21:59:43 $");
     167    psString cvsRev  = psStringCopy("$Revision: 1.2 $");
     168    psString cvsDate = psStringCopy("$Date: 2008-08-25 22:14:04 $");
    163169    psStringSubstitute(&cvsFile, NULL, "RCSfile: ");
    164170    psStringSubstitute(&cvsRev,  NULL, "Revision: ");
     
    190196    return true;
    191197}
     198
     199static bool pmCellWriteSubtractionKernels(pmCell *cell, const pmFPAview *view,
     200                                          pmFPAfile *file, pmConfig *config)
     201{
     202    PS_ASSERT_PTR_NON_NULL(cell, false);
     203    PS_ASSERT_PTR_NON_NULL(cell->readouts, false);
     204    PS_ASSERT_PTR_NON_NULL(view, false);
     205
     206    pmFPAview *thisView = pmFPAviewAlloc(view->nRows); // Copy of input view
     207    *thisView = *view;
     208
     209    for (int i = 0; i < cell->readouts->n; i++) {
     210        pmReadout *readout = cell->readouts->data[i];
     211        thisView->readout = i;
     212        if (!pmReadoutWriteSubtractionKernels(readout, file->fits)) {
     213            psError(PS_ERR_IO, false, "Failed to write %dth readout", i);
     214            psFree(thisView);
     215            return false;
     216        }
     217    }
     218    psFree(thisView);
     219    return true;
     220}
     221
     222static bool pmChipWriteSubtractionKernels(pmChip *chip, const pmFPAview *view,
     223                                          pmFPAfile *file, pmConfig *config)
     224{
     225    PS_ASSERT_PTR_NON_NULL(chip, false);
     226    PS_ASSERT_PTR_NON_NULL(chip->cells, false);
     227    PS_ASSERT_PTR_NON_NULL(view, false);
     228
     229    pmFPAview *thisView = pmFPAviewAlloc(view->nRows); // Copy of input view
     230    *thisView = *view;
     231
     232    for (int i = 0; i < chip->cells->n; i++) {
     233        pmCell *cell = chip->cells->data[i];
     234        thisView->cell = i;
     235        if (!pmCellWriteSubtractionKernels(cell, thisView, file, config)) {
     236            psError(PS_ERR_IO, false, "Failed to write %dth cell", i);
     237            psFree(thisView);
     238            return false;
     239        }
     240    }
     241    psFree(thisView);
     242    return true;
     243}
     244
     245static bool pmFPAWriteSubtractionKernels(pmFPA *fpa, const pmFPAview *view,
     246                                         pmFPAfile *file, pmConfig *config)
     247{
     248    PS_ASSERT_PTR_NON_NULL(view, false);
     249    PS_ASSERT_PTR_NON_NULL(fpa, false);
     250    PS_ASSERT_PTR_NON_NULL(fpa->chips, false);
     251
     252    pmFPAview *thisView = pmFPAviewAlloc(view->nRows); // Copy of input view
     253    *thisView = *view;
     254
     255    for (int i = 0; i < fpa->chips->n; i++) {
     256        pmChip *chip = fpa->chips->data[i];
     257        thisView->chip = i;
     258        if (!pmChipWriteSubtractionKernels(chip, thisView, file, config)) {
     259            psError(PS_ERR_IO, false, "Failed to write %dth chip", i);
     260            psFree(thisView);
     261            return false;
     262        }
     263    }
     264    psFree(thisView);
     265    return true;
     266}
     267
     268//////////////////////////////////////////////////////////////////////////////////////////////////////////////
    192269
    193270
     
    283360    return true;
    284361}
     362
     363static bool pmCellReadSubtractionKernels(pmCell *cell, const pmFPAview *view,
     364                                         pmFPAfile *file, pmConfig *config)
     365{
     366    PS_ASSERT_PTR_NON_NULL(view, false);
     367    PS_ASSERT_PTR_NON_NULL(cell, false);
     368    PS_ASSERT_PTR_NON_NULL(cell->readouts, false);
     369
     370    pmFPAview *thisView = pmFPAviewAlloc(view->nRows); // Copy of input view
     371    *thisView = *view;
     372
     373    // Create a readout if none exists
     374    if (!cell->readouts || cell->readouts->n == 0) {
     375        pmReadout *readout = pmReadoutAlloc(cell); // New readout
     376        psFree(readout);                // Drop reference
     377    }
     378
     379    cell->data_exists = false;
     380    for (int i = 0; i < cell->readouts->n; i++) {
     381        pmReadout *readout = cell->readouts->data[i];
     382        thisView->readout = i;
     383        pmReadoutReadSubtractionKernels(readout, file->fits);
     384        if (!readout->data_exists) {
     385            continue;
     386        }
     387
     388        // load in the concept information for this cell
     389        if (!pmConceptsReadCell(cell, PM_CONCEPT_SOURCE_HEADER, true, NULL)) {
     390            psErrorClear();
     391            psWarning("Difficulty reading concepts for cell; attempting to proceed.");
     392        }
     393        cell->data_exists = true;
     394    }
     395    psFree(thisView);
     396
     397    return true;
     398}
     399
     400static bool pmChipReadSubtractionKernels(pmChip *chip, const pmFPAview *view,
     401                                         pmFPAfile *file, pmConfig *config)
     402{
     403    PS_ASSERT_PTR_NON_NULL(view, false);
     404    PS_ASSERT_PTR_NON_NULL(chip, false);
     405    PS_ASSERT_PTR_NON_NULL(chip->cells, false);
     406
     407    pmFPAview *thisView = pmFPAviewAlloc(view->nRows); // Copy of input view
     408    *thisView = *view;
     409
     410    chip->data_exists = false;
     411    for (int i = 0; i < chip->cells->n; i++) {
     412        pmCell *cell = chip->cells->data[i];
     413        thisView->cell = i;
     414        pmCellReadSubtractionKernels(cell, thisView, file, config);
     415        if (!cell->data_exists) {
     416            continue;
     417        }
     418        chip->data_exists = true;
     419    }
     420    psFree(thisView);
     421
     422    if (!pmConceptsReadChip(chip, PM_CONCEPT_SOURCE_HEADER, true, true, NULL)) {
     423        psError(PS_ERR_IO, false, "Failed to read concepts for chip.\n");
     424        return false;
     425    }
     426
     427    return true;
     428}
     429
     430static bool pmFPAReadSubtractionKernels(pmFPA *fpa, const pmFPAview *view,
     431                                        pmFPAfile *file, pmConfig *config)
     432{
     433    PS_ASSERT_PTR_NON_NULL(view, false);
     434    PS_ASSERT_PTR_NON_NULL(file, false);
     435    PS_ASSERT_PTR_NON_NULL(file->fpa, false);
     436    PS_ASSERT_PTR_NON_NULL(file->fpa->chips, false);
     437
     438    pmFPAview *thisView = pmFPAviewAlloc(view->nRows); // Copy of input view
     439    *thisView = *view;
     440
     441    for (int i = 0; i < fpa->chips->n; i++) {
     442        pmChip *chip = fpa->chips->data[i];
     443        thisView->chip = i;
     444        pmChipReadSubtractionKernels(chip, thisView, file, config);
     445    }
     446    psFree(thisView);
     447
     448    if (!pmConceptsReadFPA(fpa, PM_CONCEPT_SOURCE_HEADER, true, NULL)) {
     449        psError(PS_ERR_IO, false, "Failed to read concepts for fpa.\n");
     450        return false;
     451    }
     452
     453    return true;
     454}
     455
     456//////////////////////////////////////////////////////////////////////////////////////////////////////////////
     457
     458bool pmSubtractionWriteKernels(const pmFPAview *view, pmFPAfile *file, pmConfig *config)
     459{
     460    PS_ASSERT_PTR_NON_NULL(view, false);
     461    PS_ASSERT_PTR_NON_NULL(file, false);
     462    PS_ASSERT_PTR_NON_NULL(file->fpa, false);
     463
     464    pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); // Suitable FPA for writing
     465
     466    if (view->chip == -1) {
     467        if (!pmFPAWriteSubtractionKernels(fpa, view, file, config)) {
     468            psError(PS_ERR_IO, false, "Failed to write subtraction kernels from fpa");
     469            psFree(fpa);
     470            return false;
     471        }
     472        psFree(fpa);
     473        return true;
     474    }
     475
     476    if (view->chip >= fpa->chips->n) {
     477        psError(PS_ERR_UNKNOWN, false, "Writing chip == %d (>= chips->n == %ld)", view->chip, fpa->chips->n);
     478        psFree(fpa);
     479        return false;
     480    }
     481    pmChip *chip = fpa->chips->data[view->chip];
     482
     483    if (view->cell == -1) {
     484        if (!pmChipWriteSubtractionKernels(chip, view, file, config)) {
     485            psError(PS_ERR_IO, false, "Failed to write objects from chip");
     486            psFree(fpa);
     487            return false;
     488        }
     489        psFree(fpa);
     490        return true;
     491    }
     492
     493    if (view->cell >= chip->cells->n) {
     494        psError(PS_ERR_UNKNOWN, false, "Writing cell == %d (>= cells->n == %ld)",
     495                view->cell, chip->cells->n);
     496        psFree(fpa);
     497        return false;
     498    }
     499    pmCell *cell = chip->cells->data[view->cell];
     500
     501    if (view->readout == -1) {
     502        if (!pmCellWriteSubtractionKernels(cell, view, file, config)) {
     503            psError(PS_ERR_IO, false, "Failed to write objects from cell");
     504            psFree(fpa);
     505            return false;
     506        }
     507        psFree(fpa);
     508        return true;
     509    }
     510
     511    if (view->readout >= cell->readouts->n) {
     512        psError(PS_ERR_UNKNOWN, false, "Writing readout == %d (>= readouts->n == %ld)",
     513                view->readout, cell->readouts->n);
     514        psFree(fpa);
     515        return false;
     516    }
     517    pmReadout *readout = cell->readouts->data[view->readout];
     518
     519    if (!pmReadoutWriteSubtractionKernels(readout, file->fits)) {
     520        psError(PS_ERR_IO, false, "Failed to write objects from readout %d", view->readout);
     521        psFree(fpa);
     522        return false;
     523    }
     524
     525    psFree(fpa);
     526    return true;
     527}
     528
     529bool pmSubtractionWritePHU(const pmFPAview *view, pmFPAfile *file, pmConfig *config)
     530{
     531    PS_ASSERT_PTR_NON_NULL(view, false);
     532    PS_ASSERT_PTR_NON_NULL(file, false);
     533
     534    if (file->wrote_phu) {
     535        return true;
     536    }
     537    if (file->fileLevel != PM_FPA_LEVEL_FPA) {
     538        return true;
     539    }
     540    if (file->fpa->chips->n == 1) {
     541        return true;
     542    }
     543
     544    // find the FPA phu
     545    pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); // Suitable FPA for writing
     546    pmHDU *phu = psMemIncrRefCounter(pmFPAviewThisPHU(view, fpa));
     547    psFree(fpa);
     548
     549    // if there is no PHU, this is a single header+image (extension-less) file. This could be the case for an
     550    // input SPLIT set of files being written out as a MEF.  if there is a PHU, write it out as a 'blank'
     551    psMetadata *outhead = psMetadataAlloc();
     552    if (phu) {
     553        psMetadataCopy (outhead, phu->header);
     554    }
     555    psFree(phu);
     556
     557    pmConfigConformHeader(outhead, file->format);
     558
     559    psFitsWriteBlank(file->fits, outhead, "");
     560    file->wrote_phu = true;
     561
     562    psTrace("pmFPAfile", 5, "wrote phu %s (type: %d)\n", file->filename, file->type);
     563    psFree(outhead);
     564
     565    return true;
     566}
     567
     568bool pmSubtractionReadKernels(const pmFPAview *view, pmFPAfile *file, pmConfig *config)
     569{
     570    PS_ASSERT_PTR_NON_NULL(view, false);
     571    PS_ASSERT_PTR_NON_NULL(file, false);
     572    PS_ASSERT_PTR_NON_NULL(file->fpa, false);
     573
     574    pmFPA *fpa = file->fpa;
     575
     576    if (view->chip == -1) {
     577        pmFPAReadSubtractionKernels(fpa, view, file, config);
     578        return true;
     579    }
     580
     581    if (view->chip >= fpa->chips->n) {
     582        return false;
     583    }
     584    pmChip *chip = fpa->chips->data[view->chip];
     585
     586    if (view->cell == -1) {
     587        pmChipReadSubtractionKernels(chip, view, file, config);
     588        return true;
     589    }
     590
     591    if (view->cell >= chip->cells->n) {
     592        return false;
     593    }
     594    pmCell *cell = chip->cells->data[view->cell];
     595
     596    if (view->readout == -1) {
     597        pmCellReadSubtractionKernels(cell, view, file, config);
     598        return true;
     599    }
     600
     601    if (view->readout >= cell->readouts->n) {
     602        return false;
     603    }
     604    pmReadout *readout = cell->readouts->data[view->readout];
     605
     606    return pmReadoutReadSubtractionKernels(readout, file->fits);
     607}
  • trunk/psModules/src/imcombine/pmSubtractionIO.h

    r18146 r19189  
    2020
    2121
     22bool pmSubtractionReadKernels(const pmFPAview *view, ///< View into which to read
     23                              pmFPAfile *file, ///< File from which to read
     24                              pmConfig *config ///< Configuration
     25                              );
     26
     27bool pmSubtractionWriteKernels(const pmFPAview *view, ///< View from which to write
     28                               pmFPAfile *file, ///< File to which to write
     29                               pmConfig *config ///< Configuration
     30                               );
     31
     32bool pmSubtractionWritePHU(const pmFPAview *view, // View to PHU
     33                           pmFPAfile *file, ///< File to which to write
     34                           pmConfig *config ///< Configuration
     35                           );
     36
    2237#endif
Note: See TracChangeset for help on using the changeset viewer.