1
C @(#)rcosmic.for 13.1.1.1 (ES0-DMD) 06/02/98 18:17:32
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,
32
C.IDENTIFICATION: RCOSMIC
33
C.PURPOSE: Remove cosmic ray events on single ccd exposure and replace
34
C them by interpolation on neighbourhood pixels.
35
C.LANGUAGE: F77+ESOext
36
C.AUTHOR: P.Magain, M.Remy, Institut d'Astrophysique de Liege
37
C.INPUT/OUTPUT: IN_A/C/1/60 = Input frame.
38
C IN_B/C/1/60 = median filter of the input frame
39
C OUT_B/C/1/12 = Output frame.
40
C PARAMS/R/1/1 = Mean value of the background.
41
C PARAMS/R/2/1 = Readout noise in ADU units.
42
C PARAMS/R/3/1 = Inverse gain factor (e-/ADU).
43
C VERSION 1.2 New ST interfaces M.Peron 221191
44
C VERSION 1.3 remove limitation of size, suggestion from Hans Schwengeler
45
C ----------------------------------------------------------------------------
48
INTEGER*4 STATUS,MADRID,SIZEX,IOMODE
49
INTEGER*4 NAXIS,NPIX(2),IMNI,IMNO,IMNF,IMNC
50
INTEGER*8 PNTRI,PNTRF,PNTRO,PNTRC
52
CHARACTER*60 IMAGE,OBJET,COSMIC
53
CHARACTER*72 IDENT1,IDENT2,IDENT3
55
DOUBLE PRECISION START(2),STEP(2)
56
REAL*4 SKY,GAIN,RON,NS,RC,PARAM(5),CUTS(2)
57
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
59
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
62
DATA IDENT3 /'cosmic ray mask '/
64
CALL STSPRO('RCOSMIC')
65
CALL STKRDC('IN_A',1,1,60,IAV,IMAGE,KUN,KNUL,STATUS)
66
CALL STIGET(IMAGE,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
67
1 2,NAXIS,NPIX,START,STEP
68
1 ,IDENT1,CUNIT,PNTRI,IMNI,STATUS)
70
CALL STKRDR('PARAMS',1,5,IAV,PARAM,KUN,KNUL,STATUS)
71
CALL STIGET('middumma',D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
72
1 2,NAXIS,NPIX,START,STEP
73
1 ,IDENT2,CUNIT,PNTRF,IMNF,STATUS)
79
CALL STKRDC('OUTIMA',1,1,60,IAV,OBJET,KUN,KNUL,STATUS)
80
CALL STIPUT(OBJET,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
81
1 NAXIS,NPIX,START,STEP
82
1 ,IDENT1,CUNIT,PNTRO,IMNO,STATUS)
88
CALL STKRDC('COSMIC',1,1,60,IAV,COSMIC,KUN,KNUL,STATUS)
89
IF (COSMIC(1:1).EQ.'+') THEN
90
COSMIC = 'dummy_frame'
95
CALL STIPUT(COSMIC,D_I2_FORMAT,IOMODE,F_IMA_TYPE
96
1 ,NAXIS,NPIX,START,STEP
97
1 ,IDENT3,CUNIT,PNTRC,IMNC,STATUS)
98
CALL COSROUT(MADRID(PNTRI),MADRID(PNTRC),NPIX(1),NPIX(2),
100
1 ,MADRID(PNTRF),MADRID(PNTRO))
104
IF (IOMODE.EQ.F_O_MODE)
105
+ CALL STDWRR(IMNC,'LHCUTS',CUTS,1,2,KUN,STATUS)
106
CALL DSCUPT(IMNI,IMNO,' ',STATUS)
109
SUBROUTINE COSROUT(AI,COSMIC,I_IMA,J_IMA,RON,GAIN,
111
INTEGER I_IMA,J_IMA,NUM
114
INTEGER IDUMAX,JDUMAX,I1,I2,J1,II,JJ
115
INTEGER I,J,IMAX,JMAX,IMIN,JMIN
116
INTEGER FIRST(2),NEXT(2)
117
INTEGER*2 COSMIC(I_IMA,J_IMA)
118
REAL*4 VECTEUR(10000),FMAX,ASUM,RC
119
REAL*4 AI(I_IMA,J_IMA),AO(I_IMA,J_IMA),AM(I_IMA,J_IMA)
120
REAL*4 SIGMA,SKY,S1,S2
121
REAL*4 RON,GAIN,NS,AMEDIAN
129
C La boucle suivante selectionne les pixels qui sont
130
C significativement au dessus de l'image filtree medianement.
133
C COSMIC =-1 ----> candidate for cosmic
134
C = 0 ----> not a cosmic
135
C = 1 -----> a cosmic (at the end)
136
C = 2 ----> member of the group
137
C = 3 ----> member of a group which has been examined
138
C = 4 ----> neighbourhood of the group
142
SIGMA=SQRT(RON**2+AM(I,J)/GAIN)
143
IF ((AI(I,J)-AM(I,J)).GE.(NS*SIGMA)) THEN
150
C ------------------------
155
C Ces pixels sont regroupes par ensembles connexes dans la boucle
158
C -----------------------------
161
100 CALL FINDNEXT(COSMIC,I_IMA,J_IMA,FIRST,NEXT)
162
IF (NEXT(1).EQ.-1) RETURN
180
IF (COSMIC(II,JJ).EQ.-1) THEN
188
IF (AI(II,JJ).GT.FMAX) THEN
193
ELSE IF (COSMIC(II,JJ).EQ.0) THEN
206
IF (COSMIC(K,L).EQ.2) THEN
215
C We start here the real work....
216
C 1- decide if the pixel's group is a cosmic
217
C 2-replace these values by another one
219
S1 = AI(IDUMAX-1,JDUMAX-1) + AI(IDUMAX+1,JDUMAX-1)
220
+ + AI(IDUMAX,JDUMAX-1) +AI(IDUMAX,JDUMAX+1)
221
S2 = AI(IDUMAX-1,JDUMAX+1) + AI(IDUMAX+1,JDUMAX+1)
222
+ + AI(IDUMAX-1,JDUMAX) + AI(IDUMAX+1,JDUMAX)
223
ASUM = (S1+S2)/8.-SKY
224
IF ((FMAX-SKY).GT.RC*ASUM) THEN
228
IF (COSMIC(K,L).EQ.4) THEN
229
VECTEUR(NUM) = AI(K,L)
234
CALL SORT(NUM-1,VECTEUR,ORD)
235
AMEDIAN = VECTEUR(ORD((NUM-1)/2))
238
IF (COSMIC(K,L).EQ.3) THEN
241
ELSE IF (COSMIC(K,L).EQ.4) THEN
249
IF (COSMIC(K,L).NE.-1) COSMIC(K,L) = 0
256
IF (NEXT(1).GT.0) GOTO 100
263
SUBROUTINE FINDNEXT(COSMIC,I_IMA,J_IMA,FIRST,NEXT)
264
INTEGER I_IMA,J_IMA,FIRST(2),NEXT(2)
266
INTEGER*2 COSMIC(I_IMA,J_IMA)
267
DO J = FIRST(2), J_IMA
269
IF (COSMIC(I,J).EQ.-1) THEN
281
SUBROUTINE SORT(KMAX,INP,ORD)
282
INTEGER KMAX,IMIN,IMAX,I,J,K,L
288
IF (INP(1).GT.INP(2)) THEN
295
IF (INP(L).LE.F) GO TO 4400
298
IF (F.LE.INP(L)) GO TO 4250
302
IF (INP(L).LT.F) THEN
307
IF (IMAX.GT.(IMIN+1)) GO TO 4200
309
4250 DO 4300 K=J-1,IMIN,-1