IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 24, 2009, 8:40:34 AM (17 years ago)
Author:
eugene
Message:

various petrosian / radial profile analysis improvements

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/20090715/psphot/src/psphotPetrosianRadialBins.c

    r25105 r25178  
    1212// finely spaced than r_{i+1} = r_i * \beta / \alpha.  for the integration, we need to
    1313// track the non-overlapping radius values.
    14 
    15 # define PETROSIAN_ALPHA 0.8
    16 # define PETROSIAN_BETA 1.25
    1714
    1815bool psphotPetrosianRadialBins (pmSource *source, pmPetrosian *petrosian, float radiusMax) {
     
    3330    psVector *radBet  = psVectorAllocEmpty(nMax, PS_TYPE_F32);
    3431
    35     psVector *fluxBin = psVectorAllocEmpty(nMax, PS_TYPE_F32);
    36     psVector *radBin  = psVectorAllocEmpty(nMax, PS_TYPE_F32);
    37     psVector *area    = psVectorAllocEmpty(nMax, PS_TYPE_F32);
     32    psVector *binSB      = psVectorAllocEmpty(nMax, PS_TYPE_F32); // surface brightness of radial bin
     33    psVector *binSBstdev = psVectorAllocEmpty(nMax, PS_TYPE_F32); // surface brightness of radial bin
     34    psVector *binRad     = psVectorAllocEmpty(nMax, PS_TYPE_F32); // mean radius of radial bin
     35    psVector *binArea    = psVectorAllocEmpty(nMax, PS_TYPE_F32); // area of radial bin (contiguous, non-overlapping)
    3836
    39     psVectorInit (fluxBin, 0.0);
    40     psVectorInit (radBin, 0.0);
     37    psVectorInit (binSB, 0.0);
     38    psVectorInit (binSBstdev, 0.0);
     39    psVectorInit (binRad, 0.0);
    4140
    4241    // generate radial bin bounds
     
    5655    radBet->data.F32[2] = 2.0;
    5756   
    58     int nPts = 3;
    59     for (int i = 3; i < radiusMax; i++) {
    60         radMin->data.F32[nPts] = (i - 1);
    61         radMax->data.F32[nPts] = i;
    62         nPts++;
     57# define PETROSIAN_ALPHA 0.8
     58# define PETROSIAN_BETA 1.25
     59# define POWER_LAW_SPACING true
     60   
     61    // power-law spacing with overlapping boundaries at the geometric mid-points
     62    float rBeta = sqrt(PETROSIAN_BETA);
     63    for (int i = 3; radBet->data.F32[i-1] < radiusMax; i++) {
     64        if (POWER_LAW_SPACING) {
     65            radMin->data.F32[i] = radMax->data.F32[i-1];
     66            radMax->data.F32[i] = radMin->data.F32[i] * PETROSIAN_BETA;
     67            radAlp->data.F32[i] = radMin->data.F32[i] / rBeta;
     68            radBet->data.F32[i] = radMax->data.F32[i] * rBeta;
     69        } else {
     70            radMin->data.F32[i] = radMax->data.F32[i-1];
     71            radMax->data.F32[i] = radMin->data.F32[i] + 1;
     72            float rMid = 0.5*(radMin->data.F32[i] + radMax->data.F32[i]);
     73            radAlp->data.F32[i] = rMid * PETROSIAN_ALPHA;
     74            radBet->data.F32[i] = rMid * PETROSIAN_BETA;
     75        }
     76        radMin->n = radMax->n = radAlp->n = radBet->n = i + 1;
    6377    }
    64     radMin->n = radMax->n = radAlp->n = radBet->n = nPts;
    6578
    6679    // generate radial area-weighted mean radius & non-overlapping areas
     
    7891       
    7992        // XXX calculate area-weighted radius rather than asserting?
    80         radBin->data.F32[i] = rBin;
    81         area->data.F32[i] = M_PI * (rMax2 - rMin2);
     93        binRad->data.F32[i] = rBin;
     94        binArea->data.F32[i] = M_PI * (rMax2 - rMin2);
    8295
    83         if (i > 2) {
    84             radAlp->data.F32[i] = rBin*PETROSIAN_ALPHA;
    85             radBet->data.F32[i] = rBin*PETROSIAN_BETA;
     96        if (0) {
     97            fprintf (stderr, "%3d  %5.1f %5.1f : %5.1f : %5.1f %5.1f\n",
     98                 i, radAlp->data.F32[i], radMin->data.F32[i], binRad->data.F32[i],
     99                 radMax->data.F32[i], radBet->data.F32[i]);
    86100        }
    87101    }
     
    89103    // storage vector for stats
    90104    psVector *values = psVectorAllocEmpty (flux->n, PS_TYPE_F32);
    91     psStats *stats = psStatsAlloc(PS_STAT_SAMPLE_MEDIAN);
     105    psStats *stats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV);
    92106
    93107    // integrate flux, radius for each of these bins.  since flux is sorted by radius,
     
    107121            // calculate the value for the nOut bin
    108122            psVectorStats (stats, values, NULL, NULL, 0);
    109             fluxBin->data.F32[nOut] = stats->sampleMedian;
     123            // binSB->data.F32[nOut] = stats->sampleMedian;
     124            binSB->data.F32[nOut] = stats->robustMedian;
     125            binSBstdev->data.F32[nOut] = stats->robustStdev / sqrt(values->n);
     126
     127            if (1) {
     128                fprintf (stderr, "%3d  %5.1f %5.1f : %5.1f  %5.2f\n",
     129                         nOut, radAlp->data.F32[nOut], radBet->data.F32[nOut], binSB->data.F32[nOut], binSBstdev->data.F32[nOut]);
     130            }
     131
    110132            nOut ++;
    111             if (nOut >= nMax) break;
     133            if (nOut >= radAlp->n) break;
    112134            Rmin = radAlp->data.F32[nOut];
    113135            Rmax = radBet->data.F32[nOut];
     
    122144        psVectorAppend (values, flux->data.F32[i]);
    123145    }
    124     fluxBin->n = radBin->n = area->n = nOut;
     146    binSB->n = binSBstdev->n = binRad->n = binArea->n = nOut;
    125147    // XXX I think this misses the last radial bin -- do we care?
    126148
    127149    // save the vectors
    128     petrosian->radialBins = radBin;
    129     petrosian->area = area;
    130     petrosian->binnedFlux = fluxBin;
     150    petrosian->radialBins = binRad;
     151    petrosian->area       = binArea;
     152    petrosian->binSB      = binSB;
     153    petrosian->binSBstdev = binSBstdev;
    131154
    132     psphotPetrosianVisualProfileRadii (radius, flux, radBin, fluxBin, 0.0);
     155    psphotPetrosianVisualProfileRadii (radius, flux, binRad, binSB, 0.0);
    133156
    134157    psFree(radMin);
Note: See TracChangeset for help on using the changeset viewer.