diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /noao/imred/ccdred/src/t_mkillumft.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'noao/imred/ccdred/src/t_mkillumft.x')
-rw-r--r-- | noao/imred/ccdred/src/t_mkillumft.x | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/noao/imred/ccdred/src/t_mkillumft.x b/noao/imred/ccdred/src/t_mkillumft.x new file mode 100644 index 00000000..ecb66a8e --- /dev/null +++ b/noao/imred/ccdred/src/t_mkillumft.x @@ -0,0 +1,229 @@ +include <imhdr.h> +include "ccdred.h" + + +# T_MKILLUMFLAT -- Make illumination corrected flat field images. +# +# The input flat field images are processed and smoothed to obtain +# illumination pattern. The illumination pattern is then divided out +# of the input image to make the output illumination corrected flat field +# image. + +procedure t_mkillumflat() + +int listin # List of input CCD images +int listout # List of output CCD images +int ccdtype # CCD image type +int interactive # Fit overscan interactively? + +bool clgetb(), streq() +int imtopenp(), imtgetim() +pointer sp, input, output, tmp, str, in, out, ccd +errchk set_input, set_output, ccddelete + +begin + call smark (sp) + call salloc (input, SZ_FNAME, TY_CHAR) + call salloc (output, SZ_FNAME, TY_CHAR) + call salloc (tmp, SZ_FNAME, TY_CHAR) + call salloc (str, SZ_LINE, TY_CHAR) + + # Get the lists and instrument translation file. Open the translation + # file. Initialize the interactive flag and the calibration images. + + listin = imtopenp ("input") + listout = imtopenp ("mkillumflat.output") + call clgstr ("instrument", Memc[input], SZ_FNAME) + call hdmopen (Memc[input]) + call set_interactive ("", interactive) + call cal_open (NULL) + call ccd_open (0) + + # Process each image. + while (imtgetim (listin, Memc[input], SZ_FNAME) != EOF) { + if (clgetb ("noproc")) { + call printf ("%s: mkillumflat\n") + call pargstr (Memc[input]) + } + + # Set input and output images. Use temporary image if needed. + call set_input (Memc[input], in, ccdtype) + if (in == NULL) + next + + if (imtgetim (listout, Memc[output], SZ_FNAME) == EOF) + call strcpy (Memc[input], Memc[output], SZ_FNAME) + if (Memc[output] == EOS) + call strcpy (Memc[input], Memc[output], SZ_FNAME) + if (streq (Memc[input], Memc[output])) + call mktemp ("tmp", Memc[tmp], SZ_FNAME) + else + call strcpy (Memc[output], Memc[tmp], SZ_FNAME) + call set_output (in, out, Memc[tmp]) + + # Process image as a flat field image. + call set_proc (in, out, ccd) + call set_sections (ccd) + call set_trim (ccd) + call set_fixpix (ccd) + call set_overscan (ccd) + call set_zero (ccd) + call set_dark (ccd) + + # Do the processing. + if (CORS(ccd) == YES) { + call doproc (ccd) + call set_header (ccd) + + # Finish up + call imunmap (in) + call imunmap (out) + if (streq (Memc[input], Memc[output])) { + call ccddelete (Memc[input]) + call imrename (Memc[tmp], Memc[input]) + } else + call strcpy (Memc[output], Memc[input], SZ_FNAME) + } else { + # Delete the temporary output image. Make a copy if needed. + call imunmap (in) + call imunmap (out) + call imdelete (Memc[tmp]) + } + call free_proc (ccd) + + # Do special processing. + call mkillumflat (Memc[input], Memc[output]) + if (!streq (Memc[input], Memc[output])) + call ccdcopy (Memc[input], Memc[output]) + } + + # Finish up. + call hdmclose () + call imtclose (listin) + call imtclose (listout) + call cal_close () + call ccd_close () + call sfree (sp) +end + + +# MKILLUMFLAT -- Take the processed input image and make the illumination +# corrected flat field output image. The illumination pattern is created +# as a temporary image and then the applied to the input flat field +# image to make the final output flat field image. If the input and +# output names are the same the operation is done in place. + +procedure mkillumflat (input, output) + +char input[SZ_FNAME] # Input image +char output[SZ_FNAME] # Output image + +int i, nc, nl +real scale +long time +pointer sp, str, illum, tmp, in, im, out, out1, data + +bool clgetb(), ccdflag(), streq() +int hdmgeti() +real hdmgetr(), clgetr(), divzero() +pointer immap(), imgl2r(), impl2r() +errchk immap, ccddelete +extern divzero() + +real rdivzero # Result for divion by zero +int ndivzero # Number of zero divisions +common /cdivzero/ rdivzero, ndivzero + +begin + # Check if this operation has been done. + in = immap (input, READ_ONLY, 0) + if (ccdflag (in, "illumflt")) { + call imunmap (in) + return + } + + # Print operation if not processing. + if (clgetb ("noproc")) { + call eprintf ( + " [TO BE DONE] Remove illumination\n") + call pargstr (input) + call imunmap (in) + return + } + + # Get and set task parameters for division by zero. + rdivzero = clgetr ("divbyzero") + ndivzero = 0 + + call smark (sp) + call salloc (str, SZ_LINE, TY_CHAR) + call salloc (illum, SZ_FNAME, TY_CHAR) + call salloc (tmp, SZ_FNAME, TY_CHAR) + + # Make the illumination image. + call imunmap (in) + call strcpy (input, Memc[tmp], SZ_FNAME) + call mktemp ("tmp", Memc[illum], SZ_FNAME) + call mkillumination (Memc[tmp], Memc[illum], NO, NO) + + in = immap (input, READ_ONLY, 0) + im = immap (Memc[illum], READ_ONLY, 0) + iferr (scale = hdmgetr (im, "ccdmean")) + scale = 1. + iferr (time = hdmgeti (im, "ccdmeant")) + time = IM_MTIME(im) + if (time < IM_MTIME(im)) + scale = 1. + + # Create the temporary output. + if (streq (input, output)) { + call mktemp ("tmp", Memc[tmp], SZ_FNAME) + call set_output (in, out, Memc[tmp]) + out1 = in + } else { + call set_output (in, out, output) + out1 = out + } + + # Divide the illumination and flat field images with scaling. + nc = IM_LEN(out,1) + nl = IM_LEN(out,2) + do i = 1, nl { + data = impl2r (out, i) + call advzr (Memr[imgl2r(in,i)], Memr[imgl2r(im,i)], + Memr[data], nc, divzero) + if (scale != 1.) + call amulkr (Memr[data], scale, Memr[data], nc) + } + + # Log the operation. + if (ndivzero > 0) { + call sprintf (Memc[str], SZ_LINE, + "Warning: %d divisions by zero replaced by %g") + call pargi (ndivzero) + call pargr (rdivzero) + call ccdlog (out1, Memc[str]) + } + call sprintf (Memc[str], SZ_LINE, "Removed illumination from flat") + call sprintf (Memc[str], SZ_LINE, + "Illumination flat created from %s") + call pargstr (input) + call timelog (Memc[str], SZ_LINE) + call ccdlog (out1, Memc[str]) + call hdmpstr (out, "illumflt", Memc[str]) + call hdmpstr (out, "imagetyp", "flat") + + # Finish up + call imunmap (in) + call imunmap (im) + call imunmap (out) + call imdelete (Memc[illum]) + + # The input name is changed to the output name for further processing. + if (streq (input, output)) { + call ccddelete (input) + call imrename (Memc[tmp], input) + } else + call strcpy (output, input, SZ_FNAME) + call sfree (sp) +end |