1
C===========================================================================
2
C Copyright (C) 1995-2010 European Southern Observatory (ESO)
4
C This program is free software; you can redistribute it and/or
5
C modify it under the terms of the GNU General Public License as
6
C published by the Free Software Foundation; either version 2 of
7
C the License, or (at your option) any later version.
9
C This program is distributed in the hope that it will be useful,
10
C but WITHOUT ANY WARRANTY; without even the implied warranty of
11
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
C GNU General Public License for more details.
14
C You should have received a copy of the GNU General Public
15
C License along with this program; if not, write to the Free
16
C Software Foundation, Inc., 675 Massachusetss Ave, Cambridge,
19
C Correspondence concerning ESO-MIDAS should be addressed as follows:
20
C Internet e-mail: midas@eso.org
21
C Postal address: European Southern Observatory
22
C Data Management Division
23
C Karl-Schwarzschild-Strasse 2
24
C D 85748 Garching bei Muenchen
26
C===========================================================================
28
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
29
C.COPYRIGHT: Copyright (c) 1987 European Southern Observatory,
31
C.IDENTIFICATION: SEARCH.FOR
32
C.PURPOSE: Searches image frame for objects and write found
33
C objects into array ACAT.
35
C.ALGORITHM: Described in additional documentation.
38
C.AUTHOR: A. Kruszewski
39
C.KEYWORDS: GALAXIES, IMAGES, SEARCH, STARS
40
C.ENVIRONMENT: Portable MIDAS
41
C.COMMENTS: Subroutines SEARCH and SEAREG used by program INVSEARCH
42
C.VERSION: 1.0 JUL 1981 Creation ESO-Garching
43
C.VERSION: 1.1 16 AUG 1983 Modification ESO-Garching
44
C.VERSION: 2.0 6 SEP 1983 Modified by Ch. Ounnas ESO-Garching
45
C.VERSION: 22 MAY 1984 Modified by Ch. Ounnas ESO-Garching
46
C.VERSION: 2.1 19 FEB 1987 Modified for FX Obs. de Geneve
47
C.VERSION: 3.0 JUN 1987 Indirect pixel addresing and SEAREG
49
C.VERSION: 4.0 18 OCT 1988 Modified for portability Warsaw U. Obs.
50
C.VERSION: 2 MAY 1989 Few minor changes ESO-Garching
51
C-----------------------------------------------------------------------
52
SUBROUTINE SEARCH(IMF, A, JAPY, NX, NY,
53
& ACAT, IDET, IDA, IARR, RARR, MM)
56
INCLUDE 'MID_REL_INCL:INVENT.INC/NOLIST'
58
INTEGER IMF ! IN: Image file
59
REAL A(1) ! LOC: Image data buffer
60
INTEGER JAPY(1) ! LOC: Pointers to image lines
61
INTEGER NX ! IN: Image X-dimension
62
INTEGER NY ! IN: Image Y-dimension
63
REAL ACAT(5,MAXCNT) ! OUT: Catalog of objects
64
INTEGER IDET(1) ! LOC: Detection mapping array
65
INTEGER IDA(1) ! LOC: Multiple detections limits
66
INTEGER IARR(32) ! IN: Integer INVENTORY keywords
67
REAL RARR(64) ! IN: Real INVENTORY keywords
68
INTEGER MM ! OUT: Number of detected objects
71
INTEGER IHED, ILIM, ISTAT
72
CKB INTEGER INET(0:MAXNET)
73
INTEGER INET0,INET(MAXNET)
75
INTEGER IUSD(4), IXYU(4)
76
INTEGER JEND, JMSG, JS, JSRCHD
78
INTEGER NC, NH1, NHED, NL
79
INTEGER MCAT(4,MAXDET)
81
INTEGER NHSEG, NLPB, NVSEG
82
INTEGER NXS, NXU, NYS, NYU
85
REAL BCAT(2,MAXDET), CRMD(3), DLIM, SKYNET(2,MAXNET)
89
C *** Recall keywords.
107
C *** Define used part of frame IXYU.
109
IXYU(1) = MAX( 1 , IARR(12)-IHED )
110
IXYU(2) = MAX( 1 , IARR(13)-IHED )
111
IXYU(3) = MIN( NX , IARR(14)+IHED )
112
IXYU(4) = MIN( NY , IARR(15)+IHED )
114
C *** Part of frame in buffer is limited by IBUF.
119
C *** Presently buffer is identical with the frame.
126
C *** Analysed part of frame shall be divided onto vertical
127
C *** segments. Borders of actual segment are set by IUSD.
132
cC *** Find number of lines in buffer.
134
c NPPL = IXYU(3) - IXYU(1) + 1
135
c NLPB = MIN ( NYBUF , NIBUF/NPPL )
138
C *** Searched part of frame is defined by IARR(12)-IARR(15)
140
NXU = IXYU(3) - IXYU(1) + 1
141
NYU = IXYU(4) - IXYU(2) + 1
142
NXS = IARR(14) - IARR(12) + 1
143
NYS = IARR(15) - IARR(13) + 1
145
C *** Set array for combining detections.
149
CALL LMTDET( ILIM , DLIM , IDA )
151
C *** Initialize detection array.
153
ITMP = (ILIM+1) * NXS
158
C *** Calculate number of vertical segments.
160
NVSEG = INT( RARR(48) * FLOAT(NYS) / FLOAT(2*NHED+1) ) + 1
162
cC *** Make segments small enough to fit buffer.
164
c IF ( (NYS/NVSEG+1+2*IHED)*NXU .GT. NIBUF .OR.
165
c & NYS/NVSEG+1+2*IHED .GT. NYBUF ) THEN
167
c IF ( NLPB-2*IHED .GT. IHED .AND. NLPB .LE.
169
c NVSEG = NYS / (NLPB-2*IHED) + 1
171
c CALL STTPUT('Check connection and include files',ISTAT)
176
C *** Divide searched part of a frame into horizontal segments.
178
NHSEG = MIN ( INT( RARR(48)*FLOAT(NXS) / FLOAT(2*NHED+1) ) + 1 ,
181
INET(NHSEG) = IARR(14)
184
INET(K) = INET0 + ( K*NXS ) / NHSEG
187
C *** Initialize counters.
192
C *** Start loop over vertical segments
198
JSRCHD = IARR(13) - 1
199
CALL STTPUT( 'Search started' , ISTAT )
202
C *** Find vertical limits of searched area.
205
IF ( JS .LT. NVSEG ) THEN
206
JEND = IARR(13) + ( JS*NYS ) / NVSEG
211
cC *** Find vertical limits of used area.
213
c IEXT = ( NLPB - JEND + JSTART ) / 2
214
c IEXT = MAX( NHED , IEXT )
215
c JUS = MAX( JSTART-IEXT , IXYU(2) )
216
c JUE = MIN( JEND+IEXT , IXYU(4) , JUS+NLPB-1 )
218
C *** Take care of image buffers.
220
c IF ( JBE .LT. JUE ) THEN
223
IF ( JS .EQ. 1 ) THEN
224
CALL FILBUF( IMF , A , JAPY , NX , IXYU , IUSD , IBUF )
230
C *** Update sky background net.
232
CALL SBGNET ( A , JAPY , IBUF , IXYU , JS ,
233
& JSTART , JEND , inet0, INET , skynet0,
238
C *** Search JS-th vertical segment.
240
CALL SEAREG ( A , JAPY , IBUF , IXYU , JSTART ,
241
& JEND , NHSEG , inet0, INET , skynet0,
243
& BCAT , MCAT , IDET , IDA , IARR ,
246
C *** Mark last searched line.
249
JMSG = ( 100 * (JSRCHD-IARR(13)+1) ) / NYS
253
WRITE(TEXT,'(I4,A,I8,A)')
254
& JMSG,'% of frame searched ',MM,' objects detected'
255
CALL STTPUT( TEXT , ISTAT )
259
cC ****** Write down objects left in ACAT.
261
c MMB = MOD( MM-1 , NC ) + 1
262
c IF ( MMB .GT. 0 ) THEN
263
c CALL CTLG( ITF , ACAT , NC , START , STEP , MM , MMB )
274
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
276
C.PURPOSE: Searches horizontal image segment
278
C.ALGORITHM: Described in additional documentation
281
C-----------------------------------------------------------------------
282
SUBROUTINE SEAREG(A, JAPY, IBUF, IXYU, JSTART,
283
& JEND, NHSEG, inet0, INET, skynet0,SKYNET, ACAT,
284
& BCAT, MCAT, IDET, IDA, IARR,
288
INCLUDE 'MID_REL_INCL:INVENT.INC/NOLIST'
290
REAL A(1) ! IN: Image buffer
291
INTEGER JAPY(1) ! IN: Pointers to image lines
292
INTEGER IBUF(4) ! IN: Limits of image buffer
293
INTEGER IXYU(4) ! IN: Limits of investigated area
294
INTEGER JSTART ! IN: First searched line
295
INTEGER JEND ! IN: Last searched line
296
INTEGER NHSEG ! IN: Number of horizontal segments
298
INTEGER INET(NHSEG) ! IN: Horizontal segments limits
300
REAL SKYNET(2,NHSEG) ! IN: Net of sky values
301
REAL ACAT(5,MAXCNT) ! MOD: Array with objects data
302
REAL BCAT(2,MAXDET) ! MOD: Real detection data
303
INTEGER MCAT(4,MAXDET) ! MOD: Integer detection data
304
INTEGER IDET(1) ! MOD: Rolling array with detections
305
INTEGER IDA(1) ! MOD: Definition of nearby pixels
306
INTEGER IARR(32) ! IN: Integer INVENTORY keywords
307
REAL RARR(64) ! IN: Real INVENTORY keywords
308
INTEGER M ! MOD: Number of actual detections
309
INTEGER MM ! MOD: Number of actual objects
311
INTEGER I , IARG , IB
312
INTEGER IEND , IFLD , IFULL , IHED
315
INTEGER IP , IPLIM(MAXNET)
316
INTEGER IS , ISDET , ISTART, ISTAT
318
INTEGER J , JBS , JBE , JXY(4)
322
INTEGER NC , NL , NXS
326
REAL BGRD , BLIM , BLIME , BLIMS
328
REAL FLTR , FRCTI1 , FRCTI2 , FRCTJ1 , FRCTJ2
330
REAL PLIM , PLIML , PRLIM(MAXNET)
332
REAL SB2 , SKYMIN , SKYMAX
336
LOGICAL DETECT , OBJECT
344
C ****** Recall keywords. Sky variations are additive,
345
C ****** limiting threshold RTRSH=RARR(3) is in
346
C ****** measurement units: IFLD=1. Sky variations are
347
C ****** multiplicative, limiting threshold RTRSH=RARR(3)
348
C ****** is expressed in units of local sky: IFLD=0.
355
NXS = IARR(14) - IARR(12) + 1
364
ILIM = INT( RARR(43) )
366
C *** Local sky determination is less accurate when ISDET=0,
367
C *** more accurate when ISDET=1, and most accurate when ISDET=2.
371
C *** Calculate offsets.
377
C *** Find preliminary detection limits.
379
SKYMIN = MIN( SKYNET0(1) , SKYNET0(2) ,
380
& SKYNET(1,1) , SKYNET(2,1) )
381
SKYMAX = MAX( SKYNET0(1) , SKYNET0(2) ,
382
& SKYNET(1,1) , SKYNET(2,1) )
383
IF ( IFLD .EQ. 1 ) THEN
384
PRLIM(1) = SKYMIN + RTRSH
387
PRLIM(1) = SKYMIN * (1.0+RTRSH)
388
TRSH = PRLIM(1) - SKYMIN
391
C *** Mark segments with disprepant sky determinations.
393
IF ( SKYMAX-SKYMIN .GT. TRSH ) THEN
401
SKYMIN = MIN( SKYNET(1,IS-1) , SKYNET(2,IS-1) ,
402
& SKYNET(1,IS) , SKYNET(2,IS) )
403
SKYMAX = MAX( SKYNET(1,IS-1) , SKYNET(2,IS-1) ,
404
& SKYNET(1,IS) , SKYNET(2,IS) )
405
IF ( IFLD .EQ. 1 ) THEN
406
PRLIM(IS) = SKYMIN + RTRSH
409
PRLIM(IS) = SKYMIN * (1.0+RTRSH)
410
TRSH = PRLIM(IS) - SKYMIN
413
C *** Mark segments with disprepant sky determinations.
415
IF ( SKYMAX-SKYMIN .GT. TRSH ) THEN
422
C *** Search by lines.
424
DO 10 J = JSTART , JEND
426
FRCTJ1 = FLOAT(JEND-J) / FLOAT(JEND-JSTART)
427
FRCTJ2 = 1.0 - FRCTJ1
429
C *** Search by horizontal segments.
433
IF ( IS .GT. 1 ) THEN
434
ISTART = INET(IS-1) + 1
436
CKB ISTART = INET(IS-1)
441
C *** Find preliminary detection limit.
444
PLIML = MAX( LCUT , PLIM - 4.0*TRSH )
445
IF ( ISDET .EQ. 2 ) THEN
446
PLIM = PLIM - 0.3 * TRSH
450
C *** Search by pixels.
452
DO 30 I = ISTART , IEND
458
C *** Pixel lower than preliminary
459
C *** limit is no longer considered.
461
IF ( AVER .LT. PLIM ) THEN
462
c IF ( AVER .LT. PLIML ) THEN
468
C *** Pixels higher than HCUT get special treatment.
470
IF ( AVER .GE. HCUT ) THEN
472
CALL SATOBJ( A , JAPY , JOFF , I , J ,
474
IF ( ISDET .EQ. 2 ) THEN
475
BGRD = PLIM - 0.7 * TRSH
479
CALL FLTRBP( A , JAPY , IBUF , I , J ,
480
& BGRD , FLTR , AVER )
481
IF ( AVER .GT. 0.9*HCUT ) THEN
488
C***********************************************************************
490
C ****** This part of code depends on
491
C ****** the detection criterium used.
493
CALL SRHOBJ( A , JAPY , JOFF , I , J ,
495
IF ( .NOT. DETECT ) GOTO 30
497
C ****** Pixel is higher than 8 neighbours.
499
C***********************************************************************
502
IF ( IB .EQ. 0 ) THEN
504
C ****** Find background on borders.
507
BLIMS = SKYNET0(1)*FRCTJ1 +
508
& SKYNET0(2)*FRCTJ2 + TRSH
509
BLIME = SKYNET(1,1)*FRCTJ1 +
510
& SKYNET(2,1)*FRCTJ2 + TRSH
512
BLIMS = SKYNET(1,IS-1)*FRCTJ1 +
513
& SKYNET(2,IS-1)*FRCTJ2 + TRSH
514
BLIME = SKYNET(1,IS)*FRCTJ1 +
515
& SKYNET(2,IS)*FRCTJ2 + TRSH
520
C ****** Calculate interpolated background.
522
FRCTI1 = FLOAT(I-ISTART) / FLOAT(IEND-ISTART)
523
FRCTI2 = 1.0 - FRCTI1
524
BLIM = BLIMS*FRCTI1 + BLIME*FRCTI2
525
IF ( ISDET .EQ. 2 ) THEN
526
BLIM = BLIM - 0.3 * TRSH
528
IF ( AVER .GT. BLIM ) THEN
529
IF ( ISDET .EQ. 2 ) THEN
530
BGRD = BLIM - 0.7 * TRSH
537
C ****** Calculate approximate background.
539
JXY(1) = MAX( IBUF(1) , I-IHED )
540
JXY(2) = MAX( IBUF(2) , J-IHED )
541
JXY(3) = MIN( IBUF(3) , I+IHED )
542
JXY(4) = MIN( IBUF(4) , J+IHED )
543
CALL APRBGR ( A , JAPY , JOFF , JXY , SB2 )
544
IF ( AVER .LT. SB2+TRSH ) THEN
551
C ****** The pixel has passed approximate
552
C ****** criteria. Now the final criterium
553
C ****** will be applied if necessary.
555
IF ( IP .EQ. 1 .OR. ISDET .EQ. 1 ) THEN
557
CALL SKYMOD( A , JAPY , IBUF , I , J , CRMD ,
558
& IHED , IFULL , BGRD )
559
IF ( AVER .LE. BGRD+TRSH ) GOTO 30
560
IF ( A(JAPY(J-JOFF)+I) .GT.
561
& BGRD + (FLTR-1.0)*TRSH ) THEN
562
CALL FLTRBP( A , JAPY , IBUF , I , J ,
563
& BGRD , FLTR , AVER )
565
IF ( AVER .LE. BGRD+TRSH ) GOTO 30
569
C *** One more check.
572
c CALL RADDET( A , JAPY , IBUF , I , J ,
573
c & MINCR , TRLM , AVER , TRSH , AR )
574
c IF ( AR .LT. 0.0 .AND. AVER .LT. 0.9*HCUT ) GOTO 30
577
C ****** This is a detection.
582
+ ('*** FATAL: Internal buffer overflow; ',ISTAT)
584
+ (' Restrict our search to smaller subframe',
587
+ (' or modify parameter setup fro detection',
592
C ****** Save arrays MCAT and BCAT
593
C ****** if they are full of new data.
595
c IF ( MOD( M , NL ) .EQ. 1 .AND. M .GT. NL ) THEN
599
c WRITE ( ISF , REC=KREC ) MCAT(1,K) ,
600
c & MCAT(2,K) , MCAT(3,K) , MCAT(4,K) ,
601
c & BCAT(1,K) , BCAT(2,K)
605
C *** Record data for new detection.
607
MK = MOD( M-1 , NL ) + 1
616
C *** Update linked list of detections.
618
CALL UPDTLL( MCAT , NL , IDET ,
619
& NXS , ILIM , IDA , IP , M )
624
C *** Join multiple detections and update array IDET.
626
CALL JOINMD( A , JAPY , IBUF , IXYU , ACAT ,
627
& NC , BCAT , MCAT , NL , IDET ,
628
& NXS , ILIM , IARR , RARR , M ,
630
IF ( J .EQ. IARR(15) ) THEN
632
CALL JOINMD( A , JAPY , IBUF , IXYU , ACAT ,
633
& NC , BCAT , MCAT , NL , IDET ,
634
& NXS , ILIM , IARR , RARR , M ,