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
|
# RINGAVG (Nov02) proto RINGAVG (Nov02)
#
#
# NAME
# ringavg -- compute pixel averages in concentric rings about given
# center
#
#
# USAGE
# ringavg image xc yc
#
#
# PARAMETERS
#
# image
# Image to be used.
#
# xc, yc
# Pixel coordinate for center of rings.
#
# r1 = 0, r2 = 10, dr = 1
# Rings to be measured. R1 is the inner radius of the first ring,
# R2 is the outer radius of the last bin, and DR is the widths of
# the rings. The values are in units of pixels.
#
# labels = yes
# Print column labels for the output?
#
# vebar = no
# If VEBAR is yes then the standard deviation and standard error
# will be printed as negative values for use with GRAPH.
#
#
# DESCRIPTION
# Pixels are binned into a series of concentric rings centered on a
# given position in the input image. The rings are defined by an
# inner radius for the first ring, an outer radius for the last ring,
# and the width of the rings. The statistics of the pixel values in
# each ring are then computed and list to the standard output. The
# output lines consist of the inner and outer ring radii, the number
# of pixels, the average value, the standard deviation of the value
# (corrected for population size), and the standard error. The
# parameter LABEL selects whether to include column labels.
#
# If the ring average are to be plotted with the task GRAPH using the
# option to plot error bars based on the standard deviation or
# standard error then the VEBAR parameter may be set to write the
# values as negative values are required by that task.
#
# This task is a script and so users may copy it and modify it as
# desired. Because it is a script it will be very slow if r2 becomes
# large.
#
#
# EXAMPLES
# 1. Compute the ring averages with labels and output to the terminal.
#
# cl> ringavg pwimage 17 17
# # R min R max Npix Average Std Dev Std Err
# 0.00 1.00 5 7.336 9.16 4.096
# 1.00 2.00 8 0.2416 0.2219 0.07844
# 2.00 3.00 16 0.3994 0.5327 0.1332
# 3.00 4.00 20 0.06211 0.05491 0.01228
# 4.00 5.00 32 0.0987 0.08469 0.01497
# 5.00 6.00 32 0.06983 0.06125 0.01083
# 6.00 7.00 36 0.0641 0.0839 0.01398
# 7.00 8.00 48 0.06731 0.05373 0.007755
# 8.00 9.00 56 0.06146 0.07601 0.01016
# 9.00 10.00 64 0.05626 0.05846 0.007308
#
# 2. Plot the ring averages with standard errors used for error bars.
#
# cl> ringavg pwimage 17 17 label- vebar+ | fields STDIN 2,4,6 |
# >>> graph point+ marker=vebar
#
# 3. Plot ring averages for galaxy in dev$pix.
#
# cl> ringavg dev$pix 256 256 r2=100 dr=5 label- | fields STDIN 2,4 |
# >>> graph logy+
#
#
#
# SEE ALSO
# pradprof, psfmeasure, radprof
#
#
# To install:
#
# Copy to your home or other personal directory. Enter the command
# "task ringavg = home$ringavg.cl" interactively, in login.cl or in
# your loginuser.cl. Substitute the host or logical path for home$
# if the script is placed in a different directory.
procedure ringavg (image, xc, yc)
file image {prompt="Input image"}
real xc {prompt="X center"}
real yc {prompt="Y center"}
real r1 = 0 {prompt="Inner radius of first bin"}
real r2 = 10 {prompt="Outer radius of last bin"}
real dr = 1 {prompt="Radial bin width"}
bool labels = yes {prompt="Print column labels?"}
bool vebars = no {prompt="Format for error bars in GRAPH?"}
struct *fd
begin
file temp
real n, r, val, ra, rb, ravg, rstddev, rmean
# Extract the pixel values sorted by radius.
temp = mktemp ("temp")
pradprof (image, xc, yc, radius=r2, center=no, list=yes) |
sort ("STDIN", column=1, ignore_white+, numeric+, reverse-, > temp)
if (label)
printf ("# %6s %8s %8s %10s %10s %10s\n", "R min", "R max", "Npix",
"Average", "Std Dev", "Std Err")
# Read through the file. Skip the first two comment lines.
fd = temp
i = fscan (fd)
i = fscan (fd)
n = 0
rb = -1
while (fscan (fd, r, val) != EOF) {
if (r < r1)
next
if (r > r2)
break
if (r > rb) {
if (n > 0) {
ravg = ravg / n
rstddev = sqrt (rstddev / n - ravg ** 2)
if (vebar)
rstddev = -rstddev
if (n > 1)
rstddev = rstddev * sqrt (n / (n - 1.))
rmean = rstddev / sqrt (n)
printf ("%8.2f %8.2f %8d %10.4g %10.4g %10.4g\n",
ra, rb, n, ravg, rstddev, rmean)
}
ravg = 0.
rstddev = 0.
n = 0
ra = int (r / dr) * dr
rb = ra + dr
}
ravg = ravg + val
rstddev = rstddev + val * val
n = n + 1
}
if (n > 0) {
ravg = ravg / n
rstddev = sqrt (rstddev / n - ravg ** 2)
if (vebar)
rstddev = -rstddev
if (n > 1)
rstddev = rstddev * sqrt (n / (n - 1.))
rmean = rstddev / sqrt (n)
printf ("%8.2f %8.2f %8d %10.4g %10.4g %10.4g\n",
ra, rb, n, ravg, rstddev, rmean)
}
fd = ""
delete (temp, verify-)
end
|