1
C @(#)tdconv.for 19.1 (ESO-IPG) 02/25/03 14:11:11
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 Massachusetts Ave, Cambridge,
20
C Correspondence 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.VERSION: 1.0 ESO-FORTRAN Conversion, AA 14:22 - 19 NOV 1987
35
C.LANGUAGE: F77+ESOext
38
C 900219 KB, throw out SX calls...
44
C Table to Image conversion
46
C CONV/TAB image = table colx [z] refima method
50
C table, image, conversion
54
C Use table interface routines for I/O
55
C The conversion from table format into image is done
56
C by spline interpolation.
57
C The interpolation scheme is based on Hermite polynomials
58
C Ref .: Publ. of the Dominion Astrophys. Obs. 204, 1982.
62
C-----------------------------------------------------------
68
INTEGER PNVALS, STATUS, N1, NBY, IMNO,REF
69
INTEGER ICOL(3),NPTOT(100),NPIX(2),KUN,KNUL
71
INTEGER NPAR, ISTAT, NN, NAXIS, NO, NB, NDIM, TID, IS
72
INTEGER NCOL, NROW, NSC, NAC, NAR, I, I1, I2
73
INTEGER*8 PNTR, IP1, IP2
75
DOUBLE PRECISION STEP(2),START(2)
76
REAL RMIN,RMAX, CUTS(4)
77
DOUBLE PRECISION WSTART(100)
79
CHARACTER*80 TABLE,IMAGE,REFIMA
80
CHARACTER*17 COLREF(2)
87
INCLUDE 'MID_INCLUDE:TABLES.INC'
89
INCLUDE 'MID_INCLUDE:TABLED.INC'
92
DATA MSG/'ERR:TCONVTBLxxxx'/
93
DATA NPIX /1,1/, START /0.,0./, STEP /1.,1./
95
C ... get input parameters + default
97
CALL TDPGET(PNVALS,NPAR,ISTAT)
98
IF (ISTAT.NE.0) GO TO 30
101
COLREF(1) = TPARBF(4)
102
COLREF(2) = TPARBF(5)
104
CALL STFOPN(REFIMA,D_R4_FORMAT,0,F_IMA_TYPE,REF,ISTAT)
105
CALL STDRDI(REF,'NAXIS',1,1,NN,NAXIS,KUN,KNUL,ISTAT)
106
CALL STDRDI(REF,'NPIX',1,NAXIS,NN,NPIX,KUN,KNUL,ISTAT)
107
CALL STDRDD(REF,'START',1,NAXIS,NN,START,KUN,KNUL,ISTAT)
108
CALL STDRDD(REF,'STEP',1,NAXIS,NN,STEP,KUN,KNUL,ISTAT)
109
IF (NAXIS.GT.1 .AND. NPIX(2).GT.1) THEN
111
CALL STDFND(REF,'WSTART',TYPE,NO,NB,ISTAT)
112
IF (TYPE(1:1).EQ.' ') THEN
113
CALL STTPUT(' Wrong reference image ',ISTAT)
116
CALL STDRDD(REF,'WSTART',1,NPIX(2),NN,WSTART,
118
CALL STDRDI(REF,'NPTOT',1,NPIX(2),NN,NPTOT,
120
CALL STDRDI(REF,'NORDER',1,NPIX(2),NN,NORDER,
128
C CALL EXIMAG(REFIMA,ISTAT)
130
C ... init input table
133
CALL TBTOPN(TABLE,F_I_MODE,TID,STATUS)
134
IF (ISTAT.NE.0) GO TO 30
135
CALL TBIGET(TID,NCOL,NROW,NSC,NAC,NAR,ISTAT)
136
IF (ISTAT.NE.0) GO TO 30
138
C ... find input column
141
CALL TBCSER(TID,COLREF(I),ICOL(I),ISTAT)
142
IF (ICOL(I).EQ.-1) THEN
146
CALL TBUGET(TID,ICOL(I),WORK,ISTAT)
147
CC old: wrong, because CUNIT(1:16) is for unit of pixel values
149
CC PN 8/99: add offset of 16: (I-1)*16 + 1 + 16 =
152
CUNIT(I1:I2) = WORK(1:16)
155
C ... copy selected values of the table into work space
158
CALL TDMGET(NBY, IP1, IS)
159
CALL TDMGET(NBY, IP2, IS)
160
CALL COPY(TID,ICOL(1),ICOL(2),NROW,MADRID(IP1),MADRID(IP2),N1)
162
CALL STTPUT(' Not enough points in table ',ISTAT)
168
CC old: wrong, because FLUX is the unit of the values in the image
169
CC CUNIT(I2+1:I2+16) = 'FLUX'
170
CC PN 8/99: put this at the beginning
172
I2 = INDEX(TABLE,' ')
173
IF (I2.lt.1) I2 = LEN(TABLE)
174
IDENT = 'TABLE: '//TABLE(1:I2)//'COLS. :'//COLREF(1)//COLREF(2)
175
CALL STIPUT(IMAGE,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
176
. NDIM,NPIX,START,STEP,IDENT,CUNIT,
179
C ... interpolate from table values
181
CALL INTERP(N1,MADRID(IP1),MADRID(IP2),NPIX(1),NPIX(2),
182
+ MADRID(PNTR),START,STEP,WSTART,NPTOT,RMIN,RMAX)
190
CALL STDWRR(IMNO,'LHCUTS',CUTS,1,4,KUN,ISTAT)
191
IF (NPIX(2).GT.1) THEN
192
CALL STDWRD(IMNO,'WSTART',WSTART,1,NPIX(2),KUN,ISTAT)
193
CALL STDWRI(IMNO,'NPTOT',NPTOT,1,NPIX(2),KUN,ISTAT)
194
CALL STDWRI(IMNO,'NORDER',NORDER,1,NPIX(2),KUN,ISTAT)
199
20 CALL TDMFRE(NBY, IP1, IS)
200
CALL TDMFRE(NBY, IP2, IS)
204
CALL DSCUPT(IMNO,IMNO,' ',ISTAT)
205
CALL TBTCLO(TID,ISTAT)
206
30 IF (ISTAT.NE.0) THEN
207
WRITE (MSG(13:16),9000) ISTAT
208
CALL TDERRR(ISTAT,MSG,STATUS)
214
SUBROUTINE COPY(TID,ICOL1,ICOL2,NROW,X1,Y1,N1)
216
C copy relevant part of the table
220
INTEGER TID, ICOL1, ICOL2
224
LOGICAL ISEL, INULL1, INULL2
225
REAL X,Y,X1(NROW),Y1(NROW)
229
CALL TBSGET(TID,I,ISEL,STATUS)
230
CALL TBERDR(TID,I,ICOL1,X,INULL1,STATUS)
231
CALL TBERDR(TID,I,ICOL2,Y,INULL2,STATUS)
232
IF (ISEL .AND. .NOT.INULL1 .AND. .NOT.INULL2) THEN
241
SUBROUTINE INTERP(NROW,X,Y,NPIX1,NPIX2,F,START,STEP,WSTART,NPTOT,
245
C call for each order to the interpolation routine
247
INTEGER NROW,NPIX1,NPIX2,IORD,I,NP,FLAG,I0
248
REAL X(NROW),F(NPIX1,NPIX2),RMIN,RMAX
249
REAL Y(NROW),STARTX,STEPX,VAL,XP
251
DOUBLE PRECISION WSTART(100)
252
DOUBLE PRECISION START(2),STEP(2)
264
STARTX = WSTART(IORD)
268
C ... loop for each point
271
CALL INTEP(FLAG,STARTX,VAL,X,Y,NROW,I0)
272
RMIN = AMIN1(RMIN,VAL)
273
RMAX = AMAX1(RMAX,VAL)
277
XP = STARTX + (I-1)*STEPX
278
CALL INTEP(FLAG,XP,VAL,X,Y,NROW,I0)
279
RMIN = AMIN1(RMIN,VAL)
280
RMAX = AMAX1(RMAX,VAL)
283
DO 20 I = NP + 1,NPIX1
291
SUBROUTINE INTEP(FLAG,XP,P,X,Y,N,I0)
293
C Interpolate a function P at a given value XP using
295
C the table of values (X,F).
296
C Spline interpolation scheme based on Hermite polynomials.
297
C Ref.: U.S. Airforce Surveys in Geophysics, no.272
298
C Publ of the Dominion Astrophys. Obs. 204, 1982
299
C For random values of XP use INTEP, or after the first
300
C call to INTEP for incresing/decreasing values of XP consistent
301
C with the vector X, use EINTP
304
C XP Input argument value
305
C P Output interpolated value
306
C X Input vector of independent values
307
C F Input vector of dependent values
308
C N Input number of points in (X,F) vector
309
C I0 will be saved in the calling routine
319
REAL FP1,FP2,XPI,XPI1
325
IF (X(2).LT.X(1)) IUP = 1
328
C FLAG is only 1 when INTEP is called the first time
329
IF (FLAG .EQ. 1) THEN
333
C This part has to be outside of IF FLAG.EQ.1 loop
334
C to avoid problems on DEC machines:
335
IF ((XP.GT.X(N).AND.IUP.EQ.0) .OR.
336
+ (XP.LT.X(N).AND.IUP.EQ.1) .OR.
337
+ (XP.LT.X(1).AND.IUP.EQ.0) .OR.
338
+ (XP.GT.X(1).AND.IUP.EQ.1)) THEN
344
IF ((XP.LT.X(I) .AND. IUP.EQ.0) .OR.
345
+ (XP.GT.X(I) .AND. IUP.EQ.1)) THEN
356
LP1 = 1./ (X(I)-X(I+1))
357
LP2 = 1./ (X(I+1)-X(I))
361
FP1 = (Y(I+1)-Y(I-1))/ (X(I+1)-X(I-1))
364
FP1 = (Y(2)-Y(1))/ (X(2)-X(1))
367
C leave the IF order like in original code
369
FP2 = (Y(N)-Y(N-1))/ (X(N)-X(N-1))
371
FP2 = (Y(I+2)-Y(I))/ (X(I+2)-X(I))
378
P = Y(I)* (1.-2.*LP1*XPI)*L1*L1 +
379
+ Y(I+1)* (1.-2.*LP2*XPI1)*L2*L2 + FP2*XPI1*L2*L2 +