- Timestamp:
- Aug 24, 2009, 8:40:34 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20090715/psphot/src/psphotPetrosianRadialBins.c
r25105 r25178 12 12 // finely spaced than r_{i+1} = r_i * \beta / \alpha. for the integration, we need to 13 13 // track the non-overlapping radius values. 14 15 # define PETROSIAN_ALPHA 0.816 # define PETROSIAN_BETA 1.2517 14 18 15 bool psphotPetrosianRadialBins (pmSource *source, pmPetrosian *petrosian, float radiusMax) { … … 33 30 psVector *radBet = psVectorAllocEmpty(nMax, PS_TYPE_F32); 34 31 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) 38 36 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); 41 40 42 41 // generate radial bin bounds … … 56 55 radBet->data.F32[2] = 2.0; 57 56 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; 63 77 } 64 radMin->n = radMax->n = radAlp->n = radBet->n = nPts;65 78 66 79 // generate radial area-weighted mean radius & non-overlapping areas … … 78 91 79 92 // 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); 82 95 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]); 86 100 } 87 101 } … … 89 103 // storage vector for stats 90 104 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); 92 106 93 107 // integrate flux, radius for each of these bins. since flux is sorted by radius, … … 107 121 // calculate the value for the nOut bin 108 122 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 110 132 nOut ++; 111 if (nOut >= nMax) break;133 if (nOut >= radAlp->n) break; 112 134 Rmin = radAlp->data.F32[nOut]; 113 135 Rmax = radBet->data.F32[nOut]; … … 122 144 psVectorAppend (values, flux->data.F32[i]); 123 145 } 124 fluxBin->n = radBin->n = area->n = nOut;146 binSB->n = binSBstdev->n = binRad->n = binArea->n = nOut; 125 147 // XXX I think this misses the last radial bin -- do we care? 126 148 127 149 // 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; 131 154 132 psphotPetrosianVisualProfileRadii (radius, flux, radBin, fluxBin, 0.0);155 psphotPetrosianVisualProfileRadii (radius, flux, binRad, binSB, 0.0); 133 156 134 157 psFree(radMin);
Note:
See TracChangeset
for help on using the changeset viewer.
