IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 1, 2006, 4:15:35 PM (20 years ago)
Author:
magnier
Message:

finish up the basic astrometry functions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/astrom/pmAstrometryObjects.c

    r7153 r7282  
    88*  @author EAM, IfA
    99*
    10 *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
    11 *  @date $Date: 2006-05-19 15:49:37 $
     10*  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
     11*  @date $Date: 2006-06-02 02:15:35 $
    1212*
    1313*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3434 ******************************************************************************/
    3535
     36// XXX an example (might be faster)
     37void 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
    3684int pmAstromObjSortByFPX(
    3785    const void **a,
     
    59107}
    60108
    61 
     109int 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}
    62133
    63134/******************************************************************************
     
    116187    st2 = psArraySort (st2, pmAstromObjSortByFPX);
    117188
     189    // pmAstromObjSortByChipX2 (st1);
     190    // pmAstromObjSortByChipX2 (st2);
     191
    118192    psArray *matches = psArrayAlloc (100);
    119193    matches->n = 0;
     
    124198
    125199        dX = ((pmAstromObj *)st1->data[i])->FP->x - ((pmAstromObj *)st2->data[j])->FP->x;
    126         if (dX < -RADIUS) {
     200        if (dX <= -RADIUS) {
    127201            i++;
    128202            continue;
    129203        }
    130         if (dX > +RADIUS) {
     204        if (dX >= +RADIUS) {
    131205            j++;
    132206            continue;
     
    134208
    135209        jStart = j;
    136         while ((dX > -RADIUS) && (j < st2->n)) {
     210        while ((fabs(dX) < RADIUS) && (j < st2->n)) {
    137211
    138212            dX = ((pmAstromObj *)st1->data[i])->FP->x - ((pmAstromObj *)st2->data[j])->FP->x;
     
    155229        i++;
    156230    }
    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/******************************************************************************
     238pmAstromRadiusMatchChip(st1, st2, config) : match objects on the chip
     239 ******************************************************************************/
     240psArray *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);
    158299    return (matches);
    159300}
     
    235376    // fit chip-to-FPA transformation
    236377    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
    237380    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);
    238382
    239383    psFree (x);
Note: See TracChangeset for help on using the changeset viewer.