Changeset 7282 for trunk/psModules/src/astrom/pmAstrometryObjects.c
- Timestamp:
- Jun 1, 2006, 4:15:35 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/astrom/pmAstrometryObjects.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/astrom/pmAstrometryObjects.c
r7153 r7282 8 8 * @author EAM, IfA 9 9 * 10 * @version $Revision: 1. 6$ $Name: not supported by cvs2svn $11 * @date $Date: 2006-0 5-19 15:49:37$10 * @version $Revision: 1.7 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2006-06-02 02:15:35 $ 12 12 * 13 13 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 34 34 ******************************************************************************/ 35 35 36 // XXX an example (might be faster) 37 void pmAstromObjSortByChipX2 (psArray *objects) 38 { 39 40 int l,j,ir,i; 41 float v1, v2; 42 pmAstromObj *tmp; 43 pmAstromObj *obj; 44 45 int N = objects->n; 46 47 if (N < 2) 48 return; 49 l = N >> 1; 50 ir = N - 1; 51 for (;;) { 52 if (l > 0) { 53 tmp = objects->data[--l]; 54 } else { 55 tmp = objects->data[ir]; 56 objects->data[ir] = objects->data[0]; 57 if (--ir == 0) { 58 objects->data[0] = tmp; 59 return; 60 } 61 } 62 i = l; 63 j = (l << 1) + 1; 64 while (j <= ir) { 65 obj = objects->data[j]; 66 v1 = obj->chip->x; 67 obj = objects->data[j+1]; 68 v2 = obj->chip->x; 69 if (j < ir && v1 < v2) 70 ++j; 71 obj = objects->data[j]; 72 v1 = obj->chip->x; 73 v2 = tmp->chip->x; 74 if (v2 < v1) { 75 objects->data[i] = objects->data[j]; 76 j += (i=j) + 1; 77 } else 78 j = ir + 1; 79 } 80 objects->data[i] = tmp; 81 } 82 } 83 36 84 int pmAstromObjSortByFPX( 37 85 const void **a, … … 59 107 } 60 108 61 109 int pmAstromObjSortByChipX( 110 const void **a, 111 const void **b) 112 { 113 if (PM_ASTROMETRYOBJECTS_DEBUG) { 114 PS_ASSERT_PTR_NON_NULL(a, 0); 115 PS_ASSERT_PTR_NON_NULL(*a, 0); 116 PS_ASSERT_PTR_NON_NULL(b, 0); 117 PS_ASSERT_PTR_NON_NULL(*b, 0); 118 } 119 120 pmAstromObj *A = *(pmAstromObj **)a; 121 pmAstromObj *B = *(pmAstromObj **)b; 122 123 psF32 diff = A->chip->x - B->chip->x; 124 if (diff > FLT_EPSILON) { 125 return (+1); 126 } 127 128 if (diff < FLT_EPSILON) { 129 return (-1); 130 } 131 return (0); 132 } 62 133 63 134 /****************************************************************************** … … 116 187 st2 = psArraySort (st2, pmAstromObjSortByFPX); 117 188 189 // pmAstromObjSortByChipX2 (st1); 190 // pmAstromObjSortByChipX2 (st2); 191 118 192 psArray *matches = psArrayAlloc (100); 119 193 matches->n = 0; … … 124 198 125 199 dX = ((pmAstromObj *)st1->data[i])->FP->x - ((pmAstromObj *)st2->data[j])->FP->x; 126 if (dX < -RADIUS) {200 if (dX <= -RADIUS) { 127 201 i++; 128 202 continue; 129 203 } 130 if (dX > +RADIUS) {204 if (dX >= +RADIUS) { 131 205 j++; 132 206 continue; … … 134 208 135 209 jStart = j; 136 while (( dX > -RADIUS) && (j < st2->n)) {210 while ((fabs(dX) < RADIUS) && (j < st2->n)) { 137 211 138 212 dX = ((pmAstromObj *)st1->data[i])->FP->x - ((pmAstromObj *)st2->data[j])->FP->x; … … 155 229 i++; 156 230 } 157 psLogMsg (__func__, 3, "radius match: %d pairs\n", matches->n); 231 psLogMsg (__func__, 3, "radius match: %d pairs (radius: %f)\n", matches->n, RADIUS); 232 return (matches); 233 } 234 235 236 237 /****************************************************************************** 238 pmAstromRadiusMatchChip(st1, st2, config) : match objects on the chip 239 ******************************************************************************/ 240 psArray *pmAstromRadiusMatchChip( 241 psArray *st1, 242 psArray *st2, 243 psMetadata *config) 244 { 245 PS_ASSERT_PTR_NON_NULL(st1, NULL); 246 PS_ASSERT_PTR_NON_NULL(st2, NULL); 247 PS_ASSERT_PTR_NON_NULL(config, NULL); 248 bool status; 249 int jStart; 250 double dX, dY, dR; 251 252 double RADIUS = psMetadataLookupF32 (&status, config, "PSASTRO.MATCH.RADIUS"); 253 double RADIUS_SQR = PS_SQR (RADIUS); 254 255 // sort both lists by Focal Plane X coord 256 st1 = psArraySort (st1, pmAstromObjSortByChipX); 257 st2 = psArraySort (st2, pmAstromObjSortByChipX); 258 259 psArray *matches = psArrayAlloc (100); 260 matches->n = 0; 261 262 int i = 0; 263 int j = 0; 264 while ((i < st1->n) && (j < st2->n)) { 265 266 dX = ((pmAstromObj *)st1->data[i])->chip->x - ((pmAstromObj *)st2->data[j])->chip->x; 267 if (dX <= -RADIUS) { 268 i++; 269 continue; 270 } 271 if (dX >= +RADIUS) { 272 j++; 273 continue; 274 } 275 276 jStart = j; 277 while ((dX > -RADIUS) && (j < st2->n)) { 278 279 dX = ((pmAstromObj *)st1->data[i])->chip->x - ((pmAstromObj *)st2->data[j])->chip->x; 280 dY = ((pmAstromObj *)st1->data[i])->chip->y - ((pmAstromObj *)st2->data[j])->chip->y; 281 dR = dX*dX + dY*dY; 282 283 if (dR > RADIUS_SQR) { 284 j++; 285 continue; 286 } 287 288 // got a match; add to output list 289 pmAstromMatch *match = pmAstromMatchAlloc (i, j); 290 psArrayAdd (matches, 100, match); 291 psFree (match); 292 293 j++; 294 } 295 j = jStart; 296 i++; 297 } 298 psLogMsg (__func__, 3, "radius match: %d pairs (radius: %f)\n", matches->n, RADIUS); 158 299 return (matches); 159 300 } … … 235 376 // fit chip-to-FPA transformation 236 377 psVectorClipFitPolynomial2D (map->x, stats, xMask, 0, x, wt, X, Y); 378 psLogMsg ("psModules.astrom", 3, "x resid: %f +/- %f (%d of %d)\n", stats->clippedMean, stats->clippedStdev, stats->clippedNvalues, x->n); 379 237 380 psVectorClipFitPolynomial2D (map->y, stats, yMask, 0, y, wt, X, Y); 381 psLogMsg ("psModules.astrom", 3, "y resid: %f +/- %f (%d of %d)\n", stats->clippedMean, stats->clippedStdev, stats->clippedNvalues, y->n); 238 382 239 383 psFree (x);
Note:
See TracChangeset
for help on using the changeset viewer.
