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
|
include <mach.h>
include "refspectra.h"
# REFNEAREST -- Assign nearest reference spectrum based on sort key.
procedure refnearest (input, refs)
pointer input # List of input spectra
pointer refs # List of reference spectra
bool ignoreaps # Ignore apertures?
int i, i1, nrefs, ap
double sortval, d, d1
pointer sp, image, gval, refimages, refaps, refvals, refgvals
bool clgetb(), streq(), refginput(), refgref()
int imtgetim(), imtlen()
begin
call smark (sp)
call salloc (image, SZ_FNAME, TY_CHAR)
# Task parameters
ignoreaps = clgetb ("ignoreaps")
# Tabulate reference spectra. This expands the reference list,
# checks the spectrum is a reference spectrum of the appropriate
# aperture.
call salloc (refimages, imtlen (refs), TY_POINTER)
call salloc (refaps, imtlen (refs), TY_INT)
call salloc (refvals, imtlen (refs), TY_DOUBLE)
call salloc (refgvals, imtlen (refs), TY_POINTER)
nrefs = 0
while (imtgetim (refs, Memc[image], SZ_FNAME) != EOF) {
call refnoextn (Memc[image])
if (!refgref (Memc[image], ap, sortval, gval))
next
for (i=0; i<nrefs; i=i+1)
if (streq (Memc[image], Memc[Memi[refimages+i]]))
break
if (i == nrefs) {
call salloc (Memi[refimages+nrefs], SZ_FNAME, TY_CHAR)
call salloc (Memi[refgvals+nrefs], SZ_FNAME, TY_CHAR)
call strcpy (Memc[image], Memc[Memi[refimages+i]], SZ_FNAME)
Memi[refaps+i] = ap
Memd[refvals+i] = sortval
call strcpy (Memc[gval], Memc[Memi[refgvals+i]], SZ_FNAME)
nrefs = i + 1
}
}
if (nrefs < 1)
call error (0, "No reference images specified")
# Assign nearest reference spectra to each input spectrum.
# Skip input spectra which are not of the appropriate aperture
while (imtgetim (input, Memc[image], SZ_FNAME) != EOF) {
call refnoextn (Memc[image])
if (!refginput (Memc[image], ap, sortval, gval))
next
i1 = 0
d1 = MAX_REAL
do i = 1, nrefs {
if (!streq (Memc[gval], Memc[Memi[refgvals+i-1]]))
next
if (!ignoreaps && ap != Memi[refaps+i-1])
next
d = abs (sortval - Memd[refvals+i-1])
if (d < d1) {
i1 = i
d1 = d
}
}
if (i1 > 0) # Assign nearest reference spectrum
call refspectra (Memc[image], Memc[Memi[refimages+i1-1]], 1.,
Memc[Memi[refimages+i1-1]], 0.)
else { # No reference spectrum found
call refprint (STDERR, NO_REFSPEC, Memc[image], "", "", "",
ap, 0, "")
do i = 1, nrefs {
if (!streq (Memc[gval], Memc[Memi[refgvals+i-1]])) {
call refprint (STDERR, REF_GROUP, Memc[image],
Memc[Memi[refimages+i-1]], Memc[gval],
Memc[Memi[refgvals+i-1]], ap, Memi[refaps+i-1], "")
next
}
if (!ignoreaps && ap != Memi[refaps+i-1])
call refprint (STDERR, REF_AP, Memc[image],
Memc[Memi[refimages+i-1]], Memc[gval],
Memc[Memi[refgvals+i-1]], ap, Memi[refaps+i-1], "")
next
}
}
}
call sfree (sp)
end
|