aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/daophot/allstar/dpcache.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/digiphot/daophot/allstar/dpcache.x')
-rw-r--r--noao/digiphot/daophot/allstar/dpcache.x244
1 files changed, 244 insertions, 0 deletions
diff --git a/noao/digiphot/daophot/allstar/dpcache.x b/noao/digiphot/daophot/allstar/dpcache.x
new file mode 100644
index 00000000..0782b98f
--- /dev/null
+++ b/noao/digiphot/daophot/allstar/dpcache.x
@@ -0,0 +1,244 @@
+include <imhdr.h>
+include <mach.h>
+include "../lib/allstardef.h"
+include "../lib/daophotdef.h"
+
+define FUDGE 1.2 # fudge factor for memory allocation
+
+# DP_CACHE -- Determine whether it is possible to store all the data
+# in memory or not.
+
+procedure dp_cache (dao, im, subim, cache)
+
+pointer dao # pointer to the daophot structure
+pointer im # pointer to the input image
+pointer subim # pointer to the output subtracted image
+int cache # cache the data ?
+
+int npix, req_mem1, req_mem2, req_mem3, old_mem, max_mem
+pointer sp, temp, allstar, data, weights, subt
+int sizeof(), begmem()
+pointer immap()
+errchk begmem(), calloc()
+
+begin
+ # Allocate some working memory.
+ call smark (sp)
+ call salloc (temp, SZ_FNAME, TY_CHAR)
+
+ # Define the allstar pointer.
+ allstar = DP_ALLSTAR(dao)
+
+ # Store the old working set size.
+ DP_SZOLDCACHE(allstar) = begmem (0, old_mem, max_mem)
+
+ # Figure out the memory requirements.
+ npix = IM_LEN(im,1) * IM_LEN(im,2)
+ req_mem1 = FUDGE * npix * sizeof (TY_REAL)
+ req_mem2 = req_mem1 + req_mem1
+ req_mem3 = req_mem2 + req_mem1
+
+ # Initialize.
+ DP_CACHE (allstar,A_DCOPY) = NO
+ DP_CACHE (allstar,A_SUBT) = NO
+ DP_CACHE (allstar,A_WEIGHT) = NO
+
+ DP_DBUF(allstar) = NULL
+ DP_SBUF(allstar) = NULL
+ DP_WBUF(allstar) = NULL
+
+ # Use IRAF images as temporary storage space.
+ if (cache == NO) {
+
+ # The output subtracted image.
+ DP_DATA (allstar) = subim
+
+ # The scratch image.
+ call mktemp ("subt", Memc[temp], SZ_FNAME)
+ DP_SUBT (allstar) = immap (Memc[temp], NEW_COPY, im)
+ IM_NDIM(DP_SUBT(allstar)) = 2
+ IM_PIXTYPE(DP_SUBT(allstar)) = TY_REAL
+
+ # The weights image.
+ call mktemp ("wt", Memc[temp], SZ_FNAME)
+ DP_WEIGHTS (allstar) = immap (Memc[temp], NEW_COPY, im)
+ IM_NDIM(DP_WEIGHTS(allstar)) = 2
+ IM_PIXTYPE(DP_WEIGHTS(allstar)) = TY_REAL
+
+ # Set the type of caching to be used.
+ DP_ISCACHE(allstar) = NO
+ DP_ALLCACHE(allstar) = NO
+
+ } else {
+
+ # Is the memory available.
+ if (old_mem >= req_mem3) {
+ DP_CACHE(allstar,A_DCOPY) = YES
+ DP_CACHE(allstar,A_WEIGHT) = YES
+ DP_CACHE (allstar,A_SUBT) = YES
+ } else {
+ if (begmem (req_mem1, old_mem, max_mem) >= req_mem1)
+ DP_CACHE(allstar,A_SUBT) = YES
+ if (begmem (req_mem2, old_mem, max_mem) >= req_mem2)
+ DP_CACHE(allstar,A_WEIGHT) = YES
+ if (begmem (req_mem3, old_mem, max_mem) >= req_mem3)
+ DP_CACHE(allstar,A_DCOPY) = YES
+ }
+
+ # Allocate space for the scratch image.
+ subt = NULL
+ if (DP_CACHE(allstar, A_SUBT) == YES) {
+ iferr {
+ call calloc (subt, npix, TY_REAL)
+ } then {
+ if (subt != NULL)
+ call mfree (subt, TY_REAL)
+ call mktemp ("subt", Memc[temp], SZ_FNAME)
+ subt = immap (Memc[temp], NEW_COPY, im)
+ IM_NDIM(subt) = 2
+ IM_PIXTYPE(subt) = TY_REAL
+ DP_SUBT(allstar) = subt
+ DP_CACHE(allstar,A_SUBT) = NO
+ } else
+ DP_SUBT(allstar) = subt
+ } else {
+ call mktemp ("subt", Memc[temp], SZ_FNAME)
+ subt = immap (Memc[temp], NEW_COPY, im)
+ IM_NDIM(subt) = 2
+ IM_PIXTYPE(subt) = TY_REAL
+ DP_SUBT(allstar) = subt
+ }
+
+ # Allocate space for the weights image.
+ weights = NULL
+ if (DP_CACHE(allstar, A_WEIGHT) == YES) {
+ iferr {
+ call calloc (weights, npix, TY_REAL)
+ } then {
+ if (weights != NULL)
+ call mfree (weights, TY_REAL)
+ call mktemp ("wt", Memc[temp], SZ_FNAME)
+ weights = immap (Memc[temp], NEW_COPY, im)
+ IM_NDIM(weights) = 2
+ IM_PIXTYPE(weights) = TY_REAL
+ DP_WEIGHTS(allstar) = weights
+ DP_CACHE(allstar,A_WEIGHT) = NO
+ } else
+ DP_WEIGHTS(allstar) = weights
+ } else {
+ call mktemp ("wt", Memc[temp], SZ_FNAME)
+ weights = immap (Memc[temp], NEW_COPY, im)
+ IM_NDIM(weights) = 2
+ IM_PIXTYPE(weights) = TY_REAL
+ DP_WEIGHTS(allstar) = weights
+ }
+
+ # Allocate space for the output subtracted image.
+ data = NULL
+ if (DP_CACHE(allstar, A_DCOPY) == YES) {
+ iferr {
+ call calloc (data, npix, TY_REAL)
+ } then {
+ if (data != NULL)
+ call mfree (data, TY_REAL)
+ DP_DATA(allstar) = subim
+ DP_CACHE(allstar,A_DCOPY) = NO
+ } else {
+ DP_DATA(allstar) = data
+ }
+ } else
+ DP_DATA(allstar) = subim
+
+ # Set the type of caching to be used.
+ if (DP_CACHE(allstar,A_DCOPY) == NO && DP_CACHE(allstar,A_SUBT) ==
+ NO && DP_CACHE(allstar,A_WEIGHT) == NO) {
+ DP_ISCACHE(allstar) = NO
+ DP_ALLCACHE(allstar) = NO
+ } else if (DP_CACHE(allstar,A_DCOPY) == YES && DP_CACHE(allstar,
+ A_SUBT) == YES && DP_CACHE(allstar,A_WEIGHT) == YES) {
+ DP_ISCACHE(allstar) = YES
+ DP_ALLCACHE(allstar) = YES
+ } else {
+ DP_ISCACHE(allstar) = YES
+ DP_ALLCACHE(allstar) = NO
+ }
+
+ }
+
+ call sfree (sp)
+end
+
+
+# DP_UNCACHE -- Release all the stored memory.
+
+procedure dp_uncache (dao, subim, savesub)
+
+pointer dao # pointer to the daophot strucuture
+pointer subim # pointer to the output subtracted image
+int savesub # save the subtracted image ?
+
+int j, ncol, nline
+pointer sp, imname, v, data, buf, allstar
+pointer impnlr()
+
+begin
+ # Allocate working space.
+ call smark (sp)
+ call salloc (imname, SZ_FNAME, TY_CHAR)
+ call salloc (v, IM_MAXDIM, TY_LONG)
+
+ # Define the allstar pointer.
+ allstar = DP_ALLSTAR(dao)
+
+ ncol = IM_LEN(subim,1)
+ nline = IM_LEN(subim,2)
+
+ # Write out the subtracted image.
+ if (DP_CACHE(allstar,A_DCOPY) == YES && savesub == YES) {
+ data = DP_DBUF(allstar)
+ call amovkl (long(1), Meml[v], IM_MAXDIM)
+ do j = 1, nline {
+ if (impnlr (subim, buf, Meml[v]) != EOF)
+ call amovr (Memr[data], Memr[buf], ncol)
+ data = data + ncol
+ }
+ }
+ DP_DATA(allstar) = NULL
+
+ # Release any memory used by the subtracted image.
+ if (DP_DBUF(allstar) != NULL)
+ call mfree (DP_DBUF(allstar), TY_REAL)
+ DP_DBUF(allstar) = NULL
+
+ # Delete the scratch image if any.
+ if (DP_CACHE(allstar,A_SUBT) == NO) {
+ call strcpy (IM_HDRFILE(DP_SUBT(allstar)), Memc[imname], SZ_FNAME)
+ call imunmap (DP_SUBT(allstar))
+ call imdelete (Memc[imname])
+ }
+ DP_SUBT(allstar) = NULL
+
+ # Release any memory used by the scratch image.
+ if (DP_SBUF(allstar) != NULL)
+ call mfree (DP_SBUF(allstar), TY_REAL)
+ DP_SBUF(allstar) = NULL
+
+ # Delete the weights image if any.
+ if (DP_CACHE(allstar,A_WEIGHT) == NO) {
+ call strcpy (IM_HDRFILE(DP_WEIGHTS(allstar)), Memc[imname],
+ SZ_FNAME)
+ call imunmap (DP_WEIGHTS(allstar))
+ call imdelete (Memc[imname])
+ }
+ DP_WEIGHTS(allstar) = NULL
+
+ # Release any memory used by the weights buffer.
+ if (DP_WBUF(allstar) != NULL)
+ call mfree (DP_WBUF(allstar), TY_REAL)
+ DP_WBUF(allstar) = NULL
+
+ # Reset the working set size to the previous value.
+ call fixmem (DP_SZOLDCACHE(allstar))
+
+ call sfree (sp)
+end