- Timestamp:
- Mar 17, 2009, 12:08:50 PM (17 years ago)
- Location:
- branches/cnb_branches/cnb_branch_20090301
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/cnb_branches/cnb_branch_20090301
-
Property svn:mergeinfo
set to (toggle deleted branches)
/trunk merged eligible /branches/eam_branches/eam_branch_20090303 23158-23228
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/cnb_branches/cnb_branch_20090301/ppStack
-
Property svn:mergeinfo
set to (toggle deleted branches)
/branches/cnb_branches/cnb_branch_20090215/ppStack merged eligible /trunk/ppStack merged eligible /branches/cnb_branch_20090215/ppStack 21495-22685 /branches/eam_branches/eam_branch_20090303/ppStack 23158-23228
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/cnb_branches/cnb_branch_20090301/ppStack/src/ppStackSources.c
r21260 r23352 13 13 #define FAKE_ROWS 4913 14 14 15 float ppStackSourcesTransparency(const psArray *sourceLists, const pmFPAview *view, const pmConfig *config) 15 #ifdef TESTING 16 // Dump matches to a file 17 static void dumpMatches(const char *filename, // File to which to dump 18 int num, // Number of inputs 19 psArray *matches, // Star matches 20 psVector *zp, // Zero points 21 psVector *trans // Transparencies 22 ) 23 { 24 FILE *outMatches = fopen(filename, "w"); // Output matches 25 psVector *mag = psVectorAlloc(num, PS_TYPE_F32); // Magnitudes for each star 26 psVector *magErr = psVectorAlloc(num, PS_TYPE_F32); // Errors for each star 27 for (int i = 0; i < matches->n; i++) { 28 pmSourceMatch *match = matches->data[i]; // Match of interest 29 psVectorInit(mag, NAN); 30 psVectorInit(magErr, NAN); 31 for (int j = 0; j < match->num; j++) { 32 if (match->mask->data.PS_TYPE_VECTOR_MASK_DATA[j]) { 33 continue; 34 } 35 int index = match->image->data.U32[j]; // Image index 36 mag->data.F32[index] = match->mag->data.F32[j] - zp->data.F32[index]; 37 if (trans) { 38 mag->data.F32[index] -= trans->data.F32[index]; 39 } 40 magErr->data.F32[index] = match->magErr->data.F32[j]; 41 } 42 for (int j = 0; j < num; j++) { 43 fprintf(outMatches, "%f (%f) ", mag->data.F32[j], magErr->data.F32[j]); 44 } 45 fprintf(outMatches, "\n"); 46 } 47 psFree(mag); 48 psFree(magErr); 49 fclose(outMatches); 50 return; 51 } 52 #endif 53 54 55 float ppStackSourcesTransparency(const psArray *sourceLists, psVector *inputMask, 56 const pmFPAview *view, const pmConfig *config) 16 57 { 17 58 PS_ASSERT_ARRAY_NON_NULL(sourceLists, NAN); 59 PS_ASSERT_VECTOR_NON_NULL(inputMask, NAN); 60 PS_ASSERT_VECTOR_TYPE(inputMask, PS_TYPE_U8, NAN); 61 PS_ASSERT_VECTOR_SIZE(inputMask, sourceLists->n, NAN); 18 62 PS_ASSERT_PTR_NON_NULL(view, NAN); 19 63 PS_ASSERT_PTR_NON_NULL(config, NAN); 20 64 21 #if def TESTING65 #if defined(TESTING) && 0 22 66 { 23 67 // Deliberately induce a major transparency difference … … 37 81 38 82 float radius = psMetadataLookupF32(NULL, recipe, "ZP.RADIUS"); // Radius (pixels) for matching sources 39 int iter = psMetadataLookupS32(NULL, recipe, "ZP.ITER"); // Maximum iterations 83 int iter1 = psMetadataLookupS32(NULL, recipe, "ZP.ITER.1"); // Maximum iterations for pass 1 84 int iter2 = psMetadataLookupS32(NULL, recipe, "ZP.ITER.2"); // Maximum iterations for pass 2 40 85 float tol = psMetadataLookupF32(NULL, recipe, "ZP.TOL"); // Tolerance for zero point iterations 41 86 int transIter = psMetadataLookupS32(NULL, recipe, "ZP.TRANS.ITER"); // Iterations for transparency 42 87 float transRej = psMetadataLookupF32(NULL, recipe, "ZP.TRANS.REJ");// Rejection threshold for transparency 43 88 float transThresh = psMetadataLookupF32(NULL, recipe, "ZP.TRANS.THRESH"); // Threshold for transparency 44 float starRej = psMetadataLookupF32(NULL, recipe, "ZP.STAR.REJ"); // Rejection threshold for stars 89 90 float starRej1 = psMetadataLookupF32(NULL, recipe, "ZP.STAR.REJ.1"); // Rejection threshold for stars 91 float starSys1 = psMetadataLookupF32(NULL, recipe, "ZP.STAR.SYS.1"); // Estimated systematic error 92 float starRej2 = psMetadataLookupF32(NULL, recipe, "ZP.STAR.REJ.2"); // Rejection threshold for stars 93 float starSys2 = psMetadataLookupF32(NULL, recipe, "ZP.STAR.SYS.2"); // Estimated systematic error 94 45 95 float starLimit = psMetadataLookupF32(NULL, recipe, "ZP.STAR.LIMIT"); // Limit on star rejection fraction 46 float starSys = psMetadataLookupF32(NULL, recipe, "ZP.STAR.SYS"); // Estimated systematic error 96 97 float fracMatch = psMetadataLookupF32(NULL, recipe, "ZP.MATCH"); // Fraction of images to match for star 47 98 48 99 psMetadata *airmassZP = psMetadataLookupMetadata(NULL, recipe, "ZP.AIRMASS"); // Airmass terms … … 63 114 pmCell *cell = pmFPAviewThisCell(view, file->fpa); // Cell of interest 64 115 65 #if def TESTING116 #if defined(TESTING) && 0 66 117 pmReadout *fake = pmReadoutAlloc(NULL); // Fake readout 67 118 pmPSF *psf = psMetadataLookupPtr(NULL, config->arguments, "PSF.TARGET"); // PSF for fake image 68 pmReadoutFakeFromSources(fake, FAKE_COLS, FAKE_ROWS, sourceLists->data[i], NULL, NULL, psf, 5, 0, false, true); 119 pmReadoutFakeFromSources(fake, FAKE_COLS, FAKE_ROWS, sourceLists->data[i], 120 NULL, NULL, psf, 5, 0, false, true); 69 121 psString name = NULL; 70 122 psStringAppend(&name, "start_%03d.fits", i); 123 pmStackVisualPlotTestImage(fake->image, name); 71 124 psFits *fits = psFitsOpen(name, "w"); 72 125 psFree(name); … … 108 161 } 109 162 110 psArray *matches = pmSourceMatchSources(sourceLists, radius ); // List of matches163 psArray *matches = pmSourceMatchSources(sourceLists, radius, true); // List of matches 111 164 if (!matches) { 112 165 psError(PS_ERR_UNKNOWN, false, "Unable to match sources"); … … 114 167 return NAN; 115 168 } 116 psVector *trans = pmSourceMatchRelphot(matches, zp, iter, tol, starLimit, transIter, transRej, 117 transThresh, starRej, starSys); // Transparencies for each image 118 119 #ifdef TESTING 120 { 121 // Dump the corrected magnitudes 122 FILE *outMatches = fopen("source_match.dat", "w"); // Output matches 123 psVector *mag = psVectorAlloc(num, PS_TYPE_F32); // Magnitudes for each star 124 psVector *magErr = psVectorAlloc(num, PS_TYPE_F32); // Errors for each star 125 for (int i = 0; i < matches->n; i++) { 126 pmSourceMatch *match = matches->data[i]; // Match of interest 127 psVectorInit(mag, NAN); 128 psVectorInit(magErr, NAN); 129 for (int j = 0; j < match->num; j++) { 130 if (match->mask->data.PS_TYPE_VECTOR_MASK_DATA[j]) { 131 continue; 132 } 133 int index = match->image->data.U32[j]; // Image index 134 mag->data.F32[index] = match->mag->data.F32[j] - zp->data.F32[index] - trans->data.F32[index]; 135 magErr->data.F32[index] = match->magErr->data.F32[j]; 136 } 137 for (int j = 0; j < num; j++) { 138 fprintf(outMatches, "%f (%f) ", mag->data.F32[j], magErr->data.F32[j]); 139 } 140 fprintf(outMatches, "\n"); 141 } 142 psFree(mag); 143 psFree(magErr); 144 fclose(outMatches); 145 } 146 #endif 169 170 #ifdef TESTING 171 dumpMatches("source_match.dat", num, matches, zp, NULL); 172 #endif 173 174 psVector *trans = pmSourceMatchRelphot(matches, zp, tol, iter1, starRej1, starSys1, 175 iter2, starRej2, starSys2, starLimit, 176 transIter, transRej, transThresh); // Transparencies for each image 177 if (!trans) { 178 psError(PS_ERR_UNKNOWN, false, "Unable to measure transparencies"); 179 return NAN; 180 } 181 182 #ifdef TESTING 183 dumpMatches("source_mags.dat", num, matches, zp, trans); 184 #endif 185 186 for (int i = 0; i < trans->n; i++) { 187 if (!isfinite(trans->data.F32[i])) { 188 inputMask->data.U8[i] = PPSTACK_MASK_CAL; 189 } 190 } 147 191 148 192 // Save best matches SOMEWHERE for future photometry 149 193 // XXX this is a really poor output location; clean up the pmFPAfiles used in ppStack 150 194 pmCell *sourcesCell = pmFPAfileThisCell(config->files, view, "PPSTACK.OUTPUT"); 151 psArray *sourcesBest = psArrayAllocEmpty (100);152 153 // XXX something of a hack: require at 2 detections or 1/2of the max possible154 int minMatches = PS_MAX (2, 0.5*num);195 psArray *sourcesBest = psArrayAllocEmpty(matches->n); 196 197 // XXX something of a hack: require at least 2 detections or the nominated fraction of the max possible 198 int minMatches = PS_MAX(2, fracMatch * num);// Minimum number of matches required 155 199 for (int i = 0; i < matches->n; i++) { 156 pmSourceMatch *match = matches->data[i]; // Match of interest 157 if (match->num < minMatches) continue; 158 159 // We need to grab a single instance of this source: just take the first available 160 int nImage = match->image->data.S32[0]; 161 int nIndex = match->index->data.S32[0]; 162 psArray *sources = sourceLists->data[nImage]; 163 pmSource *source = sources->data[nIndex]; 164 165 // stick this sample source on sourcesBest 166 psArrayAdd (sourcesBest, 100, source); 167 } 168 psMetadataAdd (sourcesCell->analysis, PS_LIST_TAIL, "PSPHOT.SOURCES", PS_DATA_ARRAY | PS_META_REPLACE, "psphot sources", sourcesBest); 169 psLogMsg("ppStack", PS_LOG_INFO, "Selected %ld sources for photometry analysis\n", sourcesBest->n); 170 psFree (sourcesBest); 200 pmSourceMatch *match = matches->data[i]; // Match of interest 201 if (match->num < minMatches) { 202 continue; 203 } 204 205 // We need to grab a single instance of this source: just take the first available 206 int image = match->image->data.S32[0]; // Index of image 207 int index = match->index->data.S32[0]; // Index of source within image 208 psArray *sources = sourceLists->data[image]; // Sources for image 209 pmSource *source = sources->data[index]; // Source of interest 210 211 psArrayAdd(sourcesBest, sourcesBest->n, source); 212 } 213 psMetadataAdd(sourcesCell->analysis, PS_LIST_TAIL, "PSPHOT.SOURCES", PS_DATA_ARRAY | PS_META_REPLACE, 214 "psphot sources", sourcesBest); 215 psLogMsg("ppStack", PS_LOG_INFO, "Selected %ld sources for photometry analysis", sourcesBest->n); 216 psFree(sourcesBest); 171 217 172 218 psFree(matches); 173 if (!trans) {174 psError(PS_ERR_UNKNOWN, false, "Unable to measure transparencies");175 return NAN;176 }177 219 178 220 // M = m + c0 + c1 * airmass - 2.5log(t) + transparency … … 182 224 // We don't need to know the magnitude zero point for the filter, since it cancels out 183 225 for (int i = 0; i < num; i++) { 226 if (!isfinite(trans->data.F32[i])) { 227 continue; 228 } 184 229 psArray *sources = sourceLists->data[i]; // Sources of interest 185 230 float magCorr = airmassTerm - 2.5*log10(sumExpTime) - zp->data.F32[i] - trans->data.F32[i];
Note:
See TracChangeset
for help on using the changeset viewer.
