1
C @(#)spoext.for 19.1 (ES0-DMD) 02/25/03 14:25:24
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 @(#)spoext.for 19.1 (ESO) 02/25/03 14:25:24
30
C +++++++++++++++++++++++++++++++++++++++++++++++++++++++
31
C .COPYRIGHT (C) 1993 European Southern Observatory
33
C .AUTHORS Pascal Ballester (ESO/Garching)
34
C Cristian Levin (ESO/La Silla)
35
C .KEYWORDS Spectroscopy, Long-Slit
37
C .VERSION 1.0 Package Creation 17-MAR-1993
38
C -------------------------------------------------------
40
C @(#)spoext.for 4.2 (ESO-IPG) 11/20/92 14:47:36
46
C PROGRAM SPOEXT VERSION 1.0 880420
48
C Otmar Stahl Landessternwarte Heidelberg
49
C M. Peron , modif suggested by T. Oosterloo 900830
52
C SPECTRA, CCD, DATA EXTRACTION
56
C EXTRACT STELLAR SPECTRA FROM A CCD IMAGE. THE INDIVIDUAL ROWS OF
57
C THE CCD IMAGE WHICH CONTAIN THE FLUX ARE ADDED. THE WEIGHTS ARE
58
C CHOSEN SUCH THAT THE SUMMED SPECTRUM HAS THE OPTIMAL S/N-RATIO.
59
C COSMIC RAY HITS ARE LOCATED BY ANALYSING THE PROFILE PERPENDICULAR
60
C TO THE DISPERSION AND MASKED OUT.
64
C THE METHOD IS DESCRIBED IN DETAIL IN THE PAPER BY
65
C Keith Horne in PASP 98, pg. 609.
66
C THE MASK USED TO REMOVE THE COSMIC RAY HITS IS KEPT IN THE
67
C MASK FILE cosmics.bdf.
69
C EXTRACT/SPECTRUM output input sky order,iter read-out-noise,g,thresh
71
C OUT_A output spectrum
72
C IN_A input image (must be bias and dark subtracted
73
C (if relevant) and divided by a normalized flat
74
C field, not sky subtracted)
75
C IN_B sky image (normally derived from IN_A in advance)
76
C INPUTI fit order for the polynomials, number of
77
C iterations for cosmic ray removal
78
C INPUTR read-out-noise, conversion factor (e/ADU),
79
C threshold for cosmic ray removal
82
CHARACTER*60 INFR,SKYFR,OUTFR
83
CHARACTER CUNIT*64,IDENT*72
84
CHARACTER CUNITS*64,IDENTS*72
86
INTEGER NPIX(2),MPIX(2),IFIT(2),NUM
87
INTEGER IAV,ISTAT,NAXIS
88
INTEGER*8 IPNTRA,IPNTRB,IPNTRC
90
INTEGER*8 IPNTR1,IPNTR2,IPNTR3,IPNTR4,IPNTR5,IPNTR6
91
INTEGER KUN,KNUL,IDI,IDS,IDO,MADRID,IDM,ISS
93
DOUBLE PRECISION START(2),STEP(2),STARTS(2),STEPS(2)
94
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
96
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
100
C get input and map images
102
CALL STKRDC('IN_A', 1,1,60,IAV,INFR,KUN,KNUL,ISTAT)
103
CALL STKRDC('IN_B', 1,1,60,IAV,SKYFR,KUN,KNUL,ISTAT)
104
CALL STKRDC('OUT_A', 1,1,60,IAV,OUTFR,KUN,KNUL,ISTAT)
105
CALL STKRDI('PUTI',1,2,IAV,IFIT,KUN,KNUL,ISTAT)
106
CALL STKRDR('PUTR',1,3,IAV,CCD,KUN,KNUL,ISTAT)
108
CALL STIGET(INFR,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
109
.2,NAXIS,NPIX,START,STEP,IDENT,CUNIT,IPNTR1,IDI,ISTAT)
111
CALL STIGET(SKYFR,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
112
.2,NAXIS,MPIX,STARTS,STEPS,IDENTS,CUNITS,IPNTR6,IDS,ISTAT)
114
IF ((MPIX(1).NE.NPIX(1)).OR.(MPIX(2).NE.NPIX(2))) THEN
116
100 FORMAT('OBJECT AND SKY FRS TO NOT MATCH')
117
CALL STTPUT(OUTPUT,ISTAT)
121
CALL STIPUT(OUTFR,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
122
.1,NPIX(1),START(1),STEP(1),IDENT,CUNIT,IPNTR2,IDO,ISTAT)
124
CALL STIPUT('cosmics',D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
125
.NAXIS,NPIX,START,STEP,IDENT,CUNIT,IPNTR3,IDM,ISTAT)
127
C reserve space for arrays
129
NUM = NPIX(1)*NPIX(2)*4
131
CALL TDMGET(NUM,IPNTR4,ISS)
132
CALL TDMGET(NUM,IPNTR5,ISS)
133
CALL TDMGET(NBYTES,IPNTRA,ISS)
134
CALL TDMGET(NBYTES,IPNTRB,ISS)
135
CALL TDMGET(NBYTES,IPNTRC,ISS)
139
CALL XTRACT (MADRID(IPNTR1),MADRID(IPNTR2),MADRID(IPNTR3),
140
&MADRID(IPNTR4),MADRID(IPNTR5),MADRID(IPNTR6),MADRID(IPNTRA),
141
&MADRID(IPNTRB),MADRID(IPNTRC),NPIX,IFIT,CCD)
145
C CALL COPYDSC_ST(INFR,OUTFR,4,'HISTORY',ISTAT)
147
CALL TDMFRE(NUM,IPNTR4,ISS)
148
CALL TDMFRE(NUM,IPNTR5,ISS)
149
CALL TDMFRE(NBYTES,IPNTRA,ISS)
150
CALL TDMFRE(NBYTES,IPNTRB,ISS)
151
CALL TDMFRE(NBYTES,IPNTRC,ISS)
155
C**************************************************************************
156
SUBROUTINE XTRACT(IN,OUT,MASK,PROF,VARI,SKY,X,Y,Z,NPIX,IFIT,CCD)
158
C THIS ROUTINE DOES THE EXTRACTION OF THE SPECTRUM
161
C INTEGER MASK(1) ! DECLARED AS INTEGER*2 !!!
162
REAL MASK(1) ! DECLARED AS INTEGER*2 !!!
163
INTEGER NPIX(2),IFIT(2)
164
INTEGER J,K,KK,L,II,M,N,IORD,ITER,IWIND
165
REAL IN(1),OUT(1),PROF(1),VARI(1),SKY(1)
166
REAL A(10),B(10),S(10),W(10)
167
REAL RON,G,SIGMA,V0,SUM,CHISQ,YY,DIFF,DIFF2,QUOT
169
REAL X(1),Y(1),Z(1),CCD(3)
185
C EXTRACT INITIAL SPECTRUM (JUST THE SUM) AND SET mask TO 1
192
SUM = SUM+IN(II)-SKY(II)
198
C COMPUTE SPATIAL PROFILE, I.E. THE 2-DIM SPECTRUM
199
C IS DIVIDED (ROW BY ROW) BY THE SUM
204
IF (OUT(J).EQ.0) OUT(J)=1
205
PROF(II) = (IN(II)-SKY(II))/OUT(J)
209
C FILTER SPATIAL PROFILE AND FIT WITH POLYNOMIAL
217
C MEDIAN FILTER OF ROWS
219
CALL FILTER(Y,Z,M,IWIND)
221
C FIT WITH POLYNOMIAL
223
CALL LSORTH(X,Y,A,B,S,W,M,CHISQ,IORD)
226
CALL POLY(X(J),YY,A,B,S,W,IORD)
231
C NORMALIZE SPATIAL PROFILE AND ENFORCE POSITIVITY
237
IF(PROF(II).LT.0.) PROF(II)=0.
242
PROF(II) = PROF(II)/SUM
246
C ITERATE (in the present version, the spatial profile is not
247
C iterated, but only the mask and the variance)
251
C compute variance estimate
256
VARI(II) = V0 + ABS(OUT(J)*PROF(II)+SKY(II))/G
260
C MASK COSMIC RAY HITS (ONLY ONE PER COLUMN AND ITERATION)
267
DIFF = IN(II)-SKY(II)-OUT(J)*PROF(II)
269
QUOT = (DIFF2/(SIGMA*VARI(II)))*MASK(II)
270
IF(QUOT.GT.RMAX) THEN
280
C COMPUTE WEIGHTED MEAN WITH COSMICS MASKED
286
SUM1 = SUM1 + (MASK(II)*PROF(II)*(IN(II)-SKY(II)))/VARI(II)
287
SUM2 = SUM2 + (MASK(II)*PROF(II)*PROF(II)) /VARI(II)
296
C****************************************************************************
297
SUBROUTINE FILTER(ARR,Z,M,IWIND)
300
INTEGER II,IWIND,J,M,K
301
REAL ARR(1),Z(1),Y(50),XMED
305
C SORT DATA IN ARRAY X AND CALL MEDIAN FILTER
307
DO 20 J = IWIND+1,M-IWIND
309
Y(K) = ARR(J+K-IWIND-1)
312
CALL MDIAN1(Y,II,XMED)
319
DO 30 J = IWIND+1,M-IWIND
326
C**************************************************************************
327
SUBROUTINE MDIAN1(ARR,N,XMED)
329
C COMPUTE MEDIAN VALUE OF AN ARRAY
343
XMED = 0.5*(ARR(N2)+ARR(N2+1))
351
C************************************************************************
352
SUBROUTINE SORT(N,ARR)
363
IF(ARR(I).LE.A) GOTO 10
373
C*****************************************************************************
374
C POLY : INPUT: XFIT AND POLYNOMIAL COEFFICIENTS COMPUTED
378
SUBROUTINE POLY(XFIT,YFIT,A,B,S,W,IORD)
382
REAL A(10),B(10),S(10),W(10),P(10)
392
P(K)=(XFIT-A(K-1))*(P(K-1))-B(K-1)*P(K-2)
398
C***************************************************************************
399
C LSORTH : FITS ORTHOGONAL POLYNOMIAL OF MAXIMUM DEGREE IORD
400
C THROUGH X-Y TABLE. AN F-TEST DECIDES WHETHER THE FIT
401
C STOPS ALREADY AT A LOWER ORDER THAN IORD.
402
C THE ARRAY Y IS RETURNED AS A VECTOR
403
C CONTAINING THE RESIDUALS.
404
C THE ROUTINE IS DESCRIBED IN PASP 91 (1979), PG. 546.
406
C THE POLYNOMIAL COEFFICIENTS ARE RETURNED
408
SUBROUTINE LSORTH (X,Y,A,B,S,W,M,CHISQ,IORD)
411
INTEGER IMAX,IMAXST,IFAUTO,IORD,I,N,M,I1,IFF,K,K1
413
REAL X(1),Y(1),A(10),B(10),S(10),W(10),P(10)
414
REAL CHISQ,DEL,XNU,F,F95,DCHI,P2
416
DATA IMAXST/10/,IFTEST/2/
419
IF(IORD .LT. 10) GOTO 110
423
IF(IORD .NE. 0) IMAX=MAX0(IABS(IORD)+1,2)
440
IF(IMAX .GT. I) I = I+1
447
50 P(K)=(X(N)-A(K1))*P(K1)-B(K1)*P(K-2)
448
60 DEL=Y(N)-S(I1)*P(I1)
451
IF(IMAX .LE. I1) GOTO 70
457
IF(IMAX .LE. I1) GOTO 80
463
IF(DCHI .GE. CHISQ) GOTO 30
464
F=XNU*DCHI/(CHISQ-DCHI)
465
F95=3.84+(10.+(12.+(30.+105./XNU/XNU)/XNU)/XNU)/XNU
466
IF(F .GT. F95) GOTO 30
467
IF(IFAUTO.EQ.0) GOTO 30 ! F-TEST OFF
471
IF(IFF .LE. IFTEST) GOTO 40
472
80 IORD=MIN0(IMAX-1,I1)-IFF+1