aboutsummaryrefslogtreecommitdiff
path: root/noao/nproto/ace/grow.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /noao/nproto/ace/grow.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'noao/nproto/ace/grow.x')
-rw-r--r--noao/nproto/ace/grow.x959
1 files changed, 959 insertions, 0 deletions
diff --git a/noao/nproto/ace/grow.x b/noao/nproto/ace/grow.x
new file mode 100644
index 00000000..a9c84cd2
--- /dev/null
+++ b/noao/nproto/ace/grow.x
@@ -0,0 +1,959 @@
+include <pmset.h>
+include "ace.h"
+include "cat.h"
+include "objs.h"
+include "grow.h"
+
+
+procedure grow (grw, cat, objmask, logfd)
+
+pointer grw #I Grow parameter structure
+pointer cat #I Catalog of objects
+pointer objmask #I Object mask
+int logfd #I Logfile
+
+int ngrow #I Number of pixels to grow
+real agrow #I Area factor grow
+
+int i, j, nc, nl, m, n
+pointer sp, v, bufs, obuf
+pointer buf1, buf2, buf3, obj
+
+int grow1(), grow2(), grow3(), andi(), ori(), noti()
+pointer cathead(), catnext()
+
+begin
+ call grw_pars ("open", "", grw)
+ ngrow = GRW_NGROW(grw)
+ agrow = GRW_AGROW(grw)
+
+ if (ngrow < 1 && agrow <= 1.)
+ return
+
+ if (logfd != NULL) {
+ call fprintf (logfd, " Grow objects: ngrow = %d, agrow = %g\n")
+ call pargi (ngrow)
+ call pargr (agrow)
+ }
+
+ call smark (sp)
+ call salloc (v, PM_MAXDIM, TY_LONG)
+
+ call pm_gsize (objmask, i, Meml[v], n)
+ nc = Meml[v]; nl = Meml[v+1]
+ Meml[v] = 1
+
+ call salloc (bufs, 3, TY_POINTER)
+ do i = 1, 3
+ call salloc (Memi[bufs+i-1], nc, TY_INT)
+ call salloc (obuf, nc, TY_INT)
+
+ for (obj=cathead(cat); obj!=NULL; obj=catnext(cat,obj)) {
+ if (GROWN(obj))
+ next
+ UNSETFLAG (obj, OBJ_EVAL)
+ OBJ_NDETECT(obj) = OBJ_NPIX(obj)
+ }
+
+ do j = 1, ngrow {
+ m = 0
+ buf2 = NULL; buf3 = NULL
+ do i = 1, nl {
+ buf1 = buf2
+ buf2 = buf3
+ buf3 = NULL
+
+ if (i != 1 && buf1 == NULL) {
+ Meml[v+1] = i - 1
+ buf1 = Memi[bufs+mod(Meml[v+1],3)]
+ call pmglpi (objmask, Meml[v], Memi[buf1], 0, nc, 0)
+ }
+ if (buf2 == NULL) {
+ Meml[v+1] = i
+ buf2 = Memi[bufs+mod(Meml[v+1],3)]
+ call pmglpi (objmask, Meml[v], Memi[buf2], 0, nc, 0)
+ }
+ if (i != nl && buf3 == NULL) {
+ Meml[v+1] = i+1
+ buf3 = Memi[bufs+mod(Meml[v+1],3)]
+ call pmglpi (objmask, Meml[v], Memi[buf3], 0, nc, 0)
+ }
+
+ if (i == 1)
+ n = grow1 (cat, i, Memi[buf2], Memi[buf3],
+ Memi[obuf], nc, nl)
+ else if (i == nl)
+ n = grow3 (cat, i, Memi[buf1], Memi[buf2],
+ Memi[obuf], nc, nl)
+ else
+ n = grow2 (cat, i, Memi[buf1], Memi[buf2], Memi[buf3],
+ Memi[obuf], nc, nl)
+
+ if (n > 0) {
+ Meml[v+1] = i
+ call pmplpi (objmask, Meml[v], Memi[obuf], 0, nc, PIX_SRC)
+ m = m + n
+ }
+ }
+
+ n = 0
+ for (obj=cathead(cat); obj!=NULL; obj=catnext(cat,obj)) {
+ if (GROWN(obj))
+ next
+ if (real (OBJ_NPIX(obj)) / OBJ_NDETECT(obj) >= agrow)
+ SETFLAG (obj, OBJ_GROW)
+ else
+ n = n + 1
+ }
+
+ if (n == 0 || m == 0)
+ break
+ }
+
+ if (n != 0) {
+ for (obj=cathead(cat); obj!=NULL; obj=catnext(cat,obj)) {
+ if (GROWN(obj))
+ next
+ SETFLAG (obj, OBJ_GROW)
+ }
+ }
+
+ call sfree (sp)
+end
+
+
+int procedure grow1 (cat, line, in2, in3, out, nc, nl)
+
+pointer cat #I Catalog
+int line #I Line
+int in2[nc] #I Current line
+int in3[nc] #I Next line
+int out[nc] #I Output line
+int nc, nl #I Dimension of image
+
+int i, j, n, id, id0, id1, num1, andi()
+bool grow
+pointer objs, obj, obj1
+
+begin
+ objs = CAT_OBJS(cat) - 1
+ obj1 = NULL
+ n = 0
+ do i = 1, nc {
+ id0 = in2[i]
+ if (id0 != 0 && MNOTSPLIT(id0)) {
+ out[i] = id0
+ next
+ }
+
+ id = 0
+ j = i - 1
+ if (i > 1) {
+ id1 = in2[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[i]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ j = i + 1
+ if (i < nc) {
+ id1 = in2[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (id == 0)
+ out[i] = in2[i]
+ else {
+ out[i] = id
+ OBJ_NPIX(obj) = OBJ_NPIX(obj) + 1
+ n = n + 1
+ }
+ }
+
+ return (n)
+end
+
+
+int procedure grow2 (cat, line, in1, in2, in3, out, nc, nl)
+
+pointer cat #I Catalog
+int line #I Line
+int in1[nc] #I Previous line
+int in2[nc] #I Current line
+int in3[nc] #I Next line
+int out[nc] #I Output line
+int nc, nl #I Dimension of image
+
+int i, j, n, id, id0, id1, num1, andi()
+bool grow
+pointer objs, obj, obj1
+
+begin
+ objs = CAT_OBJS(cat) - 1
+ obj1 = NULL
+ n = 0
+ do i = 2, nc-1 {
+ id0 = in2[i]
+ if (id0 != 0 && MNOTSPLIT(id0)) {
+ out[i] = id0
+ next
+ }
+
+ id = 0
+ j = i - 1
+ id1 = in1[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in2[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in1[i]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[i]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ j = i + 1
+ id1 = in1[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in2[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+
+ if (id == 0)
+ out[i] = in2[i]
+ else {
+ out[i] = id
+ OBJ_NPIX(obj) = OBJ_NPIX(obj) + 1
+ n = n + 1
+ }
+ }
+
+ # First pixel
+ id0 = in2[1]
+ if (id0 != 0 && MNOTSPLIT(id0))
+ out[1] = id0
+ else {
+ id = 0
+ id1 = in1[1]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[1]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in1[2]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in2[2]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[2]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+
+ if (id == 0)
+ out[1] = in2[1]
+ else {
+ out[1] = id
+ OBJ_NPIX(obj) = OBJ_NPIX(obj) + 1
+ n = n + 1
+ }
+ }
+
+ # Last pixel
+ id0 = in2[nc]
+ if (id0 != 0 && MNOTSPLIT(id0))
+ out[nc] = id0
+ else {
+ id = 0
+ j = nc - 1
+ id1 = in1[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in2[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in1[nc]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in3[nc]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+
+ if (id == 0)
+ out[nc] = in2[nc]
+ else {
+ out[nc] = id
+ OBJ_NPIX(obj) = OBJ_NPIX(obj) + 1
+ n = n + 1
+ }
+ }
+
+ return (n)
+end
+
+
+int procedure grow3 (cat, line, in1, in2, out, nc, nl)
+
+pointer cat #I Catalog
+int line #I Line
+int in1[nc] #I Previous line
+int in2[nc] #I Current line
+int out[nc] #I Output line
+int nc, nl #I Dimension of image
+
+int i, j, n, id, id0, id1, num1, andi()
+bool grow
+pointer objs, obj, obj1
+
+begin
+ objs = CAT_OBJS(cat) - 1
+ obj1 = NULL
+ n = 0
+ do i = 1, nc {
+ id0 = in2[i]
+ if (id0 != 0 && MNOTSPLIT(id0)) {
+ out[i] = id0
+ next
+ }
+
+ id = 0
+ j = i - 1
+ if (i > 1) {
+ id1 = in1[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in2[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ }
+ id1 = in1[i]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ j = i + 1
+ if (i < nc) {
+ id1 = in1[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ id1 = in2[j]
+ num1 = MNUM(id1)
+ if (num1 >= NUMSTART) {
+ if (MNOTSPLIT(id1)) {
+ if (obj1 == NULL) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ } else if (OBJ_NUM(obj1) != num1) {
+ obj1 = Memi[objs+num1]
+ grow = NOTGROWN(obj1)
+ }
+ if (grow) {
+ if (id == 0) {
+ id = id1
+ obj = obj1
+ } else if (id != id1) {
+ if (OBJ_FLUX(obj) < OBJ_FLUX(obj1)) {
+ id = id1
+ obj = obj1
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (id == 0)
+ out[i] = in2[i]
+ else {
+ out[i] = id
+ OBJ_NPIX(obj) = OBJ_NPIX(obj) + 1
+ n = n + 1
+ }
+ }
+
+ return (n)
+end