Changeset 39926 for trunk/psLib
- Timestamp:
- Jan 6, 2017, 11:30:10 AM (10 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
. (modified) (1 prop)
-
psLib/src/astro/psCoord.c (modified) (12 diffs)
-
psLib/src/astro/psCoord.h (modified) (2 diffs)
-
psLib/src/fits/psFitsScale.c (modified) (3 diffs)
-
psLib/src/types/psMetadata.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property svn:mergeinfo
set to
/branches/czw_branch/20160809 merged eligible
-
Property svn:mergeinfo
set to
-
trunk/psLib/src/astro/psCoord.c
r19504 r39926 234 234 const psPlane* coords) 235 235 { 236 if (!transform) { 237 fprintf (stderr, "problem\n"); 238 } 236 239 PS_ASSERT_PTR_NON_NULL(transform, NULL); 237 240 PS_ASSERT_PTR_NON_NULL(transform->x, NULL); … … 305 308 void projectionFree(psProjection *p) 306 309 { 307 // There are no dynamically allocated items 310 if (!p) return; 311 if (!p->radial) return; 312 psFree (p->radial); 308 313 } 309 314 … … 321 326 p->Ys = Ys; 322 327 p->type = type; 328 p->radial = NULL; 323 329 324 330 psMemSetDeallocator(p, (psFreeFunc) projectionFree); … … 368 374 case PS_PROJ_ZEA: 369 375 case PS_PROJ_ZPL: 376 case PS_PROJ_ZPN: 370 377 class = PS_PROJECTION_CLASS_ZENITHAL; 371 378 break; … … 442 449 out->y = -zeta * cosPhiCT; 443 450 break; 451 452 case PS_PROJ_ZPN: { 453 // the forward projection is: 454 // theta = atan2(stht, ctht) 455 // gamma = (pi/2 - theta) : theta in radians 456 // Ro = sum (P_i gamma^i) 457 // R = (180/pi) Ro 458 459 // Ro = (pi/180)(90 - theta) 460 // R = (180/pi)sum (P_i R^i) 461 462 // is ZPN defined for Npolyterms = 0 or 1? 463 464 double cosTheta = hypot(sinPhiCT, cosPhiCT); 465 double theta = atan2 (sinTheta, cosTheta); 466 467 double gamma = M_PI_2 - theta; 468 469 // i = 0 .. N - 1 (1 <= Npolyterms <= 21) 470 double Ro = 0.0; 471 for (int i = projection->radial->n - 1; i > 0; i--) { 472 double Pi = projection->radial->data.F64[i]; 473 Ro = (Ro + Pi)*gamma; 474 } 475 Ro += projection->radial->data.F64[0]; 476 477 out->x = (cosTheta == 0.0) ? 0.0 : +Ro * sinPhiCT / cosTheta ; 478 out->y = (cosTheta == 0.0) ? 0.0 : -Ro * cosPhiCT / cosTheta ; 479 break; 480 } 481 444 482 default: 445 483 psAbort("invalid projection"); … … 525 563 case PS_PROJ_ZEA: 526 564 case PS_PROJ_ZPL: 565 case PS_PROJ_ZPN: 527 566 class = PS_PROJECTION_CLASS_ZENITHAL; 528 567 break; … … 574 613 case PS_PROJ_SIN: 575 614 // Orhtographic deprojection 615 cosTheta = R; 576 616 sinTheta = sqrt (1 - R*R); 577 cosTheta = R;578 617 break; 579 618 case PS_PROJ_STG: 580 psAbort("STG not defined"); 619 sinTheta = (4 - R) / (4 + R); 620 cosTheta = sqrt (1 - sinTheta*sinTheta); 581 621 break; 582 622 case PS_PROJ_ZEA: … … 587 627 cosTheta = sqrt (1 - PS_SQR(sinTheta)); 588 628 break; 629 630 case PS_PROJ_ZPN: 631 632 // the forward projection is: 633 // theta = atan2(stht, ctht) 634 // gamma = (pi/2 - theta) : theta in radians 635 // Ro = sum (P_i gamma^i) 636 // R = (180/pi) Ro 637 638 // given R, we need to find theta: 639 // Ro = R * (pi / 180) = sum (P_i gamma^i) 640 // solve sum (P_i gamma^i) - Ro = 0 using Newton-Raphson 641 642 // use Ro to get a guess for gamma and iterate 643 644 { 645 // find the roots of f(gamma) - R = 0 646 // starting guess for gamma is (R - P0) / P1 647 double gamma = (R - projection->radial->data.F64[0]) / projection->radial->data.F64[1]; 648 649 for (int iter = 0; iter < 5; iter++) { 650 651 double Rc = 0.0; // this will hold the ander 652 double dR = 0.0; 653 for (int i = projection->radial->n - 1; i > 1; i--) { 654 double Pi = projection->radial->data.F64[i]; 655 Rc = (Rc + Pi)*gamma; 656 dR = (dR + i*Pi)*gamma; 657 } 658 double P0 = projection->radial->data.F64[0]; 659 double P1 = projection->radial->data.F64[1]; 660 Rc = (Rc + P1)*gamma + P0; 661 dR = (dR + P1); 662 663 double gamma_new = gamma - (Rc - R) / dR; 664 gamma = gamma_new; 665 } 666 667 double theta = M_PI_2 - gamma ; 668 cosTheta = cos (theta); 669 sinTheta = sin (theta); 670 break; 671 } 672 589 673 default: 590 674 psAbort("invalid projection"); … … 949 1033 myPT = psPlaneTransformAlloc(order, order); 950 1034 } else { 1035 // the user has supplied a model with a specific order : fit that order 1036 myPT = psMemIncrRefCounter(out); // we need to return something which can be freed 1037 # if (0) 951 1038 if ((out->x->nX == order) && (out->x->nY == order) && 952 1039 (out->y->nX == order) && (out->y->nX == order)) { … … 956 1043 myPT = psPlaneTransformAlloc(order, order); 957 1044 } 1045 # endif 958 1046 } 959 1047 … … 1183 1271 1184 1272 switch (type) { 1185 case PS_PROJ_LIN: 1186 psStringAppend (&name, "%s-LIN", prefix); 1187 return name; 1188 case PS_PROJ_PLY: 1189 psStringAppend (&name, "%s-PLY", prefix); 1190 return name; 1191 case PS_PROJ_WRP: 1192 psStringAppend (&name, "%s-WRP", prefix); 1193 return name; 1194 case PS_PROJ_TAN: 1195 psStringAppend (&name, "%s-TAN", prefix); 1196 return name; 1197 case PS_PROJ_TNX: 1198 psStringAppend (&name, "%s-TNX", prefix); 1199 return name; 1200 case PS_PROJ_DIS: 1201 psStringAppend (&name, "%s-DIS", prefix); 1202 return name; 1203 case PS_PROJ_SIN: 1204 psStringAppend (&name, "%s-SIN", prefix); 1205 return name; 1206 case PS_PROJ_STG: 1207 psStringAppend (&name, "%s-STG", prefix); 1208 return name; 1209 case PS_PROJ_AIT: 1210 psStringAppend (&name, "%s-AIT", prefix); 1211 return name; 1212 case PS_PROJ_PAR: 1213 psStringAppend (&name, "%s-PAR", prefix); 1214 return name; 1215 case PS_PROJ_GLS: 1216 psStringAppend (&name, "%s-GLS", prefix); 1217 return name; 1218 case PS_PROJ_CAR: 1219 psStringAppend (&name, "%s-CAR", prefix); 1220 return name; 1221 case PS_PROJ_MER: 1222 psStringAppend (&name, "%s-MER", prefix); 1223 return name; 1273 case PS_PROJ_LIN: psStringAppend (&name, "%s-LIN", prefix); return name; 1274 case PS_PROJ_PLY: psStringAppend (&name, "%s-PLY", prefix); return name; 1275 case PS_PROJ_WRP: psStringAppend (&name, "%s-WRP", prefix); return name; 1276 case PS_PROJ_TAN: psStringAppend (&name, "%s-TAN", prefix); return name; 1277 1278 case PS_PROJ_DIS: psStringAppend (&name, "%s-DIS", prefix); return name; 1279 case PS_PROJ_SIN: psStringAppend (&name, "%s-SIN", prefix); return name; 1280 case PS_PROJ_STG: psStringAppend (&name, "%s-STG", prefix); return name; 1281 case PS_PROJ_TNX: psStringAppend (&name, "%s-TNX", prefix); return name; 1282 1283 case PS_PROJ_ZEA: psStringAppend (&name, "%s-ZEA", prefix); return name; 1284 case PS_PROJ_ZPL: psStringAppend (&name, "%s-ZPL", prefix); return name; 1285 case PS_PROJ_ZPN: psStringAppend (&name, "%s-ZPN", prefix); return name; 1286 case PS_PROJ_AIT: psStringAppend (&name, "%s-AIT", prefix); return name; 1287 1288 case PS_PROJ_PAR: psStringAppend (&name, "%s-PAR", prefix); return name; 1289 case PS_PROJ_GLS: psStringAppend (&name, "%s-GLS", prefix); return name; 1290 case PS_PROJ_CAR: psStringAppend (&name, "%s-CAR", prefix); return name; 1291 case PS_PROJ_MER: psStringAppend (&name, "%s-MER", prefix); return name; 1224 1292 1225 1293 default: … … 1238 1306 if (!strcmp (&name[4], "-WRP")) return PS_PROJ_WRP; 1239 1307 if (!strcmp (&name[4], "-TAN")) return PS_PROJ_TAN; 1240 if (!strcmp (&name[4], "-TNX")) return PS_PROJ_TNX;1241 1308 if (!strcmp (&name[4], "-DIS")) return PS_PROJ_DIS; 1242 1309 if (!strcmp (&name[4], "-SIN")) return PS_PROJ_SIN; 1243 1310 if (!strcmp (&name[4], "-STG")) return PS_PROJ_STG; 1311 if (!strcmp (&name[4], "-TNX")) return PS_PROJ_TNX; 1312 if (!strcmp (&name[4], "-ZEA")) return PS_PROJ_ZEA; 1313 if (!strcmp (&name[4], "-ZPL")) return PS_PROJ_ZPL; 1314 if (!strcmp (&name[4], "-ZPN")) return PS_PROJ_ZPN; 1244 1315 if (!strcmp (&name[4], "-AIT")) return PS_PROJ_AIT; 1245 1316 if (!strcmp (&name[4], "-PAR")) return PS_PROJ_PAR; -
trunk/psLib/src/astro/psCoord.h
r14452 r39926 130 130 PS_PROJ_ZEA, ///< Sine projection 131 131 PS_PROJ_ZPL, ///< Sine projection 132 PS_PROJ_ZPN, ///< Sine projection 132 133 PS_PROJ_AIT, ///< Aitoff projection 133 134 PS_PROJ_PAR, ///< Par projection … … 150 151 double Ys; ///< plate-scale in Y direction 151 152 psProjectionType type; ///< Projection type 152 } 153 psProjection;153 psVector *radial; ///< radial distortion terms 154 } psProjection; 154 155 155 156 /** Allocates a psPlane -
trunk/psLib/src/fits/psFitsScale.c
r39509 r39926 189 189 // Desperate retry 190 190 mean = psStatsGetValue(stats, DESPERATE_MEAN_STAT); 191 stdev = psStatsGetValue(stats, DESPERATE_STDEV_STAT); 191 if ((STDEV_STAT == PS_STAT_SAMPLE_QUARTILE)||(STDEV_STAT == PS_STAT_ROBUST_QUARTILE)) { 192 stdev = 0.7415 * (stats->sampleUQ - stats->sampleLQ); 193 } 194 else { 195 stdev = psStatsGetValue(stats, DESPERATE_STDEV_STAT); 196 } 192 197 } 193 198 } else { 194 199 // Retry with all available pixels 195 200 mean = psStatsGetValue(stats, MEAN_STAT); 196 stdev = psStatsGetValue(stats, STDEV_STAT); 201 if ((STDEV_STAT == PS_STAT_SAMPLE_QUARTILE)||(STDEV_STAT == PS_STAT_ROBUST_QUARTILE)) { 202 stdev = 0.7415 * (stats->sampleUQ - stats->sampleLQ); 203 } 204 else { 205 stdev = psStatsGetValue(stats, STDEV_STAT); 206 } 197 207 } 198 208 } else { 199 209 // First attempt 200 210 mean = psStatsGetValue(stats, MEAN_STAT); 201 stdev = psStatsGetValue(stats, STDEV_STAT); 211 if ((STDEV_STAT == PS_STAT_SAMPLE_QUARTILE)||(STDEV_STAT == PS_STAT_ROBUST_QUARTILE)) { 212 stdev = 0.7415 * (stats->sampleUQ - stats->sampleLQ); 213 } 214 else { 215 stdev = psStatsGetValue(stats, STDEV_STAT); 216 } 202 217 } 203 218 psFree(rng); … … 554 569 // Desperate retry 555 570 mean = psStatsGetValue(stats, DESPERATE_MEAN_STAT); 556 stdev = psStatsGetValue(stats, DESPERATE_STDEV_STAT); 557 } 571 if ((DESPERATE_STDEV_STAT == PS_STAT_SAMPLE_QUARTILE)||(DESPERATE_STDEV_STAT == PS_STAT_ROBUST_QUARTILE)) { 572 stdev = 0.7415 * (stats->sampleUQ - stats->sampleLQ); // Calculate a "sigma" based on the interquartile distance. 573 } 574 else { 575 576 stdev = psStatsGetValue(stats, DESPERATE_STDEV_STAT); 577 } 578 } 558 579 } else { 559 580 // Retry with all available pixels 560 581 mean = psStatsGetValue(stats, MEAN_STAT); 561 stdev = psStatsGetValue(stats, STDEV_STAT); 582 if ((STDEV_STAT == PS_STAT_SAMPLE_QUARTILE)||(STDEV_STAT == PS_STAT_ROBUST_QUARTILE)) { 583 stdev = 0.7415 * (stats->sampleUQ - stats->sampleLQ); // Calculate a "sigma" based on the interquartile distance. 584 } 585 else { 586 stdev = psStatsGetValue(stats, STDEV_STAT); 587 } 562 588 } 563 589 } else { 564 590 // First attempt 565 591 mean = psStatsGetValue(stats, MEAN_STAT); 566 stdev = psStatsGetValue(stats, STDEV_STAT); 592 if ((STDEV_STAT == PS_STAT_SAMPLE_QUARTILE)||(STDEV_STAT == PS_STAT_ROBUST_QUARTILE)) { 593 stdev = 0.7415 * (stats->sampleUQ - stats->sampleLQ); // Calculate a "sigma" based on the interquartile distance. 594 } 595 else { 596 stdev = psStatsGetValue(stats, STDEV_STAT); 597 } 567 598 } 568 599 psFree(rng); … … 723 754 // Desperate retry 724 755 mean = psStatsGetValue(stats, DESPERATE_MEAN_STAT); 725 stdev = psStatsGetValue(stats, DESPERATE_STDEV_STAT); 756 if ((DESPERATE_STDEV_STAT == PS_STAT_SAMPLE_QUARTILE)||(DESPERATE_STDEV_STAT == PS_STAT_ROBUST_QUARTILE)) { 757 stdev = 0.7415 * (stats->sampleUQ - stats->sampleLQ); // Calculate a "sigma" based on the interquartile distance. 758 } 759 else { 760 stdev = psStatsGetValue(stats, DESPERATE_STDEV_STAT); 761 } 726 762 } 727 763 } else { 728 764 // Retry with all available pixels 729 765 mean = psStatsGetValue(stats, MEAN_STAT); 730 stdev = psStatsGetValue(stats, STDEV_STAT); 766 if ((STDEV_STAT == PS_STAT_SAMPLE_QUARTILE)||(STDEV_STAT == PS_STAT_ROBUST_QUARTILE)) { 767 stdev = 0.7415 * (stats->sampleUQ - stats->sampleLQ); // Calculate a "sigma" based on the interquartile distance. 768 } 769 else { 770 stdev = psStatsGetValue(stats, STDEV_STAT); 771 } 731 772 } 732 773 } else { 733 774 // First attempt 734 775 mean = psStatsGetValue(stats, MEAN_STAT); 735 stdev = psStatsGetValue(stats, STDEV_STAT); 776 if ((STDEV_STAT == PS_STAT_SAMPLE_QUARTILE)||(STDEV_STAT == PS_STAT_ROBUST_QUARTILE)) { 777 stdev = 0.7415 * (stats->sampleUQ - stats->sampleLQ); // Calculate a "sigma" based on the interquartile distance. 778 } 779 else { 780 stdev = psStatsGetValue(stats, STDEV_STAT); 781 } 736 782 } 737 783 psFree(rng); -
trunk/psLib/src/types/psMetadata.c
r39598 r39926 1390 1390 break; 1391 1391 case PS_DATA_F64: 1392 fprintf(fd, "% f\n", item->data.F64);1392 fprintf(fd, "%g\n", item->data.F64); 1393 1393 break; 1394 1394 case PS_DATA_METADATA:
Note:
See TracChangeset
for help on using the changeset viewer.
