1
C @(#)necexor.for 19.1 (ESO-DMD) 02/25/03 14:20:22
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 21:13 - 3 DEC 1987
35
C.LANGUAGE: F77+ESOext
40
C program ECHEXOR version 1.2 840114
44
C ECHELLE, CASPEC, DATA EXTRACTION
48
C EXTRACT ECHELLE ORDERS IN CASPEC IMAGES. ORDER POSITION ARE DEFINED
49
C BY COEFFICIENTS OF A REGRESSION. SLIT WIDTH, ANGLE AND OFFSET
50
C ARE DEFINED BY PARAMETERS
55
C ORDERS ARE EXTRACTED BY PASSING A NUMERICAL SLIT OF GIVEN WIDTH
56
C AND ANGLE IN POSITIONS DEFINED BY THE REGRESSION COEFFS. THE SLIT
57
C WILL SAMPLE AT INCREMENTS OF ONE STEP IN X.
59
C THERE ARE THREE METHODS :
60
C LINEAR - PIXEL VALUES ARE ADDED, LINEAR INTERPOLATION
61
C AVERAGE - PIXEL VALUES ARE AVERAGED, LINEAR INTERPOLATION
62
C WEIGHTED - PIXEL VALUES ARE WEIGHTD PROPORTIONALLY TO THE
63
C PROFI PERPENDICULAR TO THE DISPERSION DIRECTION
66
C EXTRACT/ORDER output = input width,angle,offset
67
C table coeffs [ord1,ord2]
68
C the connection file contains
70
C IN_B input table with coeffs
75
C ACTION T - table option
76
C B - batch order by order
81
C------------------------------------------------------------------
89
INTEGER MADRID, NAC, NAR, IMNO
91
INTEGER I,IAV,INDX,IORD,IORD1
92
INTEGER IORD2,ISTAT,NA,NAXISA,NAXISB
93
INTEGER NCOL,NPAR,NROW,NSORT
97
INTEGER STATUS,TID,INO,TMPID
98
INTEGER NPIXA(3),NPIXB(3),IPAR(10),KUN,KNUL
100
DOUBLE PRECISION STEPA(3),STEPB(3), STARTA(3),STARTB(3)
103
REAL XMIN,XMAX,XMIN1,XMAX1
106
DOUBLE PRECISION DPAR(100)
108
CHARACTER*72 IDENA,IDENB
109
CHARACTER*64 CUNITA,CUNITB,DESNAM
111
CHARACTER*60 FRMIN,FRMOUT,INA1,INA2
112
CHARACTER*60 TABLE,NAME,TYPE
114
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
115
COMMON /VMR/MADRID(1)
116
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
119
+ 'FLUX PIXEL ORDER'/
123
CALL STSPRO('ECHEXO')
124
CALL STKRDC('IN_A',1,1,60,I,INA1,KUN,KNUL,STATUS)
125
CALL STKRDC('IN_B',1,1,60,I,TABLE,KUN,KNUL,STATUS)
126
CALL STKRDC('IN_C',1,1,1,I,METH,KUN,KNUL,STATUS)
127
CALL STKRDC('OUT_A',1,1,60,I,INA2,KUN,KNUL,STATUS)
128
CALL STKRDC('INPUTC',1,1,60,I,NAME,KUN,KNUL,STATUS)
129
CALL STKRDR('INPUTR',1,3,I,RPAR,KUN,KNUL,STATUS)
130
CALL STKRDI('INPUTI',1,2,I,IPAR,KUN,KNUL,STATUS)
135
IF (METH(1:1) .EQ. 'l') METH = 'L'
136
IF (METH(1:1) .EQ. 'a') METH = 'A'
137
IF (METH(1:1) .EQ. 'm') METH = 'M'
139
C input parameters in table
141
CALL TBTOPN(TABLE,F_U_MODE,TID,STATUS)
142
CALL TBIGET(TID,NCOL,NROW,NSORT,NAC,NAR,STATUS)
146
CALL STIGET(FRMIN,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
147
. NDIM,NAXISA,NPIXA,STARTA,STEPA,IDENA,
148
+ CUNITA,PNTRA,IMNO,STATUS)
149
PARAMS(1) = RPAR(1)/ABS(STEPA(2))
151
PARAMS(3) = RPAR(3)/ABS(STEPA(2))
153
IF (METH(1:1) .EQ. 'M') THEN
154
NWDTH = PARAMS(1) + 2
155
CALL STFCRE('column',D_R4_FORMAT,F_X_MODE,1,NWDTH,TMPID,STATUS)
156
CALL STFMAP(TMPID,F_X_MODE,1,NWDTH,IAV,PNTRC,STATUS)
161
NAME = NAME(1:59)//' '
162
INDX = INDEX(NAME,' ') - 1
163
DESNAM = NAME(1:INDX)//'C'
164
CALL STDRDC(TID,DESNAM,1,17,4,IAV,TYPE,KUN,KNUL,ISTAT)
166
IF (TYPE.EQ.'MULT') THEN
167
DESNAM = NAME(1:INDX)//'I'
168
CALL STDRDI(TID,DESNAM,4,4,IAV,IPAR,KUN,KNUL,ISTAT)
169
NA = (IPAR(3)+1)* (IPAR(4)+1)
170
DESNAM = NAME(1:INDX)//'R'
171
CALL STDRDR(TID,DESNAM,1,4,IAV,PARAMS(4),KUN,KNUL,ISTAT)
172
DESNAM = NAME(1:INDX)//'D'
173
CALL STDRDD(TID,DESNAM,1,NA,IAV,DPAR,KUN,KNUL,ISTAT)
174
CALL TBTCLO(TID,STATUS)
178
IF (IORD1.EQ.IORD2 .AND. IORD1.EQ.0) THEN
182
STARTB(1) = STARTA(1)
189
NPIXB(2) = IORD2 - IORD1 + 1
190
CALL STIPUT(FRMOUT,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
191
+ NAXISB,NPIXB,STARTB,
192
+ STEPB,IDENB,CUNITB,PNTRB,INO,STATUS)
201
DO 10 I = IORD1,IORD2
206
IF (METH(1:1) .EQ. 'M') THEN
207
CALL EXTR2M(MADRID(PNTRA),NPIXA(1),NPIXA(2),
208
+ MADRID(PNTRB),NPIXB(1),NPIXB(2),MADRID(PNTRC),NWDTH,
209
+ IORD,NPAR,PARAMS,NA,DPAR,XMIN1,XMAX1,METH,
212
CALL EXTR1M(MADRID(PNTRA),NPIXA(1),NPIXA(2),
213
+ MADRID(PNTRB),NPIXB(1),NPIXB(2),
214
+ IORD,NPAR,PARAMS,NA,DPAR,XMIN1,XMAX1,METH,
218
XMIN = AMIN1(XMIN,XMIN1)
219
XMAX = AMAX1(XMAX,XMAX1)
222
CALL STTPUT(' Error in dispersion coefficients ')
226
C descriptor handling
234
CALL DSCUPT(IMNO,INO,' ',STATUS)
235
CALL STDWRR(INO,'LHCUTS',CUTS,1,6,KUN,STATUS)
239
C CALL STFCLO(INO,STATUS)
243
SUBROUTINE EXTR1M(IN,NPIXA1,NPIXA2,OUT,NB1,NB2,INDX,NPAR,PAR,ND,
244
+ DPAR,XMIN,XMAX,METH,STARTA,STEPA)
246
C EXTRACTION ROUTINE - BILINEAR INTERPOLATION
249
C IN REAL*4 INPUT IMAGE
250
C NPIXA1 INTG*4 NO. OF SAMPLES
251
C NPIXA2 INTG*4 NO. OF LINES
252
C OUT REAL*4 EXTRACTED ORDERS
253
C NB1 INTG*4 NO. OF SAMPLES
254
C NB2 INTG*4 NO. OF ORDERS
255
C INDX INTG*4 SEQUENTIAL NO. OF THE ORDER
256
C NPAR INTG*4 NO. OF EXTRACTION PARAMETERS
257
C PAR REAL*4 EXTRACTION PARAMETERS
258
C ND INTG*4 NO. OF COEFFS.
259
C DPAR REAL*8 COEFFS. TO DEFINE ORDER POSITION
260
C XMIN REAL*4 MINIMUM VALUE
261
C XMAX REAL*4 MAXIMUMVALUE
265
INTEGER NB1, NB2, NPAR, NPIXA1, NPIXA2, ND
266
INTEGER LOSLIT, HISLIT
267
INTEGER NWW, IWIDTH, IYLIM, NX, N1, N2, K, L, IX, INDX
268
INTEGER IX1, IP, L1, K1, IW
270
REAL OUT(NB1,NB2),PAR(NPAR)
271
REAL IN(NPIXA1,NPIXA2)
274
DOUBLE PRECISION DPAR(ND),STARTA(2),STEPA(2)
275
DOUBLE PRECISION XVAL,YVAL,AX
276
DOUBLE PRECISION WIDTH,SKEW,HWIDTH,OFFSET,DC
277
DOUBLE PRECISION YV,WW(50)
278
DOUBLE PRECISION SKWDX,SKWDY,SKWOF,SUM
279
DOUBLE PRECISION DEGREE,DD,DSIN,DCOS
280
DOUBLE PRECISION YLOW, YHIGH, WSUM
286
DOUBLE PRECISION IX_R8R8, XI_R8R8
288
C DEGREE = RAD / DEGREE
290
DATA DEGREE/0.017453292519943295769237D+0/
295
C ... define extraction constants
306
C OFFSET = PAR(3) - HWIDTH + 0.5
308
IF (SKEW.NE.0.0) THEN
310
SKWDX = -DSIN(DD) ! DX PER PIXEL
311
SKWDY = DCOS(DD) ! DY PER PIXEL
312
SKWOF = -SKWDX*HWIDTH ! 2D INTERPOLATION
316
IYLIM = NPIXA2 - IWIDTH
321
C ... get ordinate values
327
C ... loop over the samples
333
DO 100 IX = N2 + 1,NPIXA1
337
DO 50 IX1 = N1 + 1,N2
342
XVAL = IX_R8R8(AX,STARTA(1),STEPA(1))
344
C Computes position of the center of the slit from the coefficients of
345
C the bivariate polynomial stored in table order.
350
YVAL = YVAL + WW(IP)*DPAR(IP)
353
WW(IP) = WW(IP-1)*XVAL
354
YVAL = YVAL + WW(IP)*DPAR(IP)
359
C Corrects the central position for the offset
360
C OFFSET does not take into account HWIDTH
362
YVAL = XI_R8R8(YVAL,STARTA(2),STEPA(2)) + OFFSET
365
YHIGH = YVAL + HWIDTH
369
IF (LOSLIT.LT.1) LOSLIT = 1
370
IF (HISLIT.GT.NPIXA2) HISLIT = NPIXA2
376
IF (LOSLIT.EQ.HISLIT) THEN
377
SUM = (YHIGH-YLOW)*IN(IX,LOSLIT)
381
DO 40 IW = LOSLIT,HISLIT
383
IF (IW.EQ.LOSLIT) THEN
384
SUM = SUM + IN(IX,IW)*(LOSLIT+1.-YLOW)
386
ELSE IF (IW.EQ.HISLIT) THEN
387
SUM = SUM + IN(IX,IW)*(YHIGH-HISLIT)
390
SUM = SUM + IN(IX,IW)
399
IF (METH(1:1) .EQ. 'L') THEN ! Linear extraction
401
ELSE ! Average extraction
402
OUT(IX1,INDX) = SUM/WIDTH
404
XMIN = AMIN1(XMIN,OUT(IX1,INDX))
405
XMAX = AMAX1(XMAX,OUT(IX1,INDX))
415
SUBROUTINE EXTR2M(IN,NPIXA1,NPIXA2,OUT,NB1,NB2,COL,NWDTH,INDX,NPAR
416
$ ,PAR,ND,DPAR,XMIN,XMAX,METH,STARTA,STEPA)
418
C EXTRACTION ROUTINE - MEDIAN
421
C IN REAL*4 INPUT IMAGE
422
C NPIXA1 INTG*4 NO. OF SAMPLES
423
C NPIXA2 INTG*4 NO. OF LINES
424
C OUT REAL*4 EXTRACTED ORDERS
425
C NB1 INTG*4 NO. OF SAMPLES
426
C NB2 INTG*4 NO. OF ORDERS
427
C INDX INTG*4 SEQUENTIAL NO. OF THE ORDER
428
C NPAR INTG*4 NO. OF EXTRACTION PARAMETERS
429
C PAR REAL*4 EXTRACTION PARAMETERS
430
C ND INTG*4 NO. OF COEFFS.
431
C DPAR REAL*8 COEFFS. TO DEFINE ORDER POSITION
432
C XMIN REAL*4 MINIMUM VALUE
433
C XMAX REAL*4 MAXIMUMVALUE
437
INTEGER NB1, NB2, NPAR, NPIXA1, NPIXA2, NWDTH, NWDTH2, ND
438
INTEGER NWW, IWIDTH, IYLIM, NX, N1, N2, K, L, IX, INDX
439
INTEGER IX1, IP, L1, K1, IW
440
INTEGER LOSLIT, HISLIT
442
REAL OUT(NB1,NB2),PAR(NPAR)
443
REAL IN(NPIXA1,NPIXA2),COL(NWDTH)
444
REAL XMIN,XMAX,LIMITS(2)
446
DOUBLE PRECISION DPAR(ND),STARTA(2),STEPA(2)
447
DOUBLE PRECISION XVAL,YVAL,AX
448
DOUBLE PRECISION WIDTH,SKEW,HWIDTH,OFFSET,DC
449
DOUBLE PRECISION YV,WW(50)
450
DOUBLE PRECISION SKWDX,SKWDY,SKWOF,SUM
451
DOUBLE PRECISION DEGREE,DD,DSIN,DCOS
452
DOUBLE PRECISION YLOW, YHIGH, WSUM
453
DOUBLE PRECISION IX_R8R8, XI_R8R8
460
C DEGREE = RAD / DEGREE
462
DATA DEGREE/0.017453292519943295769237D+0/
468
C ... define extraction constants
480
C OFFSET = PAR(3) - HWIDTH + 0.5
482
IF (SKEW.NE.0.0) THEN
484
SKWDX = -DSIN(DD) ! DX PER PIXEL
485
SKWDY = DCOS(DD) ! DY PER PIXEL
486
SKWOF = -SKWDX*HWIDTH ! 2D INTERPOLATION
490
IYLIM = NPIXA2 - IWIDTH
495
C ... get ordinate values
501
C ... loop over the samples
507
DO 100 IX = N2 + 1,NPIXA1
511
DO 50 IX1 = N1 + 1,N2
516
XVAL = IX_R8R8(AX,STARTA(1),STEPA(1))
518
C Computes position of the center of the slit from the coefficients of
519
C the bivariate polynomial stored in table order.
524
YVAL = YVAL + WW(IP)*DPAR(IP)
527
WW(IP) = WW(IP-1)*XVAL
528
YVAL = YVAL + WW(IP)*DPAR(IP)
533
C Corrects the central position for the offset
534
C OFFSET does not take into account HWIDTH
536
YVAL = XI_R8R8(YVAL,STARTA(2),STEPA(2)) + OFFSET
539
YHIGH = YVAL + HWIDTH
543
IF (LOSLIT.LT.1) LOSLIT = 1
544
IF (HISLIT.GT.NPIXA2) HISLIT = NPIXA2
550
IF (LOSLIT.EQ.HISLIT) THEN
551
OUT(IX1,INDX) = IN(IX,LOSLIT)
554
DO 40 IW = LOSLIT,HISLIT
556
IF (IW.EQ.LOSLIT) THEN
557
COL(K1) = IN(IX,IW)!*(LOSLIT+1.-YLOW)
558
ELSE IF (IW.EQ.HISLIT) THEN
559
COL(K1) = IN(IX,IW)!*MIN(1.0,YHIGH-HISLIT)
563
40 CONTINUE !determine MEDIAN:
566
CALL GET_MEDIAN(COL,NWDTH,K1,L1,OUT(IX1,INDX),IW)
568
WRITE(OUTPUT,12345) IX1,INDX
576
XMIN = AMIN1(XMIN,OUT(IX1,INDX))
577
XMAX = AMAX1(XMAX,OUT(IX1,INDX))
583
12345 FORMAT('ERROR at ',I5,',',I5,' occurred')
587
SUBROUTINE GET_MEDIAN(RA,N,NUSE,LL,VALU,STATUS)
603
ELSE IF (NUSE.LE.2) THEN
606
c VALU = (RA(1) + RA(2))/2.0 !for ndim = 1,2, median is 1st elem.
610
VALU = RA(2) !for ndim = 3, median is 2nd elem.
615
CALL NSORT(RA,NUSE,LL,VALU)