- Timestamp:
- Mar 8, 2009, 4:29:34 PM (17 years ago)
- Location:
- branches/eam_branches/eam_branch_20090303
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
ppStack/src/ppStackSources.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/eam_branch_20090303
-
branches/eam_branches/eam_branch_20090303/ppStack/src/ppStackSources.c
r21260 r23225 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); … … 114 166 return NAN; 115 167 } 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 168 169 #ifdef TESTING 170 dumpMatches("source_match.dat", num, matches, zp, NULL); 171 #endif 172 173 psVector *trans = pmSourceMatchRelphot(matches, zp, tol, iter1, starRej1, starSys1, 174 iter2, starRej2, starSys2, starLimit, 175 transIter, transRej, transThresh); // Transparencies for each image 176 if (!trans) { 177 psError(PS_ERR_UNKNOWN, false, "Unable to measure transparencies"); 178 return NAN; 179 } 180 181 #ifdef TESTING 182 dumpMatches("source_mags.dat", num, matches, zp, trans); 183 #endif 184 185 for (int i = 0; i < trans->n; i++) { 186 if (!isfinite(trans->data.F32[i])) { 187 inputMask->data.U8[i] = PPSTACK_MASK_CAL; 188 } 189 } 147 190 148 191 // Save best matches SOMEWHERE for future photometry 149 192 // XXX this is a really poor output location; clean up the pmFPAfiles used in ppStack 150 193 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);194 psArray *sourcesBest = psArrayAllocEmpty(matches->n); 195 196 // XXX something of a hack: require at least 2 detections or the nominated fraction of the max possible 197 int minMatches = PS_MAX(2, fracMatch * num);// Minimum number of matches required 155 198 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); 199 pmSourceMatch *match = matches->data[i]; // Match of interest 200 if (match->num < minMatches) { 201 continue; 202 } 203 204 // We need to grab a single instance of this source: just take the first available 205 int image = match->image->data.S32[0]; // Index of image 206 int index = match->index->data.S32[0]; // Index of source within image 207 psArray *sources = sourceLists->data[image]; // Sources for image 208 pmSource *source = sources->data[index]; // Source of interest 209 210 psArrayAdd(sourcesBest, sourcesBest->n, source); 211 } 212 psMetadataAdd(sourcesCell->analysis, PS_LIST_TAIL, "PSPHOT.SOURCES", PS_DATA_ARRAY | PS_META_REPLACE, 213 "psphot sources", sourcesBest); 214 psLogMsg("ppStack", PS_LOG_INFO, "Selected %ld sources for photometry analysis", sourcesBest->n); 215 psFree(sourcesBest); 171 216 172 217 psFree(matches); 173 if (!trans) {174 psError(PS_ERR_UNKNOWN, false, "Unable to measure transparencies");175 return NAN;176 }177 218 178 219 // M = m + c0 + c1 * airmass - 2.5log(t) + transparency … … 182 223 // We don't need to know the magnitude zero point for the filter, since it cancels out 183 224 for (int i = 0; i < num; i++) { 225 if (!isfinite(trans->data.F32[i])) { 226 continue; 227 } 184 228 psArray *sources = sourceLists->data[i]; // Sources of interest 185 229 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.
