Changeset 23924 for trunk/extsrc/gpcsw/gpcsrc/fits/burntool
- Timestamp:
- Apr 18, 2009, 11:11:15 AM (17 years ago)
- Location:
- trunk/extsrc/gpcsw/gpcsrc/fits/burntool
- Files:
-
- 2 added
- 9 edited
-
Makefile (modified) (3 diffs)
-
burnparams.h (modified) (3 diffs)
-
burntool.c (modified) (23 diffs)
-
burntool.h (modified) (6 diffs)
-
man/burntool.1 (modified) (4 diffs)
-
persist_fits.c (added)
-
persist_fits.h (added)
-
persistfix.c (modified) (1 diff)
-
persistio.c (modified) (1 diff)
-
psfstats.c (modified) (3 diffs)
-
trailfit.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/extsrc/gpcsw/gpcsrc/fits/burntool/Makefile
r23526 r23924 5 5 CCDEFS+=$(VERSIONDEFS) 6 6 CCLINK += -lm 7 8 7 # $(EXECNAME): $(OBJS) libfh.a libpsf.a libpscoords.a 9 8 $(EXECNAME): $(OBJS) libfh.a libpscoords.a … … 13 12 # Dependencies by Make.Common $Revision: 2.17 $ 14 13 15 $(OBJ)/basement.o: basement.c16 17 14 $(OBJ)/burnfix.o: burnfix.c burntool.h burnparams.h 18 15 19 16 $(OBJ)/burntool.o: burntool.c fh/fh.h fhreg/general.h \ 20 17 fhreg/macros.h fhreg/gpc_detector.h \ 21 burntool.h burnparams.h 18 burntool.h burnparams.h persist_fits.h 22 19 23 20 $(OBJ)/burnutils.o: burnutils.c burntool.h burnparams.h 24 21 25 22 $(OBJ)/cheapfits.o: cheapfits.c 23 24 $(OBJ)/persist_fits.o: persist_fits.c fh/fh.h burntool.h \ 25 burnparams.h persist_fits.h 26 26 27 27 $(OBJ)/persistfix.o: persistfix.c burntool.h burnparams.h … … 34 34 $(OBJ)/psfstats.o: psfstats.c burntool.h psf/psf.h 35 35 36 $(OBJ)/sort.o: sort.c 37 36 38 $(OBJ)/stardetect.o: stardetect.c burntool.h burnparams.h 37 39 -
trunk/extsrc/gpcsw/gpcsrc/fits/burntool/burnparams.h
r23490 r23924 1 1 /* A global buffer into which routines can accumulate detections */ 2 #ifndef _INCLUDED_burnparams_ 3 #define _INCLUDED_burnparams_ 2 4 3 5 /* '#define EXTERN' in just one file, burntool.c, to declare variables */ … … 28 30 EXTERN int MAX_READ_NOISE; /* Maximum believable read noise (ADU) */ 29 31 EXTERN double MIN_EADU; /* Minimum believable e/ADU */ 32 EXTERN int SAT4SURE; /* Ignore pixels above for noise estimate */ 33 EXTERN double MIN_BLAST_PASS; /* Allow blasted cells if they have BIG satfrac */ 34 EXTERN double MAX_BLAST_PASS; /* But not if it's all wiped out! */ 30 35 31 36 EXTERN int BURN_THRESH ; /* Threshold for onset of burning */ … … 48 53 49 54 EXTERN double NEGLIGIBLE_TRAIL; /* Don't sweat less than this * sigma */ 55 EXTERN int EXPIRE_TRAIL_TIME; /* Expire trails after this interval */ 50 56 51 57 #endif /* _INCLUDED_burnparams_ */ -
trunk/extsrc/gpcsw/gpcsrc/fits/burntool/burntool.c
r23552 r23924 20 20 #define EXTERN /* Define EXTERN to declare variables in params.h */ 21 21 #include "burnparams.h" 22 #include "persist_fits.h" 22 23 23 24 int … … 28 29 HeaderUnit ehu; 29 30 const char* ifilename = "-"; 30 const char* ofilename = NULL;31 31 char extname[FH_MAX_STRLEN+1], otaposn[FH_MAX_STRLEN+1]; 32 32 int cellmask[MAXCELL]; … … 34 34 int nextend, cellxy, cell, cellcode; 35 35 int ext, update, restore, psfsize, psfavg; 36 int outfd;37 36 IMTYPE *buf; 38 const char *burnfile=NULL, *persistfile=NULL; 37 const char *burnfile=NULL, *persistfile=NULL, *persistfitsfile=NULL; 38 const char *deltablefitsfile=NULL; 39 39 const char *psffile=NULL, *psfstatfile=NULL; 40 40 CELL OTA[MAXCELL]; /* Cell structure for entire OTA */ 41 41 42 if (argc == 1) {43 syntax(argv[0]);44 exit(EXIT_SUCCESS);45 }46 47 42 if(argc > 1 && strncmp(argv[1], "help", 4) == 0) { 48 syntax(argv[0]);49 exit(EXIT_SUCCESS);50 }51 52 if(argc > 1 && strncmp(argv[1], "--help", 6) == 0) {53 syntax(argv[0]);54 exit(EXIT_SUCCESS);55 }56 57 if(argc > 1 && strncmp(argv[1], "-h", 6) == 0) {58 43 syntax(argv[0]); 59 44 exit(EXIT_SUCCESS); … … 71 56 fprintf(stderr, "\rerror: `%s' is not a multi-extension FITS\n", 72 57 ifilename); 58 #ifndef JT2DHACK 73 59 exit(EXIT_FAILURE); 60 #endif 74 61 } 75 62 … … 91 78 MAX_READ_NOISE = 20; /* Maximum believable read noise (ADU) */ 92 79 MIN_EADU = 0.3; /* Minimum believable e/ADU */ 80 SAT4SURE = 60000; /* Ignore pixels above for noise estimate */ 81 MIN_BLAST_PASS = 0.1; /* Allow blasted cells if they have BIG satfrac */ 82 MAX_BLAST_PASS = 0.9; /* But not if it's all wiped out! */ 93 83 94 84 BURN_THRESH = 30000; /* Threshold for onset of burning */ … … 108 98 109 99 NEGLIGIBLE_TRAIL = 0.5; /* Don't sweat less than this * sigma */ 110 100 EXPIRE_TRAIL_TIME = 2000; /* Expire a persist after this [sec] */ 111 101 112 102 /* Parse the args */ … … 155 145 burnfile = argv[i] + 9; 156 146 157 /* Output file for burn streaks */147 /* Output text file for burn streaks */ 158 148 } else if(strncmp(argv[i], "out=", 4) == 0) { /* out=fname */ 159 149 burnfile = argv[i] + 4; 160 150 161 # if (0) 162 /* XXX disable for now: is not yet working */ 163 /* Alternate Output file for deburned image */ 164 } else if(strncmp(argv[i], "outimage=", 9) == 0) { /* outimage=fname */ 165 ofilename = argv[i] + 9; 166 # endif 167 168 /* Input file for previous burn persistence streaks */ 169 } else if(strncmp(argv[i], "trailin=", 8) == 0) { /* trailin=fname */ 151 /* Input text file for previous burn persistence streaks */ 152 } else if(strncmp(argv[i], "infits=", 8) == 0) { /* in=fname */ 170 153 persistfile = argv[i] + 8; 154 155 /* Same thing, but information is stored in tables in a FITS file. */ 156 } else if(strncmp(argv[i], "trailinfits=", 8) == 0) { /* infits=fname */ 157 persistfitsfile = argv[i] + 12; 171 158 172 159 /* Input file for previous burn persistence streaks */ 173 160 } else if(strncmp(argv[i], "in=", 3) == 0) { /* in=fname */ 174 161 persistfile = argv[i] + 3; 162 163 /* Same thing, but information is stored in tables in a FITS file. */ 164 } else if(strncmp(argv[i], "trailinfits=", 8) == 0) { /* trailin=fname */ 165 persistfitsfile = argv[i] + 12; 175 166 176 167 /* Output file for PSF gallery */ … … 244 235 } else if(strncmp(argv[i], "thrpsf=", 7) == 0) { /* thrpsf=thresh */ 245 236 if(sscanf(argv[i]+7, "%d", &PSF_THRESH) != 1) { 237 fprintf(stderr, "\rerror: cannot get value from `%s'\n", argv[i]); 238 exit(EXIT_FAILURE); 239 } 240 241 } else if(strncmp(argv[i], "expire=", 7) == 0) { /* expire=nsec */ 242 if(sscanf(argv[i]+7, "%d", &EXPIRE_TRAIL_TIME) != 1) { 246 243 fprintf(stderr, "\rerror: cannot get value from `%s'\n", argv[i]); 247 244 exit(EXIT_FAILURE); … … 295 292 } 296 293 294 } else if(strncmp(argv[i], "deltables=", 8) == 0) { /* trailin=fname */ 295 deltablefitsfile = argv[i] + 10; 296 297 297 } else if(strncmp(argv[i], "help", 4) == 0) { /* help output */ 298 298 syntax(argv[0]); … … 306 306 } 307 307 308 /* If we're told to remove the table from a FITS file, then 309 * do nothing else. */ 310 if(deltablefitsfile) { 311 fprintf(stderr, 312 "\rRemoving burn tables from %s, all other options ignored.\n", 313 ifilename); 314 if(persist_fits_remove_tables(ihu, deltablefitsfile) != FH_SUCCESS) { 315 exit(EXIT_FAILURE); 316 } 317 else { 318 exit(EXIT_SUCCESS); 319 } 320 } 321 322 /* If there is no other persistence info supplied, try getting 323 * it from the input FITS file. */ 308 324 if(restore && persistfile == NULL) { 309 fprintf(stderr, "\rerror: must specify an input file for restore\n"); 310 exit(EXIT_FAILURE); 325 if(persistfitsfile == NULL) persistfitsfile = ifilename; 311 326 } 312 327 … … 322 337 if(persist_read(OTA, persistfile)) exit(EXIT_FAILURE); 323 338 } 339 else if(persistfitsfile != NULL) { 340 if(persist_fits_read(OTA, persistfitsfile) != FH_SUCCESS) exit(EXIT_FAILURE); 341 } 324 342 325 343 /* Which OTA is this??? */ … … 333 351 } 334 352 335 if (ofilename) { 336 outfd = creat (ofilename, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); 337 if (outfd == -1) { 338 fprintf(stderr, "\rerror: Cannot open %s for output\n", ofilename); 339 exit(EXIT_FAILURE); 340 } 341 342 if (fh_write(ihu, outfd)) { 343 fprintf(stderr, "\rerror: Trouble writing PHU to %s\n", ofilename); 344 exit(EXIT_FAILURE); 345 } 353 /* Warn that what you're doing might not be a good idea. */ 354 { 355 fh_bool burn_applied; 356 357 if(fh_get_bool(ihu, PHU_NAME_BURN_APPLIED, 358 &burn_applied) != FH_SUCCESS) { 359 if(VERBOSE > 0) { 360 fprintf(stderr, 361 "warning: Unable to determine whether burn correction " 362 "already applied - unable to find %s in primary header\n", 363 PHU_NAME_BURN_APPLIED); 364 } 365 burn_applied = FH_FALSE; 366 } 367 if(restore && (burn_applied == FH_FALSE)) { 368 fprintf(stderr, 369 "warning: Restoring old burns, but header indicates no burns previously corrected.\n"); 370 } 371 else if (update && (burn_applied == FH_TRUE)) { 372 fprintf(stderr, 373 "warning: Applying burn correction, but header indicates burns previously corrected.\n"); 374 } 346 375 } 347 376 348 377 /* Look at all the MEF's extensions */ 378 #ifndef JT2DHACK 349 379 for (ext = 1; ext <= nextend; ext++) { 380 #else 381 for (ext = 1; ext <= MAX(1,nextend); ext++) { 382 #endif 350 383 int naxis, naxis1, naxis2, naxis3; 351 384 int prescan1, ovrscan1, ovrscan2, pontime; … … 353 386 char xtension[FH_MAX_STRLEN + 1]; 354 387 388 #ifdef JT2DHACK 389 if(nextend == 0) { 390 ehu = ihu; 391 sprintf(extname, "%s", "xy00"); 392 } else { 393 #endif 355 394 if (!(ehu = fh_ehu(ihu, ext)) || 356 395 fh_get_str(ehu, "EXTNAME", extname, sizeof(extname)) != FH_SUCCESS) { … … 377 416 fprintf(stderr, 378 417 "warning: Skipping non-image extension %s\n", extname); 418 #ifdef JT2DHACK 419 } 420 #endif 379 421 /* 380 422 * %%% When reading from a pipe, does the data still need … … 448 490 if (fh_get_BZERO(ehu, &bzero_d) == FH_SUCCESS) BZERO = bzero_d; 449 491 492 if(VERBOSE & VERB_NORM) { 493 printf("nx=%d ny=%d prex=%d postx=%d posty=%d BZERO=%.1f\n", 494 naxis1, naxis2, prescan1, ovrscan1, ovrscan2, BZERO); 495 } 496 450 497 buf = (IMTYPE*)malloc(naxis1*naxis2*naxis3*sizeof(short)); 451 498 if (fh_read_padded_image(ehu, fh_file_desc(ehu), buf, … … 471 518 /* Get bias and sky levels */ 472 519 err = cell_stats(nx, ny, naxis1, naxis2, imbuf, OTA+cell); 520 if(err) { 521 if(VERBOSE > 0) { 522 fprintf(stderr, "logonly: error getting bias/sky/rms for cell %d, skipping...\n", cell); 523 } 524 continue; 525 } 526 527 /* Does this cell get a pass because it's heavily blasted? */ 528 /* Turn it in to a relaxation factor for the "read noise" */ 529 i = OTA[cell].satfrac > MIN_BLAST_PASS && 530 OTA[cell].satfrac < MAX_BLAST_PASS && 531 OTA[cell].sky < TRAIL_THRESH ? 30 : 1; 473 532 474 533 /* Does this cell look kosher? */ 475 534 if(OTA[cell].rms*OTA[cell].rms > 476 OTA[cell].sky/MIN_EADU + MAX_READ_NOISE*MAX_READ_NOISE) {535 OTA[cell].sky/MIN_EADU + i*i*MAX_READ_NOISE*MAX_READ_NOISE) { 477 536 if(VERBOSE > 0) { 478 537 fprintf(stderr, "logonly: cell %d is unreasonably noisy, skipping...\n", cell); 538 fprintf(stderr, "logonly: bias = %d sky = %d rms = %d satfrac = %.2f\n", 539 OTA[cell].bias, OTA[cell].sky, OTA[cell].rms, OTA[cell].satfrac); 479 540 } 480 541 continue; … … 506 567 507 568 } else { 508 509 569 /* Restore the old burns */ 510 570 burn_restore(naxis1-ovrscan1, naxis2-ovrscan2, naxis1, … … 514 574 /* Write the corrected data back to the FITS. */ 515 575 if(update) { 516 if (ofilename) { 517 fh_ehu(ehu, 0); /* Seek back to the start of data */ 518 519 if (fh_write(ehu, outfd)) { 520 fprintf(stderr, "\rerror: Trouble writing EXT %d to %s\n", ext, ofilename); 521 exit(EXIT_FAILURE); 522 } 523 524 if (fh_write_padded_image(ehu, outfd, buf, 525 naxis1*naxis2*naxis3*sizeof(short), 526 FH_TYPESIZE_16) != FH_SUCCESS) { 576 fh_ehu(ehu, 0); /* Seek back to the start of data */ 577 if (fh_write_padded_image(ehu, fh_file_desc(ehu), buf, 578 naxis1*naxis2*naxis3*sizeof(short), 579 FH_TYPESIZE_16) != FH_SUCCESS) { 527 580 fprintf(stderr, "\rerror: failed to re-write image data for extension `%s'.\n", 528 581 extname); 529 582 free(buf); 530 583 exit(EXIT_FAILURE); 531 } 532 } else { 533 fh_ehu(ehu, 0); /* Seek back to the start of data */ 534 if (fh_write_padded_image(ehu, fh_file_desc(ehu), buf, 535 naxis1*naxis2*naxis3*sizeof(short), 536 FH_TYPESIZE_16) != FH_SUCCESS) { 537 fprintf(stderr, "\rerror: failed to re-write image data for extension `%s'.\n", 538 extname); 539 free(buf); 540 exit(EXIT_FAILURE); 541 } 542 } 543 } 544 } 545 584 } 585 } 586 } 587 546 588 free(buf); 547 589 } 548 590 549 if (ofilename) {550 if (close(outfd)) {551 fprintf(stderr, "\rerror: trouble writing data to output file %s\n", ofilename);552 exit(EXIT_FAILURE);553 }554 }555 556 591 /* Dump out the postage stamp file */ 557 592 if(psffile != NULL) { … … 564 599 } 565 600 601 /* Write burn info to FITS file. */ 602 if(update) persist_fits_write(OTA, ihu); 603 604 605 if(restore) { 606 /* Indicate in the header that the burns are not applied. */ 607 fh_set_bool(ihu, FH_AUTO, PHU_NAME_BURN_APPLIED, 608 FH_FALSE, PHU_COMMENT_BURN_APPLIED); 609 fh_rewrite(ihu); 610 } 611 566 612 fh_destroy(ihu); 567 613 568 614 /* Write the persistence data for the next image */ 569 615 if(burnfile != NULL) persist_write(OTA, burnfile); 616 570 617 571 618 exit(EXIT_SUCCESS); … … 613 660 CELL *cell) 614 661 { 615 int i, j, k, n ;662 int i, j, k, n, nsat; 616 663 617 664 /* Get bias stats */ … … 624 671 625 672 /* Get sky stats */ 626 for(k=n= 0; k<nx*ny; k+=((617*nx)/1000)) {673 for(k=n=nsat=0; k<nx*ny; k+=((617*nx)/1000)) { 627 674 i = k % nx; 628 675 j = k / nx; 629 median_buf[n++] = data[i+NX*j]; 630 } 676 if(data[i+NX*j] > SAT4SURE) { 677 nsat++; 678 } else if(data[i+NX*j] != NODATA) { 679 median_buf[n++] = data[i+NX*j]; 680 } 681 } 682 683 if(n < 20) { /* Better have hit at least 20! */ 684 cell->sky = cell->rms = 0.0; 685 return(-1); 686 } 687 cell->satfrac = ((double)nsat) / n; 688 631 689 /* First pass at sky and quartile */ 632 690 cell->sky = int_median(n, median_buf); … … 656 714 printf(" restore={t|f} Restore the input MEF by adding input fits?\n"); 657 715 printf(" in=fname Input file for previous burn persistence streaks\n"); 716 printf(" infits=fname Input FITS file for previous burn persistence streaks (stored\n"); 717 printf(" in table extensions). If both this and the 'in' input\n"); 718 printf(" file option are specified, then 'in' takes precedence.\n"); 658 719 printf(" out=fname Output file for burn streaks\n"); 659 printf(" outimage=imname Output file for MEF image\n"); 720 660 721 // printf(" trailin=fname Input file for previous burn persistence streaks\n"); 722 // printf(" trailinfits=fname Input FITS file for previous burn persistence streaks\n"); 661 723 // printf(" trailout=fname Output file for burn streaks\n"); 724 printf(" deltables=fname Copy mef_file to new FITS file 'fname' with burn streak\n"); 725 printf(" tables removed. NOTE: if specified, all other options\n"); 726 printf(" will be ignored!\n"); 662 727 printf(" psf=fname Output file for PSF FITS stamp gallery\n"); 663 728 printf(" psfstat=fname Output file for PSF statistics listing\n"); … … 676 741 printf(" rmask=X Diameter growth factor of burned spots\n"); 677 742 printf(" bmask=X Box size growth of burn/star boxes\n"); 743 printf(" expire=N Retire a blasted burn after N seconds\n"); 678 744 printf(" quiet={t|f} Quiet?\n"); 679 745 printf(" verbose=N Set verbosity bits:\n"); -
trunk/extsrc/gpcsw/gpcsrc/fits/burntool/burntool.h
r23490 r23924 1 #ifndef _INCLUDED_burntool_ 2 #define _INCLUDED_burntool_ 3 1 4 /* Burn correction routines: 2 5 ------------------------- … … 63 66 64 67 #define MAXCELL 64 /* Max cells in an OTA */ 65 #define MAXSIZE 700/* Maximum vertical cell size */68 #define MAXSIZE 2048 /* Maximum vertical cell size */ 66 69 67 70 #define STAR_RADIUS 4 /* Radius over which a star ctr must be max */ … … 87 90 #define BURN_PWR 1 /* Power law */ 88 91 #define BURN_EXP 2 /* Exponential */ 89 #define PSF_STAR 3 /* Unfitted: good psf star */ 92 #define BURN_BLASTED 3 /* Blasted top to bottom: flag only for IPP */ 93 #define PSF_STAR 9 /* Unfitted: good psf star */ 90 94 91 95 /* Fit error codes */ … … 93 97 #define FIT_TOP_ERROR 2 /* Saturation extends to top: no points */ 94 98 #define FIT_SLOPE_ERROR 3 /* Unreasonable fit */ 99 #define FIT_EXPIRED 9 /* Don't carry any more as persistent */ 95 100 96 101 /* Fit parameters */ … … 152 157 int rms; /* RMS in the sky */ 153 158 int time; /* PON time of this cell */ 159 double satfrac; /* Fraction of SAT4SURE saturated pixels */ 154 160 int nburn; /* Number of trails left by sat stars */ 155 161 OBJBOX *burn; /* Stars which we think left a trail */ … … 212 218 int write_2ddata(int nx, int ny, int *ntot, IMTYPE *data, int fd); 213 219 int write_3dend(int *ntot, int fd); 220 221 #endif /* _INCLUDED_burntool_ */ -
trunk/extsrc/gpcsw/gpcsrc/fits/burntool/man/burntool.1
r23490 r23924 53 53 power laws; downward burns as exponentials. 54 54 55 Burntool also identifies really blasted areas which are saturated from 56 top to bottom. These cannot be fitted, but are carried along for 57 EXPIRE_TRAIL_TIME seconds (default 2000) in the persistence list. The 58 idea is to give IPP a clue that something bad happened, and of course 59 the persistence info tells when it happened. This expiration time 60 for carrying the region can be set with "expire=N". 61 55 62 Burntool finishes by rewriting the modified MEF and all of the fits in 56 63 an output file ("out=file_name"). If desired, burntool can be run … … 112 119 npsf=3 Number of contributing PSF stars 113 120 fwhm=5.38 PSF FWHM [pix] (0.0 if fit fails) 114 m2=11.08 Second moment of distribution [pix^2] 115 qp=5.154 Plus quadrupole qxx-qyy [pix^2] 116 qc=0.560 Cross quadrupole 2*qxy [pix^2] 117 qt=-5.201 Tangential quadrupole [pix^2] 121 fmed=5.76 FWHM averaged over psfavg (0.0 if fit fails) 122 m2=11.08 Second moment of distribution [pix^2] (-99.99 if fails) 123 qp=5.154 Plus quadrupole qxx-qyy [pix^2] (-99.99 if fails) 124 qc=0.560 Cross quadrupole 2*qxy [pix^2] (-99.99 if fails) 125 qt=-5.201 Tangential quadrupole [pix^2] (-99.99 if fails) 118 126 q+ * cos(2*phi) + qx * sin(2*phi) 127 qpm=5.154 Plus quadrupole averaged over psfavg 128 qcm=0.560 Cross quadrupole averaged over psfavg 129 qtm=-5.201 Tangential averaged over psfavg 119 130 120 131 Helpful utilities include: … … 148 159 Input file for previous burn persistence streaks 149 160 161 infits=fname 162 Input FITS file for previous burn persistence streaks 163 (burn streaks stored in table extensions). If both 164 this and the 'in' input file option are specified, then 165 'in' takes precedence. 166 150 167 out=fname 151 168 Output file for burn streaks 169 170 deltables=fname 171 Copy mef_file to new FITS file 'fname' with burn streak 172 tables removed. NOTE: if specified, all other options 173 will be ignored! 152 174 153 175 psf=fname … … 199 221 bmask=X 200 222 Box size growth of burn/star (BMASK_GROW) 223 224 expire=N 225 Retire a blasted burn after N seconds 201 226 202 227 quiet={t|f} -
trunk/extsrc/gpcsw/gpcsrc/fits/burntool/persistfix.c
r23490 r23924 27 27 /* Fix up all the persistence streaks */ 28 28 for(k=0; k<cell->npersist; k++) { 29 30 /* Is this just a blasted area being carried for IPP? */ 31 if((cell->persist)[k].func == BURN_BLASTED) { 32 if(cell->time - (cell->persist)[k].time > EXPIRE_TRAIL_TIME) { 33 (cell->persist)[k].fiterr = FIT_EXPIRED; 34 } 35 continue; 36 } 29 37 30 38 /* Fit the trail */ -
trunk/extsrc/gpcsw/gpcsrc/fits/burntool/persistio.c
r23490 r23924 233 233 fprintf(fp, "# Cell: %d sky= %d rms= %d bias= %d\n", 234 234 cell[0].cell, cell[0].sky, cell[0].rms, cell[0].bias); 235 fprintf(fp, "#Cell time cx cy max sx sy ex ey y0m y0p y1m y1p x0m x0p x1m x1p slope zero\n");235 fprintf(fp, "#Cell time cx cy max y0 sx sy ex ey y0m y0p y1m y1p x0m x0p x1m x1p F up slope nfit sxf exf\n"); 236 236 237 237 for(j=0; j<MAXCELL; j++) { -
trunk/extsrc/gpcsw/gpcsrc/fits/burntool/psfstats.c
r23525 r23924 1 /* psfstats.c - calculate some statistics about a PSF*/1 /* dummy version of psfstats.c - disable use of the psf */ 2 2 #include <stdio.h> 3 3 #include <stdlib.h> … … 12 12 #include "psf/psf.h" 13 13 14 //#define PSFSTATS /* ignore psf stats so we can skip fortan */15 //#define TEST /* Dump all the PSF info? */16 17 static unsigned short int *psfbuf=NULL;18 static int npsfbuf=0;19 #define PHONYSKY 100020 21 14 /****************************************************************/ 22 15 /* psf_stats(): Tell us about this PSF star */ … … 24 17 double *fwhm, double *q) 25 18 { 26 27 #ifdef PSFSTATS 28 29 int i, j, r, r2, err, i0, j0; 30 double d, qxx, qxy, qyy, mx, my, sum; 31 PSF_PARAM psfout; /* Results of fit */ 32 PSF_EXTRA psfextra; /* Extra results from fit */ 33 double pi=4*atan(1.0); 34 35 if(nx*ny > npsfbuf) { 36 if(psfbuf != NULL) free(psfbuf); 37 psfbuf = (ushort *)calloc(nx*ny, sizeof(ushort)); 38 npsfbuf = nx*ny; 39 } 40 for(i=0; i<nx*ny; i++) { 41 j = ((int)data[i]) - bias + PHONYSKY; 42 if(j >= 0 && j < 65535) psfbuf[i] = j; 43 else psfbuf[i] = 0; 44 } 45 46 /* 2D PSF fit */ 47 err = psf(nx, ny, psfbuf, PSF_2DIM, NULL, &psfout, &psfextra); 48 49 #ifdef TEST 50 printf("err = %d\n", err); 51 #endif 52 53 if(!err) { 54 #ifdef TEST 55 printf("err = %d\n", err); 56 printf("bias = %d\n", bias); 57 printf("ix, iy = %d %d\n", psfout.ix, psfout.iy); 58 printf("x0, y0 = %.2f %.2f\n", psfout.x0, psfout.y0); 59 printf("fwhm = %.2f\n", psfout.fwhm); 60 printf("peak, bckgnd = %.1f %.1f\n", psfout.peak, psfout.bkgnd); 61 printf("flux, S/N = %.1f %.2f\n", psfout.flux, psfout.sn); 62 printf("weight = %.2f\n", psfout.weight); 63 printf("FWmaj, FWmin = %.2f %.2f\n", psfextra.majfw, psfextra.minfw); 64 printf("theta = %.1f\n", psfextra.thfw*180/pi); 65 printf("wpeak, wbkgnd = %.1f %.1f\n", psfextra.wpeak, psfextra.wbkgnd); 66 printf("dflux, dbckgnd = %.1f %.1f\n", psfextra.dflux, psfextra.dbkgnd); 67 printf("rmsbkgnd = %.1f\n", psfextra.rmsbkgnd); 68 #endif 69 fwhm[0] = psfextra.majfw; 70 fwhm[1] = psfextra.minfw; 71 fwhm[2] = psfextra.thfw; 72 73 /* Moments */ 74 i0 = MIN(psfout.ix, nx-psfout.ix); 75 j0 = MIN(psfout.iy, ny-psfout.iy); 76 } else { 77 fwhm[0] = fwhm[1] = fwhm[2] = 0.0; 78 i0 = nx/2; 79 j0 = ny/2; 80 } 81 82 r = MIN(i0, j0) - 1; 83 sum = mx = my = qxx = qxy = qyy = 0.0; 84 for(j=j0-r; j<j0+r; j++) { 85 for(i=i0-r; i<i0+r; i++) { 86 r2 = (i-i0)*(i-i0) + (j-j0)*(j-j0); 87 if(r2 > r*r) continue; 88 d = (double)data[i+j*nx] - bias; 89 sum += d; 90 mx += (i+0.5) * d; 91 my += (j+0.5) * d; 92 qxx += (i+0.5) * (i+0.5) * d; 93 qxy += (i+0.5) * (j+0.5) * d; 94 qyy += (j+0.5) * (j+0.5) * d; 95 } 96 } 97 if(sum > 0) { 98 mx /= sum; 99 my /= sum; 100 qxx = qxx / sum - mx*mx; 101 qxy = qxy / sum - mx*my; 102 qyy = qyy / sum - my*my; 103 } else { 104 q[0] = q[1] = q[2] = 0.0; 105 } 106 107 q[0] = (qxx + qyy) / 2; 108 q[1] = qxx - qyy; 109 q[2] = 2 * qxy; 110 111 /* phi is the angular position of the OTA around the center [rad] */ 112 // qtang = (qxx - qyy) * cos(2*phi) + 2 * qxy * sin(2*phi); 113 114 #ifdef TEST 115 printf("Sum= %.1f mx= %.2f my= %.2f qxx= %.4f qxy= %.4f qyy= %.4f\n", 116 sum, mx, my, qxx, qxy, qyy); 117 #endif 118 119 # else 120 printf("psfstats ignored in this build\n"); 121 return (1); 122 #endif /* PSFSTATS */ 123 return(0); 19 return(1); 124 20 } -
trunk/extsrc/gpcsw/gpcsrc/fits/burntool/trailfit.c
r23490 r23924 148 148 } 149 149 150 /* Burn extends all the way to the top */ 150 151 if(up && y1 >= ny-1) { 151 152 box->slope = -1.0; 152 box->nfit = xe - xs + 1;153 153 box->fiterr = FIT_TOP_ERROR; 154 /* No fit here because the burn is to top, but the persist may be fitable */ 155 if(box->sy > FIT_EDGE) { 156 box->nfit = xe - xs + 1; 157 /* However, if burn extends to bottom, persist will not be able to fit */ 158 } else { 159 box->nfit = 1; /* Just enough to keep it alive */ 160 box->func = BURN_BLASTED; 161 } 154 162 return(0); 155 163 }
Note:
See TracChangeset
for help on using the changeset viewer.
