aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/daophot/psf/dpsubpsf.x
blob: 8f15867a305f72f09f635db84e7cdcb1a49826f1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
include <mach.h>
include	<imhdr.h>
include	"../lib/daophotdef.h"
include	"../lib/psfdef.h"

# DP_SUBPSF -- Add the star at the given position to the PSF if it exists and
# passes the selection criteria.

int procedure dp_subpsf (dao, im, x, y, idnum, gd, mgd, showplots)

pointer	dao			# pointer to daophot structure
pointer	im			# pointer to image
real 	x, y			# position of proposed PSF star
int	idnum		        # id number of desired star
pointer	gd			# pointer to the graphics stream
pointer	mgd			# pointer to the metacode descriptor
bool 	showplots		# show plots?

real	tx, ty
pointer	srim
int	x1, x2, y1, y2, starnum, saturated
bool	star_ok

real	dp_statr()
pointer	dp_psubrast()
int	dp_locstar(), dp_idstar(), dp_pstati(), dp_issat()

begin
        # Convert coordinates for display.
	if (showplots)
            call dp_ltov (im, x, y, tx, ty, 1)
	else
            call dp_wout (dao, im, x, y, tx, ty, 1)

	# Check that the position of the star is within the image.
	if (idnum == 0 && (x < 1.0 || x > real (IM_LEN(im,1)) || y < 1.0 || y >
	    real (IM_LEN(im,2)))) {
	    if (DP_VERBOSE(dao) == YES) {
	        call printf ("Star at %g,%g is outside the image\n")
	            call pargr (tx)
	            call pargr (ty)
	    }
	    return (ERR)
	}

	# Find the star in the aperture photometry list
	if (idnum == 0)
	    starnum = dp_locstar (dao, im, x, y)
	else
	    starnum = dp_idstar (dao, im, idnum)
	if (starnum == 0) {
	    if (DP_VERBOSE(dao) == YES) {
		if (idnum > 0) {
	            call printf ("Star %d not found in the photometry file\n")
		        call pargi (idnum)
		} else {
	            call printf (
		        "Star at %g,%g  not found in the photometry file\n")
		        call pargr (tx)
		        call pargr (ty)
		}
	    }
	    return (ERR)
	} else if (starnum < 0 || starnum > dp_pstati (dao, PNUM)) {
	    if (DP_VERBOSE(dao) == YES) {
	        call printf ("Star %d not found in the PSF star list\n") 
		    call pargi (dp_pstati (dao, CUR_PSFID))
	    }
	    return (ERR)
	}

	# Check to see if the star is saturated.
	if (dp_issat (dao, starnum) == YES) {
	    if (DP_VERBOSE(dao) == YES) {
	        call printf ("Star %d is saturated\n")
		    call pargi (dp_pstati (dao, CUR_PSFID))
	    }
	    return (ERR)
	}

	# Get the data subraster, check for saturation and bad pixels,
	# and compute the  min and max data values inside the subraster.
 	srim = dp_psubrast (dao, im, -MAX_REAL, MAX_REAL, x1, x2, y1, y2,
	    saturated)
	if (srim == NULL) {
	    if (DP_VERBOSE(dao) == YES) {
	        call printf ("Star %d error reading data subraster\n")
		    call pargi (dp_pstati (dao, CUR_PSFID))
	    }
	    return (ERR)
	}

	# Now let us do the subtraction.
	call dp_spstar (dao, Memr[srim], (x2 - x1 + 1), (y2 - y1 + 1),
	    x1, y1, starnum, dp_statr (dao, PSFRAD) ** 2)

	# Now let's look at the extracted subraster.
	if (showplots) {
	    call dp_showpsf (dao, im, Memr[srim], (x2 - x1 + 1), (y2 - y1 + 1),
	        x1, y1, gd, star_ok)
	} else
	    star_ok = true

	if (star_ok) {
	    if (mgd != NULL)
	        call dp_plotpsf (dao, im, Memr[srim], (x2 - x1 + 1),
		    (y2 - y1 + 1), x1, y1, mgd)
	    if (DP_VERBOSE(dao) == YES) {
	        call printf ("PSF star %d saved by user\n")
		    call pargi (dp_pstati (dao, CUR_PSFID))
	    }
	    call mfree (srim, TY_REAL)
	    return (ERR)
	}

	# Delete the star from the list by moving it to the position
	# currently occupied by PNUM and moving everything else up.
	call dp_pfreorder (dao, dp_pstati (dao, CUR_PSF),
	    dp_pstati (dao, PNUM))

	# Decrement the list of psf stars.
	call dp_pseti (dao, PNUM, dp_pstati (dao, PNUM) - 1)

	# Print message.
	if (DP_VERBOSE(dao) == YES) {
	    call printf ("Star %d has been deleted from the PSF star list\n")
	        call pargi (dp_pstati (dao, CUR_PSFID))
	}

	call mfree (srim, TY_REAL)
	return (OK)
end


# DP_SPSTAR -- Subtract the fitted star from the data subraster.

procedure dp_spstar (dao, data, nx, ny, x1, y1, starno, psfradsq)

pointer	dao			# pointer to the daophot structure
real	data[nx,ARB]		# the data subraster
int	nx, ny			# the dimensions of the data subraster
int	x1, y1			# the coordinates of the ll pixel
int	starno			# the index of the star in question
real	psfradsq		# the psf radius squared

int	i, j
pointer	psf, psffit
real	xstar, ystar, scale, deltax, deltay, dx, dy, dysq, rsq, svdx, svdy
real	dp_usepsf()

begin
	# Define some daophot pointers
	psf = DP_PSF(dao)
	psffit = DP_PSFFIT(dao)

	# Get the star position and scale factor.
	xstar = Memr[DP_PXCEN(psf)+starno-1]
	ystar = Memr[DP_PYCEN(psf)+starno-1]
	deltax = (xstar - 1.0) / DP_PSFX(psffit) - 1.0
	deltay = (ystar - 1.0) / DP_PSFY(psffit) - 1.0
	xstar = xstar - x1 + 1
	ystar = ystar - y1 + 1
	scale = Memr[DP_PH(psf)+starno-1] / Memr[DP_PH(psf)] 

	do j = 1, ny {
	    dy = real (j) - ystar
	    dysq = dy ** 2
	    do i = 1, nx {
		dx = real (i) - xstar
		rsq = dx ** 2 + dysq
		if (rsq >= psfradsq)
		    next
		data[i,j] = data[i,j] - scale *
		    dp_usepsf (DP_PSFUNCTION(psffit), dx, dy,
		    DP_PSFHEIGHT(psffit), Memr[DP_PSFPARS(psffit)],
		    Memr[DP_POLDLUT(psf)], DP_PSFSIZE(psffit),
		    DP_NVLTABLE(psffit), DP_NFEXTABLE(psffit),
		    deltax, deltay, svdx, svdy)
	    }
	}

	call alimr (data, nx * ny, DP_CUR_PSFMIN(psf), DP_CUR_PSFMAX(psf)) 
end