1
C @(#)invanalys.for 19.1 (ES0-DMD) 02/25/03 13:26:20
2
C===========================================================================
3
C Copyright (C) 1995 European Southern Observatory (ESO)
5
C This program is free software; you can redistribute it and/or
6
C modify it under the terms of the GNU General Public License as
7
C published by the Free Software Foundation; either version 2 of
8
C the License, or (at your option) any later version.
10
C This program is distributed in the hope that it will be useful,
11
C but WITHOUT ANY WARRANTY; without even the implied warranty of
12
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
C GNU General Public License for more details.
15
C You should have received a copy of the GNU General Public
16
C License along with this program; if not, write to the Free
17
C Software Foundation, Inc., 675 Massachusetss Ave, Cambridge,
20
C Corresponding concerning ESO-MIDAS should be addressed as follows:
21
C Internet e-mail: midas@eso.org
22
C Postal address: European Southern Observatory
23
C Data Management Division
24
C Karl-Schwarzschild-Strasse 2
25
C D 85748 Garching bei Muenchen
27
C===========================================================================
29
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
30
C.COPYRIGHT: Copyright (c) 1987 European Southern Observatory,
33
C.IDENTIFICATION: ANALYS VERSION 2.0 840522
34
C.PURPOSE: For an input list of objects, calcul of classifying
35
C parameters, magnitudes, positions, gradients, profiles
36
c (see inventory user's manual from a. kruszewski)
37
C.AUTHOR: A. Kruszewski
38
C.LANGUAGE: F77+ESOext
39
C.KEYWORDS: classifying parameters, magnitudes, positions, profiles
40
C.VERSION: 1.0 ESO-FORTRAN Conversion, AA 8:56 - 23 NOV 1987
41
C.VERSION: Ch O, ESO - Garching 850115
42
C.VERSION: AK, Obs. de Geneva 870303 changes for the Alliant FX
43
C.VERSION: AK, ESO Garching 870702 new table column names
44
C.VERSION MP, ESO Garching 890216 change length of TYPE
45
C-----------------------------------------------------------------------
49
INCLUDE 'MID_REL_INCL:INVENT.INC/NOLIST'
51
INTEGER IACOL, IACT, IAROW, IARR(32)
52
INTEGER*8 ICOLP, IPNTR, JPNTR, KPNTR, LPNTR
53
INTEGER ICOL(6), IHED, IMF
54
INTEGER ISTAT, ITF, ITOB(4), IXYU(4)
56
INTEGER KNUL, KSIZE, KUN
57
INTEGER LPXL, LSBP, LSIZE
59
INTEGER NAXIS, NBYTE, NCOLI, NEL
60
INTEGER NCAT(NIPAR,MAXCNT), NPIX(2), NROWI
64
REAL PMTR(NRPAR,MAXCNT)
65
REAL PRCT(0:MAXSUB,MAXCNT)
68
DOUBLE PRECISION START(2)
69
DOUBLE PRECISION STEP(2)
70
DOUBLE PRECISION DBLONE
73
CHARACTER*16 COLAR, COLAV9, COLBGD
74
CHARACTER*16 COLID, COLISO, COLX, COLY
76
CHARACTER*60 FRAME, INTABL, OUTABL , OUTPSF
81
C INCLUDE 'MID_INCLUDE:TABLES.INC/NOLIST'
82
INCLUDE 'MID_INCLUDE:ST_DEF.INC/NOLIST'
84
C INCLUDE 'MID_INCLUDE:TABLED.INC/NOLIST'
85
INCLUDE 'MID_INCLUDE:ST_DAT.INC/NOLIST'
89
CALL STSPRO('ANALYSE')
91
C *** Initialisation of column labels.
108
C *** Read arrays IARR and RARR.
110
CALL RDKINV(IARR, RARR, ISTAT)
112
C *** Read image and tables names.
114
CALL STKRDC('IN_A', 1, 1, 60, IACT, FRAME, KUN, KNUL, ISTAT)
115
CALL STKRDC('IN_B', 1, 1, 60, IACT, INTABL, KUN, KNUL, ISTAT)
116
CALL STKRDC('OUT_A', 1, 1, 60, IACT, OUTABL, KUN, KNUL, ISTAT)
117
CALL STKRDC('INPUTC', 1, 1, 10, IACT, OPTION, KUN, KNUL, ISTAT)
118
CALL STKRDC('OUT_B', 1, 1, 60, IACT, OUTPSF, KUN, KNUL, ISTAT)
120
C *** Open image frame.
122
CALL STIGET(FRAME,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,2,
123
& NAXIS, NPIX, START, STEP, IDENT, CUNIT, IPNTR,
128
C *** Check if descriptor STARS is present if needed.
130
IF (IARR(11) .LT. 0) THEN
131
CALL STDFND(IMF, 'STARS', TYPE, NEL, NBYTE, ISTAT)
132
IF (TYPE .EQ. ' ' .OR. NEL .LE. 0) THEN
133
OUTPUT = '*** FATAL: '//
134
2 'Descriptor STARS is missing in your frame'
135
CALL STTPUT(OUTPUT, ISTAT)
136
OUTPUT = ' Create it via GET/CURS STARS/DES or'
137
CALL STTPUT(OUTPUT, ISTAT)
138
OUTPUT = ' set keyword PRFLCTRL to non-negative value.'
139
CALL STTPUT(OUTPUT, ISTAT)
144
C *** Read descriptor DPROFILE after testing its presence.
146
CALL STDFND(IMF, 'DPROFILE', TYPE, NEL, NBYTE, ISTAT)
147
IF (.NOT. (TYPE .EQ. ' ' .OR. NEL .LE. 0)) THEN
148
CALL STDRDR(IMF, 'DPROFILE', 1, 25, IACT, RARR(14),
152
C *** Find borders of an area on which the search
153
C *** shall be made. It has the form of rectangle.
154
C *** The keyword PHYSICAL = IARR(7) tells if the
155
C *** search rectangle is defined by physical coordinates
156
C *** RARR(54) - RARR(57) (IARR(7)=1), or by pixel
157
C *** coordinates IARR(12) - IARR(15) (IARR(7)=0).
159
IF (IARR(7) .EQ. 1) THEN
160
IARR(12) = 1 + NINT((DBLE(RARR(54)) - START(1))/STEP(1))
161
IARR(13) = 1 + NINT((DBLE(RARR(55)) - START(2))/STEP(2))
162
IARR(14) = 1 + NINT((DBLE(RARR(56)) - START(1))/STEP(1))
163
IARR(15) = 1 + NINT((DBLE(RARR(57)) - START(2))/STEP(2))
166
C *** Default is whole frame.
168
IF (IARR(14) .LE. MAX(IARR(12), 0)) THEN
172
IF (IARR(15) .LE. MAX(IARR(13), 0)) THEN
177
C *** Check if searched region overlaps with the frame.
179
IF (IARR(12).GE.NX-IARR(19) .OR. IARR(13).GE.
180
& NY-IARR(19) .OR. IARR(14).LE.1+IARR(19)
181
& .OR. IARR(15).LE.1+IARR(19)) THEN
182
OUTPUT = '*** FATAL: '//
183
& 'Frame and searched region do not overlap'
184
CALL STTPUT(OUTPUT, ISTAT)
187
C *** Frame margins IARR(19)-pixels wide are not used.
189
IARR(12) = MAX(IARR(12), IARR(19)+1)
190
IARR(13) = MAX(IARR(13), IARR(19)+1)
191
IARR(14) = MIN(IARR(14), NX-IARR(19))
192
IARR(15) = MIN(IARR(15), NY-IARR(19))
194
C *** IARR(12) to IARR(15) give limits of searched region.
195
C *** Temporary objects can be detected in little larger
196
C *** region bounded by array ITOB.
199
ITOB(1) = MAX( IARR(12)-IHED , IARR(19)+1 )
200
ITOB(2) = MAX( IARR(13)-IHED , IARR(19)+1 )
201
ITOB(3) = MIN( IARR(14)+IHED , NX-IARR(19) )
202
ITOB(4) = MIN( IARR(15)+IHED , NY-IARR(19) )
204
C *** Data in still larger region is used. It is limited by array IXYU.
206
IXYU(1) = MAX(ITOB(1)-IHED, 1)
207
IXYU(2) = MAX(ITOB(2)-IHED, 1)
208
IXYU(3) = MIN(ITOB(3)+IHED, NX)
209
IXYU(4) = MIN(ITOB(4)+IHED, NY)
211
C *** Allocate memory for line pointers array.
214
CALL TDMGET(JSIZE, JPNTR, ISTAT)
216
C *** Allocate memory for two dimensional p.s.f.
220
KSIZE = 4 * ( (7+NOSP) * (2*LPXL+1)**2 + 1) * (2*LSBP+1)**2
221
CALL TDMGET(KSIZE, KPNTR, ISTAT)
222
LSIZE = 4 * ( (2*LSBP+1)**2 + NOSP + 1 )
223
CALL TDMGET(LSIZE, LPNTR, ISTAT)
225
C *** Open input table.
227
CALL TBTOPN(INTABL,F_I_MODE,ITF,ISTAT)
229
C *** Read number of input table rows NROWI and columns NCOLI.
231
CALL TBIGET(ITF, NCOLI, NROWI, NSC, IACOL, IAROW, ISTAT)
233
C *** Find columns X and Y and read them into array NCAT.
235
CALL TBLSER(ITF, COLX, ICOL(1), ISTAT)
236
IF (ICOL(1) .LE. 0 .OR. ISTAT .NE. 0) THEN
237
OUTPUT = '*** FATAL: The column label X is not present.'
238
CALL STTPUT(OUTPUT, ISTAT)
241
CALL TBCMAP(ITF, ICOL(1), ICOLP, ISTAT)
242
CALL TBLAI(MADRID(ICOLP), NROWI, START(1), STEP(1),
244
CALL TBLAR(MADRID(ICOLP), NROWI, START(1), STEP(1),
248
CALL TBLSER(ITF, COLY, ICOL(2), ISTAT)
249
IF (ICOL(2) .LE. 0 .OR. ISTAT .NE. 0) THEN
250
OUTPUT = '*** FATAL: The column label Y is not present'
251
CALL STTPUT(OUTPUT, ISTAT)
254
CALL TBCMAP(ITF, ICOL(2), ICOLP, ISTAT)
255
CALL TBLAI(MADRID(ICOLP), NROWI, START(2), STEP(2),
257
CALL TBLAR(MADRID(ICOLP), NROWI, START(2), STEP(2),
261
C *** Find column RAD_ISO if IARR(5) = 1.
263
IF (IARR(5) .EQ. 1) THEN
264
CALL TBLSER(ITF, COLISO, ICOL(5), ISTAT)
265
IF (ICOL(5) .LE. 0 .OR. ISTAT .NE. 0) THEN
266
OUTPUT = '*** WARNING: '//
267
2 'The column label RAD_ISO is not present'
268
CALL STTPUT(OUTPUT, ISTAT)
271
CALL TBCMAP(ITF, ICOL(5), ICOLP, ISTAT)
272
CALL TBLAR(MADRID(ICOLP), NROWI, DBLONE, DBLONE, PMTR,
279
C *** Find columns LOC_BGD and AVER_9.
281
CALL TBLSER(ITF, COLBGD, ICOL(3), ISTAT)
282
IF (ICOL(3) .LE. 0 .OR. ISTAT .NE. 0) THEN
285
CALL TBCMAP(ITF, ICOL(3), ICOLP, ISTAT)
286
CALL TBLAR(MADRID(ICOLP), NROWI, DBLONE, DBLONE, PMTR,
289
CALL TBLSER(ITF, COLAV9, ICOL(4), ISTAT)
290
IF (ICOL(4) .LE. 0 .OR. ISTAT .NE. 0) THEN
293
CALL TBCMAP(ITF, ICOL(4), ICOLP, ISTAT)
294
CALL TBLAR(MADRID(ICOLP), NROWI, DBLONE, DBLONE, PMTR,
298
C *** Find column ID or create its values if absent.
300
C CALL TXLSER(INTABL,COLID,ICOL(6),ISTAT)
301
C IF (ICOL(6).LE.0) THEN
306
C CALL TXCMAP(INTABL,ICOL(6),ICOLP,ISTAT)
307
C CALL TBLAI(MADRID(ICOLP),NROWI,DBLONE,DBLONE,IDCAT,1,1)
310
C *** Perform calculations.
312
CALL CALCUL(IMF, MADRID(IPNTR), MADRID(JPNTR), NX, NY,
313
& ITOB, IXYU, IARR, RARR, ICOL, NROWI, NCAT,
314
& PMTR, PRCT, MADRID(KPNTR), MADRID(LPNTR), OUTPSF)
316
C *** Free resources.
318
CALL TDMFRE(LSIZE, LPNTR, ISTAT)
319
CALL TDMFRE(KSIZE, KPNTR, ISTAT)
320
CALL TDMFRE(JSIZE, JPNTR, ISTAT)
321
CALL TBTCLO(ITF, ISTAT)
326
C **********************************************************************
328
SUBROUTINE TBLAI(ARR, N, START, STEP, NARR, NCOL, ICOL)
335
DOUBLE PRECISION START
336
DOUBLE PRECISION STEP
341
DOUBLE PRECISION FCTR
343
IF (START .EQ. 1.0 .AND. STEP .EQ. 1.0) THEN
345
NARR(ICOL,L) = NINT(ARR(L))
350
NARR(ICOL,L) = NINT((ARR(L) - REAL(START))*FCTR) + 1
357
C **********************************************************************
359
SUBROUTINE TBLAR(ARR, N, START, STEP, AARR, NCOL, ICOL)
365
DOUBLE PRECISION START
366
DOUBLE PRECISION STEP
373
IF (START .EQ. 1.0 .AND. STEP .EQ. 1.0) THEN
375
AARR(ICOL,L) = ARR(L)
378
FCTR = 1.0 / REAL(STEP)
380
AARR(ICOL,L) = (ARR(L) - REAL(START))*FCTR + 1.0