Changeset 12536 for trunk/psastro/src/psastroUtils.c
- Timestamp:
- Mar 21, 2007, 9:30:37 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/psastro/src/psastroUtils.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psastro/src/psastroUtils.c
r12492 r12536 79 79 bool psastroUpdateChipToFPA (pmFPA *fpa, pmChip *chip, psArray *rawstars, psArray *refstars) { 80 80 81 psRegion *region = pmChipExtent (chip); 82 region->x1 -= region->x0; 83 region->y1 -= region->y0; 84 region->x0 = 0; 85 region->y0 = 0; 81 psRegion *region = pmChipPixels (chip); 82 86 83 psFree (chip->fromFPA); 87 chip->fromFPA = psPlaneTransformInvert (NULL, chip->toFPA, *region, 20);84 chip->fromFPA = psPlaneTransformInvert (NULL, chip->toFPA, *region, 50); 88 85 psFree (region); 89 86 … … 134 131 } 135 132 return true; 136 }137 138 bool psastroNormFPA (pmFPA *fpa, psMetadata *config) {139 140 // save the raw astrometry for later reference141 pmFPA *raw = pmFPACopyAstrom (fpa);142 143 // first pass: measure the per-chip solutions, modify the chip.toFPA terms144 for (int i = 0; i < fpa->chips->n; i++) {145 pmChip *chip = fpa->chips->data[i];146 psastroChipAstrom (chip, config);147 }148 149 // second stage: re-normalize the chip terms, passing the150 // average rotation and offset values to the fpa.toSky151 if (RENORM) {152 153 // this code is needed for the mosastro stage, with multiple chip solutions154 155 double dX, dY, dT, dN;156 dX = dY = dT = dN = 0;157 158 psPlane origin, P1, P2;159 origin.x = 0;160 origin.y = 0;161 162 // calculate the average rotation and boresite offset relative to raw163 for (int i = 0; i < fpa->chips->n; i++) {164 pmChip *iChip = raw->chips->data[i];165 pmChip *oChip = fpa->chips->data[i];166 167 // offset of chip168 psCoordChipToFPA (&P1, &origin, iChip);169 psCoordChipToFPA (&P2, &origin, oChip);170 dX += (P2.x - P1.x);171 dY += (P2.y - P1.y);172 173 // get parity-independent rotations for old and new solutions174 double T1 = psPlaneTransformGetRotation (iChip->toFPA);175 double T2 = psPlaneTransformGetRotation (oChip->toFPA);176 dT += T2 - T1;177 dN ++;178 }179 180 dT /= dN;181 dX /= dN;182 dY /= dN;183 184 // R(T)185 double PC1_1 = fpa->toTPA->x->coeff[1][0][0][0];186 double PC1_2 = fpa->toTPA->x->coeff[0][1][0][0];187 double PC2_1 = fpa->toTPA->y->coeff[1][0][0][0];188 double PC2_2 = fpa->toTPA->y->coeff[0][1][0][0];189 190 // R(dT)191 double dPC1_1 = +cos (dT);192 double dPC1_2 = +sin (dT);193 double dPC2_1 = -sin (dT);194 double dPC2_2 = +cos (dT);195 196 // R'(T) = R(T) * R(dT)197 double pc1_1 = PC1_1*dPC1_1 + PC1_2*dPC2_1;198 double pc1_2 = PC1_1*dPC1_2 + PC1_2*dPC2_2;199 double pc2_1 = PC2_1*dPC1_1 + PC2_2*dPC2_1;200 double pc2_2 = PC2_1*dPC1_2 + PC2_2*dPC2_2;201 202 double det = 1.0 / (pc1_1*pc2_2 - pc1_2*pc2_1);203 204 // R'(-T) (matrix inverse, not just rotation inverse -- keeps parity)205 double pi1_1 = +pc2_2 * det;206 double pi1_2 = -pc1_2 * det;207 double pi2_1 = -pc2_1 * det;208 double pi2_2 = +pc1_1 * det;209 210 // apply the new modifcations in rotation and boresite211 for (int i = 0; i < fpa->chips->n; i++) {212 pmChip *oChip = fpa->chips->data[i];213 214 // r(T)215 double pr1_1 = oChip->toFPA->x->coeff[1][0];216 double pr1_2 = oChip->toFPA->x->coeff[0][1];217 double pr2_1 = oChip->toFPA->y->coeff[1][0];218 double pr2_2 = oChip->toFPA->y->coeff[0][1];219 220 // ri'(T) = R(T) r(t)221 double ri1_1 = PC1_1*pr1_1 + PC1_2*pr2_1;222 double ri1_2 = PC1_1*pr1_2 + PC1_2*pr2_2;223 double ri2_1 = PC2_1*pr1_1 + PC2_2*pr2_1;224 double ri2_2 = PC2_1*pr1_2 + PC2_2*pr2_2;225 226 // r'(T) = R'(-T) ri'(T)227 oChip->toFPA->x->coeff[1][0] = pi1_1*ri1_1 + pi1_2*ri2_1;228 oChip->toFPA->x->coeff[0][1] = pi1_1*ri1_2 + pi1_2*ri2_2;229 oChip->toFPA->y->coeff[1][0] = pi2_1*ri1_1 + pi2_2*ri2_1;230 oChip->toFPA->y->coeff[0][1] = pi2_1*ri1_2 + pi2_2*ri2_2;231 232 double dx = PC1_1*oChip->toFPA->x->coeff[0][0] + PC1_2*oChip->toFPA->y->coeff[0][0] + dX;233 double dy = PC2_1*oChip->toFPA->x->coeff[0][0] + PC2_2*oChip->toFPA->y->coeff[0][0] + dY;234 235 oChip->toFPA->x->coeff[0][0] = pi1_1*dx + pi1_2*dy;236 oChip->toFPA->y->coeff[0][0] = pi2_1*dx + pi2_2*dy;237 }238 239 fpa->toTPA->x->coeff[0][0][0][0] -= dX;240 fpa->toTPA->y->coeff[0][0][0][0] -= dY;241 242 fpa->toTPA->x->coeff[1][0][0][0] = pc1_1;243 fpa->toTPA->x->coeff[0][1][0][0] = pc1_2;244 fpa->toTPA->y->coeff[1][0][0][0] = pc2_1;245 fpa->toTPA->y->coeff[0][1][0][0] = pc2_2;246 }247 return true;248 }249 250 psPolynomial2D *psPolynomial2DCopy (psPolynomial2D *input) {251 252 psPolynomial2D *output = psPolynomial2DAlloc (input->nX, input->nY, input->type);253 254 for (int i = 0; i < input->nX; i++) {255 for (int j = 0; j < input->nY; j++) {256 output->mask[i][j] = input->mask[i][j];257 output->coeff[i][j] = input->coeff[i][j];258 output->coeffErr[i][j] = input->coeffErr[i][j];259 }260 }261 return (output);262 }263 264 psPolynomial4D *psPolynomial4DCopy (psPolynomial4D *input) {265 266 psPolynomial4D *output = psPolynomial4DAlloc (input->nX, input->nY, input->nZ, input->nT, input->type);267 268 for (int i = 0; i < input->nX; i++) {269 for (int j = 0; j < input->nY; j++) {270 for (int k = 0; k < input->nZ; k++) {271 for (int m = 0; m < input->nT; m++) {272 output->mask[i][j][k][m] = input->mask[i][j][k][m];273 output->coeff[i][j][k][m] = input->coeff[i][j][k][m];274 output->coeffErr[i][j][k][m] = input->coeffErr[i][j][k][m];275 }276 }277 }278 }279 return (output);280 133 } 281 134 … … 328 181 } 329 182 330 // very crude distortion inversion: assumes 0 order in z and t, linear in x and y:331 psPlaneDistort *psPlaneDistortInvert(psPlaneDistort *distort) {332 PS_ASSERT_PTR_NON_NULL(distort, 0);333 PS_ASSERT_PTR_NON_NULL(distort->x, 0);334 PS_ASSERT_PTR_NON_NULL(distort->y, 0);335 336 psPlaneDistort *out = psPlaneDistortAlloc(1, 1, 0, 0);337 338 /* simple matrix inversion code */339 340 psF64 r11 = distort->x->coeff[1][0][0][0];341 psF64 r12 = distort->x->coeff[0][1][0][0];342 psF64 r21 = distort->y->coeff[1][0][0][0];343 psF64 r22 = distort->y->coeff[0][1][0][0];344 psF64 xo = distort->x->coeff[0][0][0][0];345 psF64 yo = distort->y->coeff[0][0][0][0];346 347 psF64 invDet = 1.0 / (r11 * r22 - r12 * r21); // Inverse of the determinant348 349 out->x->coeff[1][0][0][0] = +invDet * r22;350 out->x->coeff[0][1][0][0] = -invDet * r12;351 out->y->coeff[1][0][0][0] = -invDet * r21;352 out->y->coeff[0][1][0][0] = +invDet * r11;353 354 out->x->coeff[0][0][0][0] = - invDet * (r22 * xo - r12 * yo);355 out->y->coeff[0][0][0][0] = - invDet * (r11 * yo - r21 * xo);356 357 return(out);358 }359 360 183 // returns the rotation term, forcing positive parity 361 184 double psPlaneTransformGetRotation (psPlaneTransform *map) {
Note:
See TracChangeset
for help on using the changeset viewer.
