aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/apphot/wphot/apwmag.x
blob: 0818bf3ff2655d915a20daf61168e525f744a936 (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
include <mach.h>
include "../lib/apphotdef.h"
include "../lib/apphot.h"
include "../lib/noisedef.h"
include "../lib/photdef.h"
include "../lib/phot.h"

define	CONVERSION	2.772588

# AP_WMAG -- Procedure to compute the magnitudes inside a set of apertures for
# a single of object.

int procedure ap_wmag (ap, im, wx, wy, positive, skyval, skysig, nsky)

pointer	ap		# pointer to the apphot structure
pointer	im		# pointer to the IRAF image
real	wx, wy		# object coordinates
int	positive	# emission or absorption features
real	skyval		# sky value
real	skysig		# sky sigma
int	nsky		# number of sky pixels

int	c1, c2, l1, l2, ier, nap
pointer	sp, nse, phot, temp
real	datamin, datamax, zmag, wsigsq, wvarsky
int	apmagbuf()

begin
	# Initalize.
	phot = AP_PPHOT(ap)
	nse = AP_NOISE(ap)
	AP_PXCUR(phot) = wx
	AP_PYCUR(phot) = wy
        if (IS_INDEFR(wx) || IS_INDEFR(wy)) {
            AP_OPXCUR(phot) = INDEFR
            AP_OPYCUR(phot) = INDEFR
        } else {
            switch (AP_WCSOUT(ap)) {
            case WCS_WORLD, WCS_PHYSICAL:
                call ap_ltoo (ap, wx, wy, AP_OPXCUR(phot), AP_OPYCUR(phot), 1)
            case WCS_TV:
                call ap_ltov (im, wx, wy, AP_OPXCUR(phot), AP_OPYCUR(phot), 1)
            default:
                AP_OPXCUR(phot) = wx
                AP_OPYCUR(phot) = wy
            }
        }
	call amovkd (0.0d0, Memd[AP_SUMS(phot)], AP_NAPERTS(phot))
	call amovkd (0.0d0, Memd[AP_AREA(phot)], AP_NAPERTS(phot))
	call amovkr (INDEFR, Memr[AP_MAGS(phot)], AP_NAPERTS(phot))
	call amovkr (INDEFR, Memr[AP_MAGERRS(phot)], AP_NAPERTS(phot))

	# Make sure the center is defined.
	if (IS_INDEFR(wx) || IS_INDEFR(wy))
	    return (AP_APERT_NOAPERT)

	# Fetch the aperture pixels.
	ier = apmagbuf (ap, im, wx, wy, c1, c2, l1, l2)
	if (ier == AP_APERT_NOAPERT)
	    return (AP_APERT_NOAPERT)

	call smark (sp)
	call salloc (temp, AP_NAPERTS(phot), TY_REAL)

	# Compute the min and max.
	if (IS_INDEFR(AP_DATAMIN(ap)))
	    datamin = -MAX_REAL
	else
	    datamin = AP_DATAMIN(ap)
	if (IS_INDEFR(AP_DATAMAX(ap)))
	    datamax = MAX_REAL
	else
	    datamax = AP_DATAMAX(ap)

	# Do photometry for all the apertures.
	AP_NMINAP(phot) = AP_NMAXAP(phot) + 1
	call amulkr (Memr[AP_APERTS(phot)], AP_SCALE(ap), Memr[temp],
	    AP_NAPERTS(phot))

	switch (AP_PWEIGHTS(phot)) {
	case AP_PWCONSTANT:
	    if (IS_INDEFR(AP_DATAMIN(ap)) && IS_INDEFR(AP_DATAMAX(ap)))
	        call  apmeasure (im, wx, wy, c1, c2, l1, l2, Memr[temp],
	            Memd[AP_SUMS(phot)], Memd[AP_AREA(phot)], AP_NMAXAP(phot))
	    else
	        call  apbmeasure (im, wx, wy, c1, c2, l1, l2, datamin,
		    datamax, Memr[temp], Memd[AP_SUMS(phot)],
		    Memd[AP_AREA(phot)], AP_NMAXAP(phot), AP_NMINAP(phot))
	case AP_PWCONE:
	    wsigsq = AP_FWHMPSF(ap) *  AP_SCALE(ap)
	    wvarsky = (AP_READNOISE(nse) / AP_EPADU(nse)) ** 2 
	    if (IS_INDEFR(AP_DATAMIN(ap)) && IS_INDEFR(AP_DATAMAX(ap)))
	        call  ap_tmeasure (im, wx, wy, c1, c2, l1, l2, Memr[temp],
	            Memd[AP_SUMS(phot)], Memd[AP_AREA(phot)], AP_NMAXAP(phot),
		    wsigsq, AP_EPADU(nse), wvarsky)
	    else
	        call  ap_btmeasure (im, wx, wy, c1, c2, l1, l2, datamin,
		    datamax, Memr[temp], Memd[AP_SUMS(phot)],
		    Memd[AP_AREA(phot)], AP_NMAXAP(phot), AP_NMINAP(phot),
		    wsigsq, AP_EPADU(nse), wvarsky)
	case AP_PWGAUSS:
	    wsigsq = (AP_FWHMPSF(ap) *  AP_SCALE(ap)) ** 2 / CONVERSION
	    wvarsky = (AP_READNOISE(nse) / AP_EPADU(nse)) ** 2 
	    if (IS_INDEFR(AP_DATAMIN(ap)) && IS_INDEFR(AP_DATAMAX(ap)))
	        call  ap_gmeasure (im, wx, wy, c1, c2, l1, l2, Memr[temp],
	            Memd[AP_SUMS(phot)], Memd[AP_AREA(phot)], AP_NMAXAP(phot),
		    wsigsq, AP_EPADU(nse), wvarsky)
	    else
	        call  ap_bgmeasure (im, wx, wy, c1, c2, l1, l2,
		    datamin, datamax, Memr[temp], Memd[AP_SUMS(phot)],
		    Memd[AP_AREA(phot)], AP_NMAXAP(phot), AP_NMINAP(phot),
		    wsigsq, AP_EPADU(nse), wvarsky)
	default:
	    if (IS_INDEFR(AP_DATAMIN(ap)) && IS_INDEFR(AP_DATAMAX(ap)))
	        call  apmeasure (im, wx, wy, c1, c2, l1, l2, Memr[temp],
	            Memd[AP_SUMS(phot)], Memd[AP_AREA(phot)], AP_NMAXAP(phot))
	    else
	        call  apbmeasure (im, wx, wy, c1, c2, l1, l2, datamin,
		    datamax, Memr[temp], Memd[AP_SUMS(phot)],
		    Memd[AP_AREA(phot)], AP_NMAXAP(phot), AP_NMINAP(phot))
	}

	# Make sure that the sky value has been defined.
	if (IS_INDEFR(skyval))
	    ier = AP_APERT_NOSKYMODE

	else {

	    # Check for bad pixels.
	    if ((ier == AP_OK) && (AP_NMINAP(phot) <= AP_NMAXAP(phot)))
		ier = AP_APERT_BADDATA

	    nap = min (AP_NMINAP(phot) - 1, AP_NMAXAP(phot))

	    # Compute the magnitudes and errors.
	    if (positive == YES)
	        call apcopmags (Memd[AP_SUMS(phot)], Memd[AP_AREA(phot)],
	            Memr[AP_MAGS(phot)], Memr[AP_MAGERRS(phot)], nap, skyval,
		    skysig, nsky, AP_ZMAG(phot), AP_NOISEFUNCTION(nse),
		    AP_EPADU(nse))
	    else
	        call apconmags (Memd[AP_SUMS(phot)], Memd[AP_AREA(phot)],
	            Memr[AP_MAGS(phot)], Memr[AP_MAGERRS(phot)], nap, skyval,
		    skysig, nsky, AP_ZMAG(phot), AP_NOISEFUNCTION(nse),
		    AP_EPADU(nse), AP_READNOISE(nse))

	    # Compute correction for itime.
	    zmag = 2.5 * log10 (AP_ITIME(ap))
	    call aaddkr (Memr[AP_MAGS(phot)], zmag, Memr[AP_MAGS(phot)], nap)
	}

	call sfree (sp)
	if (ier != AP_OK)
	    return (ier)
	else
	    return (AP_OK)
end