Changeset 33886 for branches/eam_branches/ipp-20120405/Ohana
- Timestamp:
- May 17, 2012, 9:51:31 AM (14 years ago)
- Location:
- branches/eam_branches/ipp-20120405/Ohana/src/relphot
- Files:
-
- 8 edited
-
include/relphot.h (modified) (3 diffs)
-
src/GridOps.c (modified) (2 diffs)
-
src/ImageOps.c (modified) (11 diffs)
-
src/MosaicOps.c (modified) (10 diffs)
-
src/StarOps.c (modified) (26 diffs)
-
src/global_stats.c (modified) (2 diffs)
-
src/initialize.c (modified) (1 diff)
-
src/liststats.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20120405/Ohana/src/relphot/include/relphot.h
r33885 r33886 36 36 } Mosaic; 37 37 38 typedef enum { 39 STATS_NONE, 40 STATS_MEAN, 41 STATS_MEDIAN, 42 STATS_WT_MEAN, 43 STATS_INNER_MEAN, 44 STATS_INNER_WTMEAN, 45 STATS_CHI_INNER_MEAN, 46 STATS_CHI_INNER_WTMEAN 47 } ListStatsMode; 48 38 49 typedef struct { 39 50 double median; … … 48 59 double total; 49 60 int Nmeas; 61 ListStatsMode statmode; 50 62 } StatType; 51 63 … … 245 257 void initialize PROTO((int argc, char **argv)); 246 258 void initialize_client PROTO((int argc, char **argv)); 247 void initstats PROTO((char *mode));248 int liststats PROTO((double *value, double *dvalue, int N, StatType *stats));259 void liststats_setmode PROTO((StatType *stats, char *strmode)); 260 int liststats PROTO((double *value, double *dvalue, double *wvalue, int N, StatType *stats)); 249 261 Catalog *load_catalogs PROTO((SkyList *skylist, int *Ncatalog, int hostID, char *hostpath)); 250 262 Catalog *load_catalogs_parallel PROTO((SkyList *sky, int *Ncatalog)); -
branches/eam_branches/ipp-20120405/Ohana/src/relphot/src/GridOps.c
r33651 r33886 527 527 double *list, *dlist; 528 528 float Msys, Mrel, Mcal, Mmos; 529 529 530 StatType stats; 531 liststats_setmode (&stats, STATMODE); 530 532 531 533 if (!USE_GRID) return; … … 595 597 } 596 598 597 liststats (list, dlist, N , &stats);599 liststats (list, dlist, NULL, N, &stats); 598 600 gridM[i] = stats.mean; 599 601 gridS[i] = stats.sigma; -
branches/eam_branches/ipp-20120405/Ohana/src/relphot/src/ImageOps.c
r33823 r33886 399 399 float Msys, Mrel, Mmos, Mgrid, Mflat; 400 400 double *list, *dlist, *Mlist, *dMlist; 401 401 402 StatType stats; 403 liststats_setmode (&stats, STATMODE); 402 404 403 405 if (FREEZE_IMAGES) return; … … 518 520 } 519 521 520 liststats (list, dlist, N, &stats); 522 // no additional weight modification (we treat all stars on an image equally -- note an image is either ubercal-tied or not) 523 liststats (list, dlist, NULL, N, &stats); 521 524 image[i].Mcal = stats.mean; 522 525 image[i].dMcal = stats.error; … … 527 530 528 531 // bright end scatter 529 liststats (Mlist, dMlist, N bright, &stats);532 liststats (Mlist, dMlist, NULL, Nbright, &stats); 530 533 image[i].dMagSys = stats.sigma; 531 534 … … 560 563 double *mlist, *slist, *dlist; 561 564 double MaxOffset, MaxScatter, MedOffset; 562 StatType stats;563 565 564 566 if (FREEZE_IMAGES) return; … … 578 580 N++; 579 581 } 580 initstats ("MEAN"); 581 liststats (mlist, dlist, N, &stats); 582 583 // use a straight mean to find the global image statistics (no weighting) 584 StatType stats; 585 liststats_setmode (&stats, "MEAN"); 586 587 liststats (mlist, dlist, NULL, N, &stats); 582 588 MaxOffset = MAX (IMAGE_OFFSET, 3*stats.sigma); 583 589 MedOffset = stats.median; 584 liststats (slist, dlist, N, &stats); 590 591 liststats (slist, dlist, NULL, N, &stats); 585 592 MaxScatter = MAX (IMAGE_SCATTER, 2*stats.median); 586 593 fprintf (stderr, "Mrel: %f, dMrel: %f, Max Scatter: %f, Max Offset: %f\n", MedOffset, stats.median, MaxScatter, MaxOffset); … … 603 610 604 611 fprintf (stderr, "%d images marked poor\n", Nmark); 605 initstats (STATMODE);606 612 free (mlist); 607 613 free (slist); … … 724 730 double *list, *dlist; 725 731 float Mcal, Mmos, Mgrid; 732 726 733 StatType stats; 727 728 734 bzero (&stats, sizeof (StatType)); 729 735 if (FREEZE_IMAGES) return (stats); … … 755 761 } 756 762 757 liststats (list, dlist, n, &stats); 763 liststats_setmode (&stats, "MEAN"); 764 765 liststats (list, dlist, NULL, n, &stats); 758 766 free (list); 759 767 free (dlist); … … 783 791 } 784 792 785 liststats (list, dlist, n, &stats); 793 liststats_setmode (&stats, "MEAN"); 794 795 liststats (list, dlist, NULL, n, &stats); 786 796 free (list); 787 797 free (dlist); … … 811 821 } 812 822 813 liststats (list, dlist, n, &stats); 823 liststats_setmode (&stats, "MEAN"); 824 825 liststats (list, dlist, NULL, n, &stats); 814 826 free (list); 815 827 free (dlist); … … 839 851 } 840 852 841 liststats (list, dlist, n, &stats); 853 liststats_setmode (&stats, "MEAN"); 854 855 liststats (list, dlist, NULL, n, &stats); 842 856 free (list); 843 857 free (dlist); -
branches/eam_branches/ipp-20120405/Ohana/src/relphot/src/MosaicOps.c
r33828 r33886 764 764 Image *imageReal; 765 765 off_t j, NimageReal; 766 766 767 StatType stats; 768 liststats_setmode (&stats, STATMODE); 767 769 768 770 double *list = info->list; … … 930 932 } 931 933 } 932 liststats (list, dlist, N, &stats); 934 935 liststats (list, dlist, NULL, N, &stats); 933 936 if (VERBOSE2 && info->PoorImages) fprintf (stderr, "Mmos: %f %f %d %d\n", stats.mean, stats.sigma, stats.Nmeas, N); 934 937 … … 945 948 946 949 // bright end scatter 947 liststats (Mlist, dMlist, N bright, &stats);950 liststats (Mlist, dMlist, NULL, Nbright, &stats); 948 951 myMosaic[0].dMsys = stats.sigma; 949 952 … … 1310 1313 } 1311 1314 1312 liststats (list, dlist, n, &stats); 1315 liststats_setmode (&stats, "MEAN"); 1316 1317 liststats (list, dlist, NULL, n, &stats); 1313 1318 free (list); 1314 1319 free (dlist); … … 1338 1343 } 1339 1344 1340 liststats (list, dlist, n, &stats); 1345 liststats_setmode (&stats, "MEAN"); 1346 1347 liststats (list, dlist, NULL, n, &stats); 1341 1348 free (list); 1342 1349 free (dlist); … … 1383 1390 // fprintf (stderr, "Nmosaic: "OFF_T_FMT", n: "OFF_T_FMT"\n", Nmosaic, n); 1384 1391 1385 liststats (list, dlist, n, &stats); 1392 liststats_setmode (&stats, "MEAN"); 1393 1394 liststats (list, dlist, NULL, n, &stats); 1386 1395 free (list); 1387 1396 free (dlist); … … 1411 1420 } 1412 1421 1413 liststats (list, dlist, n, &stats); 1422 liststats_setmode (&stats, "MEAN"); 1423 1424 liststats (list, dlist, NULL, n, &stats); 1414 1425 free (list); 1415 1426 free (dlist); … … 1423 1434 double *mlist, *slist, *dlist; 1424 1435 double MaxOffset, MedOffset, MaxScatter; 1425 StatType stats;1426 1436 1427 1437 if (!MOSAIC_ZEROPT) return; … … 1442 1452 N++; 1443 1453 } 1444 initstats ("MEAN"); 1445 liststats (mlist, dlist, N, &stats); 1454 1455 StatType stats; 1456 liststats_setmode (&stats, "MEAN"); 1457 1458 liststats (mlist, dlist, NULL, N, &stats); 1446 1459 MaxOffset = MAX (IMAGE_OFFSET, 2*stats.sigma); 1447 1460 MedOffset = stats.median; 1448 liststats (slist, dlist, N, &stats); 1461 1462 liststats (slist, dlist, NULL, N, &stats); 1449 1463 MaxScatter = MAX (IMAGE_SCATTER, 2*stats.median); 1450 1464 fprintf (stderr, "Mrel: %f, dMrel: %f, Max Scatter: %f, Max Offset: %f\n", MedOffset, stats.median, MaxScatter, MaxOffset); … … 1476 1490 1477 1491 fprintf (stderr, OFF_T_FMT" mosaics marked poor ("OFF_T_FMT" scatter, "OFF_T_FMT" offset)\n", Nmark, Nscatter, Noffset); 1478 initstats (STATMODE); 1492 1479 1493 free (mlist); 1480 1494 free (slist); -
branches/eam_branches/ipp-20120405/Ohana/src/relphot/src/StarOps.c
r33827 r33886 13 13 double *list; 14 14 double *dlist; 15 double *wlist; 15 16 double *aplist; 16 17 double *daplist; … … 79 80 ALLOCATE (results->list, double, Nmax); 80 81 ALLOCATE (results->dlist, double, Nmax); 82 ALLOCATE (results->wlist, double, Nmax); 81 83 } 82 84 } … … 85 87 free (results->list); 86 88 free (results->dlist); 89 free (results->wlist); 87 90 } 88 91 … … 159 162 SetMrelInfo summary, results; 160 163 SetMrelInfoInit (&summary, FALSE); 161 SetMrelInfoInit (&results, TRUE); // allocates results->list,dlist 164 SetMrelInfoInit (&results, TRUE); // allocates results->list,dlist,wlist 162 165 ALLOCATE (results.aplist, double, Nmax); 163 166 ALLOCATE (results.daplist, double, Nmax); … … 303 306 int N; 304 307 float Msys, Mcal, Mmos, Mgrid; 308 305 309 StatType stats, apstats; 310 liststats_setmode (&stats, STATMODE); 311 liststats_setmode (&apstats, STATMODE); 306 312 307 313 double *list = results->list; 308 314 double *dlist = results->dlist; 315 double *wlist = results->wlist; 309 316 double *aplist = results->aplist; 310 317 double *daplist = results->daplist; 311 318 312 SetMrelInfoInit (results, FALSE); // do not allocate list,dlist arrays319 SetMrelInfoInit (results, FALSE); // do not allocate list,dlist,wlist arrays 313 320 314 321 int isSetMrelFinal = (pass >= 0); … … 390 397 aplist[N] = Map - Mcal - Mmos - Mgrid; 391 398 392 // count the extended detections399 // special options for PS1 data 393 400 if ((catalog[Nc].measure[m].photcode >= 10000) && (catalog[Nc].measure[m].photcode <= 10500)) { 401 // count the extended detections 394 402 if (!isnan(catalog[Nc].measure[m].Map)) { 395 403 if (catalog[Nc].measure[m].M - catalog[Nc].measure[m].Map > 0.5) { … … 427 435 } 428 436 429 // dlist gives the error , which is used as the weight in WT_MEAN.430 // we can modify the resultingweight in a few ways:437 // dlist gives the error per measurement, wlist gives the weight 438 // we can modify the error and weight in a few ways: 431 439 // 1) MIN_ERROR guarantees a floor 432 440 // 2) photomErrSys is added in quadrature as a sytematic error, set per photcode … … 434 442 // 4) some reference photcode of some kind can be specified as fixed and have a high weight 435 443 dlist[N] = MAX (hypot(catalog[Nc].measureT[m].dM, code->photomErrSys), MIN_ERROR); 444 wlist[N] = 1.0; 436 445 437 446 // up-weight the ubercal values (or convergence can take a long time...) 438 447 if (catalog[Nc].measureT[m].dbFlags & ID_MEAS_PHOTOM_UBERCAL) { 439 dlist[N] = MAX (0.1*catalog[Nc].measureT[m].dM, MIN_ERROR);448 wlist[N] = 10.0; 440 449 } 441 450 … … 445 454 if (refPhotcode) { 446 455 if (code->code == refPhotcode->code) { 447 // tiny error -> large weight 448 // dlist[N] = MAX (0.01*catalog[Nc].measureT[m].dM, MIN_ERROR); 449 dlist[N] = 0.0001; 456 wlist[N] = 100.0; 450 457 } 451 458 } … … 469 476 } 470 477 471 liststats (list, dlist, N, &stats);478 liststats (list, dlist, wlist, N, &stats); 472 479 473 480 catalog[Nc].secfilt[Nsecfilt*j+Nsec].M = stats.mean; … … 481 488 482 489 if (isSetMrelFinal) { 483 liststats (aplist, daplist, N, &apstats);484 490 catalog[Nc].found[Nsecfilt*j+Nsec] = TRUE; 485 491 … … 490 496 catalog[Nc].secfilt[Nsecfilt*j+Nsec].M_80 = 1000 * stats.Upper80; 491 497 catalog[Nc].secfilt[Nsecfilt*j+Nsec].M_20 = 1000 * stats.Lower20; 498 499 // NOTE : use the modified weight for apmags as well as psf mags 500 liststats (aplist, daplist, wlist, N, &apstats); 501 502 catalog[Nc].secfilt[Nsecfilt*j+Nsec].Map = apstats.mean; 492 503 493 504 // NOTE: for 2MASS measurements, Next should be 1, as should N … … 567 578 } 568 579 569 # if (0)570 571 /* grab Nsec for named photcode */572 # define NAMED_PHOTCODE_NSEC(MY_NSEC,NAME) \573 short MY_NSEC = -1; \574 { \575 PhotCode *code = GetPhotcodebyName (NAME); \576 if (code) { \577 MY_NSEC = GetPhotcodeNsec (code->equiv); \578 } }579 580 // For each average object, set the average mags based on existing equiv photometry.581 // NOTE: this function operates on the real Measure & Average structures, not the582 // MeasureTiny & AverageTiny structures583 // NOTE: this function is called on the remote machine -- make sure any (global) options584 // are passed to the relphot_client program585 int setMave (Catalog *catalog, int Ncatalog) {586 587 off_t j, k, m, Nmax;588 int i, Ns, Nsecfilt, N, Nc;589 float Msys;590 double *list, *dlist;591 StatType stats;592 DVOAverageFlags flagBits;593 594 flagBits = ID_OBJ_EXT | ID_OBJ_EXT_ALT | ID_OBJ_GOOD | ID_OBJ_GOOD_ALT;595 596 // pre-allocate a list for stats purposes597 Nmax = 0;598 for (i = 0; i < Ncatalog; i++) {599 for (j = 0; j < catalog[i].Naverage; j++) {600 Nmax = MAX (Nmax, catalog[i].average[j].Nmeasure);601 }602 }603 ALLOCATE (list, double, MAX (1, Nmax));604 ALLOCATE (dlist, double, MAX (1, Nmax));605 606 Nsecfilt = GetPhotcodeNsecfilt ();607 608 // we want to raise some bits on the 2MASS (JHK) secfilt flags, if we have 2MASS data609 NAMED_PHOTCODE_NSEC (Nsec_J, "2MASS_J");610 NAMED_PHOTCODE_NSEC (Nsec_H, "2MASS_H");611 NAMED_PHOTCODE_NSEC (Nsec_K, "2MASS_K");612 613 for (i = 0; i < Ncatalog; i++) {614 for (j = 0; j < catalog[i].Naverage; j++) {615 616 // update average photometry for each of the average filters617 618 // XXX Note that this would be faster if we had an array of results and accumulated619 // them in a single pass620 621 int Next = 0;622 623 for (Ns = 0; Ns < Nsecfilt; Ns++) {624 625 PhotCode *code = GetPhotcodebyNsec (Ns);626 Nc = code[0].code;627 628 N = 0;629 m = catalog[i].average[j].measureOffset;630 for (k = 0; k < catalog[i].average[j].Nmeasure; k++, m++) {631 if (catalog[i].measure[m].dbFlags & MEAS_BAD) continue;632 if (GetPhotcodeEquivCodebyCode (catalog[i].measure[m].photcode) != Nc) continue;633 634 Msys = PhotSys (&catalog[i].measure[m], &catalog[i].average[j], &catalog[i].secfilt[j*Nsecfilt]);635 if (isnan(Msys)) continue;636 637 // reject POOR detections (PSF_QF < 0.85) and count extended detections638 // XXX only apply this filter for psphot data from GPC1 for now...639 if ((catalog[i].measure[m].photcode > 10000) && (catalog[i].measure[m].photcode < 10500)) {640 if (catalog[i].measure[m].psfQual < 0.85) continue;641 if (!isnan(catalog[i].measure[m].Map)) {642 if (catalog[i].measure[m].M - catalog[i].measure[m].Map > 0.5) {643 Next ++;644 }645 }646 }647 648 // XXX make it optional to apply Mcal (do I need an extra field for advisory Mcal?)649 list[N] = Msys - catalog[i].measure[m].Mcal;650 dlist[N] = MAX (catalog[i].measure[m].dM, MIN_ERROR);651 N++;652 }653 if (N < 1) continue;654 655 liststats (list, dlist, N, &stats);656 657 /* use sigma or error in dM for output? */658 catalog[i].secfilt[Nsecfilt*j+Ns].M = stats.mean;659 catalog[i].secfilt[Nsecfilt*j+Ns].dM = stats.error;660 catalog[i].secfilt[Nsecfilt*j+Ns].Mstdev = 1000.0*stats.sigma; // Mstdev is in millimags (not enough space for more precision)661 catalog[i].secfilt[Nsecfilt*j+Ns].Xm = (stats.Nmeas > 1) ? 100.0*log10(stats.chisq) : NAN_S_SHORT;662 catalog[i].secfilt[Nsecfilt*j+Ns].Ncode = N;663 catalog[i].secfilt[Nsecfilt*j+Ns].Nused = stats.Nmeas;664 665 catalog[i].secfilt[Nsecfilt*j+Ns].M_80 = 1000 * stats.Upper80;666 catalog[i].secfilt[Nsecfilt*j+Ns].M_20 = 1000 * stats.Lower20;667 668 if ((Next > 0) && (Next > 0.5*N)) {669 catalog[i].secfilt[Nsecfilt*j+Ns].flags |= ID_SECF_OBJ_EXT;670 }671 }672 673 // update average flags based on the detection stats.674 675 int Galaxy2MASS = FALSE; // best guess for galaxy based on 2MASS J measurements (gal_contam == measure.flags[0x00400000 | 0x00800000])676 int goodPS1 = FALSE; // true if any PS1 measurements have psfQual > 0.85677 int good2MASS = FALSE; // true if 2MASS J measurements have significant detections678 int nEXT = 0;679 int nPSF = 0; // number of PS1 PSF vs EXT measurements680 int have2MASS = FALSE;681 682 // count, flag good and extended detections683 m = catalog[i].average[j].measureOffset;684 for (k = 0; k < catalog[i].average[j].Nmeasure; k++, m++) {685 686 // PS1 data :687 if ((catalog[i].measure[m].photcode >= 10000) && (catalog[i].measure[m].photcode <= 10500)) {688 if (catalog[i].measure[m].psfQual > 0.85) {689 goodPS1 = TRUE;690 if (!isnan(catalog[i].measure[m].Map)) {691 if (catalog[i].measure[m].M - catalog[i].measure[m].Map > 0.5) {692 nEXT ++;693 } else {694 nPSF ++;695 }696 }697 }698 }699 700 // 2MASS data J-band flags701 if (catalog[i].measure[m].photcode == 2011) {702 // only need to do this once (always have JHK triplet; galaxy flag is same for all 3)703 have2MASS = TRUE;704 if (catalog[i].measure[m].photFlags & 0x00c00000) {705 Galaxy2MASS = TRUE;706 }707 if (catalog[i].measure[m].photFlags & 0x00000007) {708 good2MASS = TRUE;709 if (Nsec_J > -1) catalog[i].secfilt[j*Nsecfilt + Nsec_J].flags |= ID_PHOTOM_PASS_0;710 } else {711 if (Nsec_J > -1) catalog[i].secfilt[j*Nsecfilt + Nsec_J].flags |= ID_PHOTOM_PASS_1;712 }713 }714 // 2MASS data H-band flags715 if (catalog[i].measure[m].photcode == 2012) {716 if (catalog[i].measure[m].photFlags & 0x00000007) {717 good2MASS = TRUE;718 if (Nsec_H > -1) catalog[i].secfilt[j*Nsecfilt + Nsec_H].flags |= ID_PHOTOM_PASS_0;719 } else {720 if (Nsec_H > -1) catalog[i].secfilt[j*Nsecfilt + Nsec_H].flags |= ID_PHOTOM_PASS_1;721 }722 }723 // 2MASS data K-band flags724 if (catalog[i].measure[m].photcode == 2013) {725 if (catalog[i].measure[m].photFlags & 0x00000007) {726 good2MASS = TRUE;727 if (Nsec_K > -1) catalog[i].secfilt[j*Nsecfilt + Nsec_K].flags |= ID_PHOTOM_PASS_0;728 } else {729 if (Nsec_K > -1) catalog[i].secfilt[j*Nsecfilt + Nsec_K].flags |= ID_PHOTOM_PASS_1;730 }731 }732 }733 734 // we attempt to set a few flags here; reset those bits before trying:735 catalog[i].average[j].flags &= ~flagBits;736 737 // XXX set the secfilt bits?738 if (nEXT && (nEXT > nPSF)) {739 catalog[i].average[j].flags |= ID_OBJ_EXT;740 }741 if (goodPS1) {742 catalog[i].average[j].flags |= ID_OBJ_GOOD;743 }744 if (Galaxy2MASS) {745 catalog[i].average[j].flags |= ID_OBJ_EXT_ALT;746 if (Nsec_J > -1) catalog[i].secfilt[j*Nsecfilt + Nsec_J].flags |= ID_SECF_OBJ_EXT;747 if (Nsec_H > -1) catalog[i].secfilt[j*Nsecfilt + Nsec_H].flags |= ID_SECF_OBJ_EXT;748 if (Nsec_K > -1) catalog[i].secfilt[j*Nsecfilt + Nsec_K].flags |= ID_SECF_OBJ_EXT;749 }750 if (good2MASS) {751 catalog[i].average[j].flags |= ID_OBJ_GOOD_ALT;752 }753 }754 }755 756 free (list);757 free (dlist);758 return (TRUE);759 }760 # endif761 762 580 /* set measure.Mcal for all measures except ID_MEAS_NOCAL and ID_IMAGE_PHOTOM_NOCAL */ 763 581 int setMcalOutput (Catalog *catalog, int Ncatalog, FlatCorrectionTable *flatcorr) { … … 804 622 double Chisq, MaxScatter, MaxChisq; 805 623 double *xlist, *slist, *dlist; 624 806 625 StatType stats; 626 liststats_setmode (&stats, "MEAN"); 807 627 808 628 if (VERBOSE) fprintf (stderr, "marking poor stars\n"); … … 818 638 int Nsecfilt = GetPhotcodeNsecfilt (); 819 639 820 // XX int oldPLOTSTUFF = PLOTSTUFF;821 // XX PLOTSTUFF = TRUE;822 // XX plot_chisq (catalog, Ncatalog);823 // XX PLOTSTUFF = oldPLOTSTUFF;824 825 640 // eliminate bad stars using the stats for a single secfilt at a time 826 // XXX DEP replace average.flags with secfilt flags827 641 for (Ns = 0; Ns < Nphotcodes; Ns ++) { 828 642 … … 843 657 } 844 658 845 initstats ("MEAN"); 846 liststats (xlist, dlist, Ntot, &stats); 659 liststats (xlist, dlist, NULL, Ntot, &stats); 847 660 MaxChisq = MAX (STAR_CHISQ, 2*stats.median); 848 liststats (slist, dlist, Ntot, &stats); 661 662 liststats (slist, dlist, NULL, Ntot, &stats); 849 663 MaxScatter = MAX (STAR_SCATTER, 2*stats.median); 850 664 fprintf (stderr, "Max Scatter: %f, Max Chisq: %f\n", MaxScatter, MaxChisq); … … 870 684 } 871 685 fprintf (stderr, "%d stars marked variable (%d scat, %d nan, %d chi), %d total\n", Ndel, Nscat, Nnan, Nchi, Nave); 872 initstats (STATMODE);873 686 } 874 687 free (xlist); … … 876 689 free (dlist); 877 690 } 691 692 // clean_measures examines the stats for a single star. It measures the INNER 50% mean 693 // and sigma, it then re-measures the mean and sigma using all stars with NSIGMA_CLIP (3) 694 // sigma of the INNER 50% mean. it then flags any measurements which are more than 695 // NSIGMA_REJECT (5) sigma of the mean 878 696 879 697 # define NSIGMA_CLIP 3.0 … … 886 704 double *tlist, *list, *dlist; 887 705 float Msys, Mcal, Mmos, Mgrid; 888 StatType stats;889 706 int Ncal, Nmos, Ngrid, Nfew; 890 707 … … 906 723 /* it makes no sense to mark 3-sigma outliers with <5 measurements */ 907 724 TOOFEW = MAX (5, STAR_TOOFEW); 725 726 // stats structures for inner and full stats 727 StatType instats, stats; 728 liststats_setmode (&instats, "INNER_MEAN"); 729 liststats_setmode (&stats, "MEAN"); 908 730 909 731 Ndel = Nave = 0; … … 953 775 954 776 // calculated mean of inner 50% 955 initstats ("INNER_MEAN"); 956 liststats (list, dlist, N, &stats); 957 stats.sigma = MAX (MIN_ERROR, stats.sigma); /* if measurements agree too well, sigma -> 0.0 */ 777 liststats (list, dlist, NULL, N, &instats); 778 instats.sigma = MAX (MIN_ERROR, instats.sigma); /* if measurements agree too well, sigma -> 0.0 */ 958 779 959 780 // ignore entries > 3sigma from inner mean 960 781 for (k = m = 0; k < N; k++) { 961 if (fabs (list[k] - stats.median) < NSIGMA_CLIP*stats.sigma) {782 if (fabs (list[k] - instats.median) < NSIGMA_CLIP*instats.sigma) { 962 783 list[m] = list[k]; 963 784 m++; … … 965 786 } 966 787 // recalculate the mean & sigma of the accepted measurements 967 initstats ("MEAN"); 968 liststats (list, dlist, m, &stats); 788 liststats (list, dlist, NULL, m, &stats); 969 789 stats.sigma = MAX (MIN_ERROR, stats.sigma); 970 790 … … 1015 835 } 1016 836 } 1017 initstats (STATMODE);1018 837 if (VERBOSE) fprintf (stderr, OFF_T_FMT" measures marked poor, "OFF_T_FMT" total\n", Ndel, Nave); 838 1019 839 free (list); 1020 840 free (dlist); 1021 841 free (ilist); 1022 842 free (tlist); 1023 1024 1025 843 } 1026 844 … … 1072 890 } 1073 891 1074 // fprintf (stderr, "N1: %d, N2: %d, N3: %d, N4: %d, N0: %d\n", N1, N2, N3, N4, N0); 1075 liststats (list, dlist, n, &stats); 892 liststats_setmode (&stats, "MEAN"); 893 894 liststats (list, dlist, NULL, n, &stats); 1076 895 free (list); 1077 896 free (dlist); … … 1112 931 } 1113 932 1114 liststats (list, dlist, n, &stats); 933 liststats_setmode (&stats, "MEAN"); 934 935 liststats (list, dlist, NULL, n, &stats); 1115 936 free (list); 1116 937 free (dlist); … … 1151 972 } 1152 973 1153 liststats (list, dlist, n, &stats); 974 liststats_setmode (&stats, "MEAN"); 975 976 liststats (list, dlist, NULL, n, &stats); 1154 977 free (list); 1155 978 free (dlist); -
branches/eam_branches/ipp-20120405/Ohana/src/relphot/src/global_stats.c
r33820 r33886 12 12 13 13 // struct timeval startTimer, stopTimer; 14 15 initstats ("MEAN");16 14 17 15 fprintf (stderr, "\n"); … … 60 58 fprintf (stderr, "dMcal mosaic: %7.4f %7.4f %7.4f %7.4f %7.4f %6d\n", msD.median, msD.mean, msD.sigma, msD.min, msD.max, msD.Nmeas); 61 59 fprintf (stderr, "chisq mosaic: %7.1f %7.1f %7.1f %7.1f %7.1f %6d\n", msX.median, msX.mean, msX.sigma, msX.min, msX.max, msX.Nmeas); 62 63 64 initstats (STATMODE);65 66 60 } 67 61 -
branches/eam_branches/ipp-20120405/Ohana/src/relphot/src/initialize.c
r33823 r33886 33 33 exit (1); 34 34 } 35 36 initstats (STATMODE);37 35 38 36 IMAGE_BAD = ID_IMAGE_PHOTOM_POOR | ID_IMAGE_PHOTOM_FEW | ID_IMAGE_PHOTOM_SKIP; -
branches/eam_branches/ipp-20120405/Ohana/src/relphot/src/liststats.c
r33651 r33886 1 1 # include "relphot.h" 2 2 3 enum {M_MEAN, M_MEDIAN, M_WT_MEAN, M_INNER_MEAN, 4 M_INNER_WTMEAN, M_CHI_INNER_MEAN, M_CHI_INNER_WTMEAN}; 3 void liststats_setmode (StatType *stats, char *strmode) { 5 4 6 static int statmode; 5 stats->statmode = -1; 6 if (!strcmp (strmode, "MEAN")) { stats->statmode = STATS_MEAN; return; } 7 if (!strcmp (strmode, "MEDIAN")) { stats->statmode = STATS_MEDIAN; return; } 8 if (!strcmp (strmode, "WT_MEAN")) { stats->statmode = STATS_WT_MEAN; return; } 9 if (!strcmp (strmode, "INNER_MEAN")) { stats->statmode = STATS_INNER_MEAN; return; } 10 if (!strcmp (strmode, "INNER_WTMEAN")) { stats->statmode = STATS_INNER_WTMEAN; return; } 11 if (!strcmp (strmode, "CHI_INNER_MEAN")) { stats->statmode = STATS_CHI_INNER_MEAN; return; } 12 if (!strcmp (strmode, "CHI_INNER_WTMEAN")) { stats->statmode = STATS_CHI_INNER_WTMEAN; return; } 7 13 8 void initstats (char *mode) { 9 10 statmode = -1; 11 if (!strcmp (mode, "MEAN")) statmode = M_MEAN; 12 if (!strcmp (mode, "MEDIAN")) statmode = M_MEDIAN; 13 if (!strcmp (mode, "WT_MEAN")) statmode = M_WT_MEAN; 14 if (!strcmp (mode, "INNER_MEAN")) statmode = M_INNER_MEAN; 15 if (!strcmp (mode, "INNER_WTMEAN")) statmode = M_INNER_WTMEAN; 16 if (!strcmp (mode, "CHI_INNER_MEAN")) statmode = M_CHI_INNER_MEAN; 17 if (!strcmp (mode, "CHI_INNER_WTMEAN")) statmode = M_CHI_INNER_WTMEAN; 18 19 if (statmode == -1) { 20 fprintf (stderr, "ERROR: invalid stats mode: %s\n", mode); 21 exit (1); 22 } 14 fprintf (stderr, "ERROR: invalid stats mode: %s\n", strmode); 15 exit (1); 23 16 } 24 17 25 int liststats (double *value, double *dvalue, int N, StatType *stats) {18 int liststats (double *value, double *dvalue, double *weight, int N, StatType *stats) { 26 19 27 int i, ks, ke, Nm; 28 double Mo, dMo, M, dM, X2, dS, *chi; 20 int i, ks, ke; 21 double Mo, dMo, M, dM, Nm, X2, dS, R, W, *chi; 22 23 myAssert (stats->statmode != STATS_NONE, "programming error, liststats mode not set"); 24 myAssert (weight, "work out logic for NULL weight"); 29 25 30 26 ke = ks = dMo = 0; … … 37 33 if (N < 1) return (FALSE); 38 34 39 dsortpair (value, dvalue, N);40 stats[0].median = value[(int)(0.5*N)];41 stats[0].min = value[0];42 stats[0].max = value[N-1];43 35 int N80 = MIN (N-1, 0.8*N); 44 36 int N20 = MAX (0, 0.2*N); 37 38 if (weight) { 39 dsortthree (value, dvalue, weight, N); 40 } else { 41 dsortpair (value, dvalue, N); 42 } 43 44 // these values do not depend on the errors or weighting scheme 45 stats[0].median = value[(int)(0.5*N)]; 46 stats[0].min = value[0]; 47 stats[0].max = value[N-1]; 45 48 stats[0].Upper80 = value[N80]; 46 49 stats[0].Lower20 = value[N20]; 47 50 48 switch (statmode) { 49 case M_MEDIAN: 50 ks = 0; 51 ke = N; 52 Mo = stats[0].median; 53 Nm = N; 54 goto chisq; 55 break; 56 case M_MEAN: 57 case M_WT_MEAN: 58 ks = 0; 59 ke = N; 60 break; 61 case M_INNER_MEAN: 62 case M_INNER_WTMEAN: 63 case M_CHI_INNER_MEAN: 64 case M_CHI_INNER_WTMEAN: 65 ks = 0.25*N + 0.50; 66 ke = 0.75*N + 0.25; 67 if (N <= 3) { 51 switch (stats->statmode) { 52 case STATS_MEDIAN: 68 53 ks = 0; 69 54 ke = N; 70 } 71 break; 55 Mo = stats[0].median; 56 Nm = N; 57 goto chisq; 58 break; 59 case STATS_MEAN: 60 case STATS_WT_MEAN: 61 ks = 0; 62 ke = N; 63 break; 64 case STATS_INNER_MEAN: 65 case STATS_INNER_WTMEAN: 66 case STATS_CHI_INNER_MEAN: 67 case STATS_CHI_INNER_WTMEAN: 68 ks = 0.25*N + 0.50; 69 ke = 0.75*N + 0.25; 70 if (N <= 3) { 71 ks = 0; 72 ke = N; 73 } 74 break; 75 case STATS_NONE: 76 myAbort ("undefined stats"); 72 77 } 73 78 74 if ((statmode == M_CHI_INNER_MEAN) || (statmode == M_CHI_INNER_WTMEAN)) { 79 // for these two modes, I need a vector of the chi-square contribution 80 // I'm actually just using chisq to get the correct sorting order 81 if ((stats->statmode == STATS_CHI_INNER_MEAN) || (stats->statmode == STATS_CHI_INNER_WTMEAN)) { 75 82 ALLOCATE (chi, double, N); 76 83 for (i = 0; i < N; i++) { 77 84 chi[i] = (value[i] - stats[0].median) / dvalue[i]; 78 85 } 79 dsortthree (chi, value, dvalue, N); 86 if (weight) { 87 dsortfour (chi, value, dvalue, weight, N); 88 } else { 89 dsortthree (chi, value, dvalue, N); 90 } 80 91 free (chi); 81 92 } 82 93 83 /* calculating the per-star offset based on the weighted average */ 84 M = dM = Nm = 0; 85 if ((statmode == M_WT_MEAN) || (statmode == M_INNER_WTMEAN) || (statmode == M_CHI_INNER_WTMEAN)) { 86 for (i = ks; i < ke; i++) { 87 M += value[i] / SQ (dvalue[i]); 88 dM += 1.0 / SQ (dvalue[i]); 89 Nm ++; 90 } 91 Mo = M / dM; 92 dMo = sqrt (1.0 / dM); 94 int WeightedMean = FALSE; 95 WeightedMean |= (stats->statmode == STATS_WT_MEAN); 96 WeightedMean |= (stats->statmode == STATS_INNER_WTMEAN); 97 WeightedMean |= (stats->statmode == STATS_CHI_INNER_WTMEAN); 98 99 /* calculating the per-star offset based on the desired weighting scheme */ 100 M = dM = Nm = W = R = 0; 101 if (weight) { 102 // the weight value is multiplied by whichever nominal weighting scheme is provided 103 // thus the user should set weight to 1.0 for nominal weight, and 100 for heavy weight (or so) 104 // and 0.01 for under-weight 105 if (WeightedMean) { 106 for (i = ks; i < ke; i++) { 107 M += value[i] * weight[i] / SQ(dvalue[i]); 108 W += weight[i] / SQ(dvalue[i]); 109 dM += SQ (weight[i] / dvalue[i]); 110 R += weight[i] / SQ(dvalue[i]); 111 Nm += 1.0; 112 } 113 Mo = M / W; 114 dMo = sqrt (dM / R); 115 } else { 116 for (i = ks; i < ke; i++) { 117 M += value[i] * weight[i]; 118 W += weight[i]; 119 dM += SQ (weight[i] * dvalue[i]); 120 R += weight[i]; 121 Nm += 1.0; 122 } 123 Mo = M / W; 124 dMo = sqrt (dM / R); 125 } 93 126 } else { 94 for (i = ks; i < ke; i++) { 95 M += value[i]; 96 dM += SQ (dvalue[i]); 97 Nm ++; 98 } 99 Mo = M / (double) Nm; 100 dMo = sqrt (dM / (double) Nm); 127 // NULL weight vector is supplied, revert to standard form (above reverts if weight[i] == 1) 128 if (WeightedMean) { 129 // weighted by inverse-variance 130 for (i = ks; i < ke; i++) { 131 M += value[i] / SQ (dvalue[i]); 132 dM += 1.0 / SQ (dvalue[i]); 133 Nm += 1.0; 134 } 135 Mo = M / dM; 136 dMo = sqrt (1.0 / dM); 137 } else { 138 // pure un-weighted 139 for (i = ks; i < ke; i++) { 140 M += value[i]; 141 dM += SQ (dvalue[i]); 142 Nm += 1.0; 143 } 144 Mo = M / Nm; 145 dMo = sqrt (dM) / Nm; 146 } 101 147 } 102 148 … … 111 157 } 112 158 X2 = X2 / (Nm - 1); 113 dS = sqrt (dS / Nm);159 dS = sqrt (dS / (Nm - 1)); 114 160 115 161 stats[0].mean = Mo; … … 122 168 } 123 169 170 // we could define the weight to be the only scale factor: 171 // \mu = \sum (value_i * weight_i) / \sum (weight_i) 172 // \sigma^2 = (1/R) \sum (weight_i^2 \sigma_i^2) 173 // R = \sum (weight_i^2) 174 175 // or, we could define the weight to be a scale factor times the inverse error: 176 // \mu = \sum (value_i * weight_i / sigma_i) / \sum (weight_i) 177 // \sigma^2 = (1/R) \sum (weight_i^2 \sigma_i^2) 178 // R = \sum (weight_i^2)
Note:
See TracChangeset
for help on using the changeset viewer.
