IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 30, 2010, 9:31:50 AM (16 years ago)
Author:
eugene
Message:

updates from trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20100621/ippToPsps/src/ippToPspsBatchDetection.c

    r28439 r28794  
    1414
    1515// Gets uncalibrated instrumental flux from magnitude
    16 static __inline bool ippToPsps_getFlux(const float zeroPoint, const float exposureTime, const float magnitude, float* flux) {
     16static __inline bool ippToPsps_getFlux(const float exposureTime, const float magnitude, float* flux, const float magnitudeErr, float* fluxErr) {
    1717
    1818    *flux = powf(10.0, -0.4*magnitude) / exposureTime;
    19     return (!isfinite(*flux) || *flux < 0.000001) ? false : true;
     19    if (!isfinite(*flux) || *flux < 0.000001) return false;
     20    if (fluxErr) *fluxErr = fabsf((magnitudeErr * *flux)/1.085736);
     21    //  if (fluxErr)    printf("Mag = %03.03f, Flux = %03.03f, Mag err = %03.03f, Flux Err = %03.03f\n", magnitude, *flux, magnitudeErr, *fluxErr);
     22         
     23    return true;
    2024}
    2125
     
    4650    fits_get_hdrspace(fitsIn, &nKeys, NULL, &status);
    4751
    48     float zptObs, zeroPoint, exposureTime;
     52    float zptObs, exposureTime;
    4953    char filterType[20];
    5054    double obsTime;
     
    5256    double expTime;
    5357    status=0; fits_read_key(fitsIn, TFLOAT, "ZPT_OBS", &zptObs, NULL, &status);
    54     status=0; fits_read_key(fitsIn, TFLOAT, "ZPT_REF", &zeroPoint, NULL, &status);
    5558    status=0; fits_read_key(fitsIn, TFLOAT, "EXPREQ", &exposureTime, NULL, &status);
    5659    status=0; fits_read_key(fitsIn, TSTRING, "FILTERID", filterType, NULL, &status);
    5760    status=0; fits_read_key(fitsIn, TDOUBLE, "MJD-OBS", &expStart, NULL, &status);
    5861    status=0; fits_read_key(fitsIn, TDOUBLE, "EXPTIME", &expTime, NULL, &status);
    59     obsTime = expStart + (expTime/172800); // exp start plus half exp time (converted from secs to days)
     62    obsTime = expStart + (expTime/172800.0); // exp start plus half exp time (converted from secs to days)
    6063   
    6164    ippToPspsConfig_writeTable(this->config, fitsIn, this->fitsOut, 1, "FrameMeta", true);
     
    8386
    8487    // stuff to keep from psf.hdr header
    85     int sourceId = -1;
    86     int imageId = -1;
    87     float fwhmMaj;
    88     float fwhmMin;
    89     float momentMaj;
    90     float momentMin;
    91     float psfFwhm;
    92     float momentFwhm;
     88    int sourceId = -1, imageId = -1;
     89    float fwhmMaj, fwhmMin, momentMaj, momentMin, psfFwhm, momentFwhm;
    9390    long pspsImageId = -1;
    9491
     
    9693    SkyList *skylist = NULL;
    9794    dvoDetection *dvoDetections = NULL;
    98     int maxDvoDetId = -1;
    99     int numDvoDetections = -1;
     95    int maxDvoDetId = -1, numDvoDetections = -1;
    10096    Image *image = NULL;
    10197
     
    108104    strftime(timeStr, sizeof(timeStr), "%Y-%m-%d", ts);
    109105
    110     uint32_t totalDetections = 0;
    111     uint32_t s,d;
    112     uint32_t invalidDvoRows;
    113     uint32_t smfJumps;
    114     uint32_t unmatched;
     106    uint32_t s,d, invalidDvoRows, smfJumps, unmatched, totalDetections = 0;
    115107
    116108    long longnull = -999;
     
    118110    int anynull = 0;
    119111
    120     char ccdNumber[3];
    121     char extensionName[15];
    122 
     112    char ccdNumber[3], extensionName[15];
     113
     114    // for storing FITS column data
    123115    long ippIDet[MAXDETECT];
    124     float instMag[MAXDETECT];
    125     float instMagErr[MAXDETECT];
    126     float peakMag[MAXDETECT];
     116    float instMag[MAXDETECT], instMagErr[MAXDETECT], peakMag[MAXDETECT];
    127117    uint64_t flags[MAXDETECT];
    128     long objID[MAXDETECT];
    129     long detectID[MAXDETECT];
    130     long ippObjID[MAXDETECT];
    131     long ippDetectID[MAXDETECT];
    132     long imageID[MAXDETECT];
     118    long objID[MAXDETECT], detectID[MAXDETECT], ippObjID[MAXDETECT], ippDetectID[MAXDETECT], imageID[MAXDETECT];
    133119    double obsTimes[MAXDETECT];
    134     float instFlux[MAXDETECT];
    135     float instFluxErr[MAXDETECT];
    136     float peakFlux[MAXDETECT];
    137     int8_t filterIDs[MAXDETECT];
    138     int8_t surveyIDs[MAXDETECT];
     120    float instFlux[MAXDETECT], instFluxErr[MAXDETECT], peakFlux[MAXDETECT];
     121    int8_t filterIDs[MAXDETECT], surveyIDs[MAXDETECT];
    139122
    140123    char** assocDate = (char**)calloc(MAXDETECT, sizeof(char**));
     
    149132    }
    150133
    151     long maxObjID = LONG_MIN;
    152     long minObjID = LONG_MAX;
     134    long maxObjID = LONG_MIN, minObjID = LONG_MAX;
    153135    uint64_t imageFlags;
    154136    short nOta = 0;
    155137    long i;
    156138    bool isDuplicate;
    157     uint32_t numOfDuplicates;
    158     uint32_t numInvalidFlux;
    159     long numDetectionsOut;
    160     long totalDetectionsOut = 0;
     139    uint32_t numOfDuplicates, numInvalidFlux;
     140    long numDetectionsOut, totalDetectionsOut = 0, numPhotoRef, totalNumPhotoRef = 0;
    161141    long removeList[MAXDETECT];
    162142    long thisObjId;
     143    bool firstTimeIn = true, peakFluxOk, instFluxOk;
     144    int ippIDetNum, instMagNum, instMagErrNum, peakMagNum;
    163145
    164146    // loop round all 60 chips
     
    197179            status=0; fits_read_key(fitsIn, TLONG, "IMAGEID", &imageId, NULL, &status);
    198180            status=0; fits_read_key(fitsIn, TLONG, "SOURCEID", &sourceId, NULL, &status);
     181            status=0; fits_read_key(fitsIn, TLONG, "NASTRO", &numPhotoRef, NULL, &status);
     182            totalNumPhotoRef += numPhotoRef; // total up for storing in FrameMeta
    199183
    200184            // access DVO database
     
    202186            if (skylist == NULL) {
    203187                psError(PS_ERR_IO, false,
    204                         "DVO: can't find SkyList for sourceId='%d' imageId='%d' (CCD = XY%s): skipping\n",
     188                        "DVO: can't find SkyList for sourceId='%d' imageId='%d' (CCD = XY%s): skipping this chip\n",
    205189                        sourceId, imageId, ccdNumber);
    206190                continue;
     
    251235            s = d = totalDetections = invalidDvoRows = smfJumps = unmatched = 0;
    252236
     237            // determine column numbers for certain IPP detection columns
     238            if (firstTimeIn) {
     239
     240                status=0;fits_get_colnum(fitsIn, CASESEN, "IPP_IDET", &ippIDetNum, &status);
     241                if (status) psError(PS_ERR_IO, false, "Unable to read col num for IPP_IDET");
     242                status=0;fits_get_colnum(fitsIn, CASESEN, "PSF_INST_MAG", &instMagNum, &status);
     243                if (status) psError(PS_ERR_IO, false, "Unable to read col num for PSF_INST_MAG");
     244                status=0;fits_get_colnum(fitsIn, CASESEN, "PSF_INST_MAG_SIG", &instMagErrNum, &status);
     245                if (status) psError(PS_ERR_IO, false, "Unable to read col num for PSF_INST_MAG_SIG");
     246                status=0;fits_get_colnum(fitsIn, CASESEN, "PEAK_FLUX_AS_MAG", &peakMagNum, &status);
     247                if (status) psError(PS_ERR_IO, false, "Unable to read col num for PEAK_FLUX_AS_MAG");
     248
     249                firstTimeIn=false;
     250            }
     251
    253252            anynull = 0;
    254             fits_read_col(fitsIn, TLONG, 1, 1, 1, nDet, &longnull, ippIDet, &anynull, &status);
    255             fits_read_col(fitsIn, TFLOAT, 8, 1, 1, nDet, &floatnull, instMag, &anynull, &status);
    256             fits_read_col(fitsIn, TFLOAT, 9, 1, 1, nDet, &floatnull, instMagErr, &anynull, &status);
    257             fits_read_col(fitsIn, TFLOAT, 12, 1, 1, nDet, &floatnull, peakMag, &anynull, &status);
     253            fits_read_col(fitsIn, TLONG, ippIDetNum, 1, 1, nDet, &longnull, ippIDet, &anynull, &status);
     254            fits_read_col(fitsIn, TFLOAT, instMagNum, 1, 1, nDet, &floatnull, instMag, &anynull, &status);
     255            fits_read_col(fitsIn, TFLOAT, instMagErrNum, 1, 1, nDet, &floatnull, instMagErr, &anynull, &status);
     256            fits_read_col(fitsIn, TFLOAT, peakMagNum, 1, 1, nDet, &floatnull, peakMag, &anynull, &status);
    258257
    259258            // DVO detections are ordered by IPP_IDET, which increments from 0 in SMF table
     
    297296                    obsTimes[s] = obsTime;
    298297
    299                     ippToPsps_getFlux(zeroPoint, exposureTime, instMagErr[s], &instFluxErr[s]);
     298                    // calculate flux and flux errors from magnitudes
     299                    peakFluxOk = ippToPsps_getFlux(exposureTime, peakMag[s], &peakFlux[s], 0.0, NULL);
     300                    instFluxOk = ippToPsps_getFlux(exposureTime, instMag[s], &instFlux[s], instMagErr[s], &instFluxErr[s]);
    300301
    301302                    // check for invalid flux values (if not already labelled as a duplicate)
    302                     if ((!ippToPsps_getFlux(zeroPoint, exposureTime, peakMag[s], &peakFlux[s]) ||
    303                                 !ippToPsps_getFlux(zeroPoint, exposureTime, instMag[s], &instFlux[s])) && !isDuplicate) {
     303                    if ( (!peakFluxOk || !instFluxOk) && !isDuplicate) {
    304304                        removeList[numOfDuplicates+numInvalidFlux] = s+1;
    305305                        numInvalidFlux++;
     
    379379    if (fits_movnam_hdu(this->fitsOut, BINARY_TBL, "FrameMeta", 0, &status))
    380380        psError(PS_ERR_IO, false, "Can't move back to FrameMeta extension to write number of OTAs\n");
    381     else
     381    else {
    382382        fits_write_col(this->fitsOut, TSHORT, FRAMEMETA_NOTA, 1, 1, 1, &nOta, &status);
    383 
     383        fits_write_col(this->fitsOut, TSHORT, FRAMEMETA_NUMPHOTOREF, 1, 1, 1, &totalNumPhotoRef, &status);
     384    }
    384385    status=0;
    385386    if (fits_close_file(fitsIn, &status)) fits_report_error(stderr, status);
    386387
    387388    // write results
    388     if (this->resultsFile) {
    389 
    390         if (fprintf(this->resultsFile, "%ld\n", minObjID) < 1 )
    391             psError(PS_ERR_IO, false, "Unable to write min Object ID to'%s'\n", this->resultsPath);
    392         if (fprintf(this->resultsFile, "%ld\n", maxObjID) < 1 )
    393             psError(PS_ERR_IO, false, "Unable to write max Object ID to'%s'\n", this->resultsPath);
    394         if (fprintf(this->resultsFile, "%ld\n", totalDetectionsOut) < 1 )
    395             psError(PS_ERR_IO, false, "Unable to write totalDetectionsOut to'%s'\n", this->resultsPath);
     389    if (this->resultsXmlDoc) {
     390
     391        xmlNodePtr rootNode = xmlDocGetRootElement(this->resultsXmlDoc);
     392        char tmp[100];
     393        sprintf(tmp, "%ld", minObjID);
     394        xmlNewChild(rootNode, NULL, BAD_CAST "minObjID", BAD_CAST tmp);
     395        sprintf(tmp, "%ld", maxObjID);
     396        xmlNewChild(rootNode, NULL, BAD_CAST "maxObjID", BAD_CAST tmp);
     397        sprintf(tmp, "%ld", totalDetectionsOut);
     398        xmlNewChild(rootNode, NULL, BAD_CAST "totalDetections", BAD_CAST tmp);
    396399    }
    397400
     
    403406}
    404407
    405 
Note: See TracChangeset for help on using the changeset viewer.