1
C @(#)ccdillum.for 19.1 (ES0-DMD) 02/25/03 14:16:38
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===========================================================================
30
C++++++++++++++++++++++++++++++++++++++++++++++++++
31
C.IDENTIFICATION: ccdillum.FOR
32
C.KEYWORDS: box smoothing
33
C.PURPOSE: box smoothing with growing boxcar size
34
C.VERSION: 930810 RHW Creation
35
C--------------------------------------------------
47
CHARACTER*60 FRAMEA,FRAMEC
52
DOUBLE PRECISION START(2),STEP(2)
61
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
63
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
68
CALL STKRDC('IN_A',1,1,60,IAV,FRAMEA,KUN,KNUL,STATUS)
69
CALL STIGET(FRAMEA,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
70
1 2,NAXIS,NPIX,START,STEP,IDENT,CUNIT,
72
CALL STKRDC('OUT_A',1,1,60,IAV,FRAMEC,KUN,KNUL,STATUS)
73
CALL STIPUT(FRAMEC,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
74
1 NAXIS,NPIX,START,STEP,IDENT,CUNIT,PNTRC,
78
CALL STKRDR('XBOX',1,2,IAV,XBOX,KUN,KNUL,STATUS)
79
CALL STKRDR('YBOX',1,2,IAV,YBOX,KUN,KNUL,STATUS)
85
C *** check the smoothing boxes
86
IF (XBMINR.LT.1.) THEN
87
XBMINR = XBMINR*NPIX(1)
89
IF (XBMAXR.LT.1.) THEN
90
XBMAXR = XBMAXR*NPIX(1)
92
IF (YBMINR.LT.1.) THEN
93
YBMINR = YBMINR*NPIX(2)
95
IF (YBMAXR.LT.1.) THEN
96
YBMAXR = YBMAXR*NPIX(2)
99
XBMIN = INT(MAX(2,MIN(NPIX(1),NINT(MIN(XBMINR,XBMAXR)))))
100
XBMAX = INT(MAX(2,MIN(NPIX(1),NINT(MAX(XBMINR,XBMAXR)))))
101
YBMIN = INT(MAX(2,MIN(NPIX(2),NINT(MIN(YBMINR,YBMAXR)))))
102
YBMAX = INT(MAX(2,MIN(NPIX(2),NINT(MAX(YBMINR,YBMAXR)))))
104
C *** to clip or not to clip
105
CALL STKRDC('CLIP',1,1,3,IAV,ACTION,KUN,KNUL,STATUS)
106
CALL UPCAS(ACTION,ACTION)
107
IF (ACTION(1:1).EQ.'Y') THEN
108
CALL STKRDR('SIGMA',1,2,IAV,CLIP,KUN,KNUL,STATUS)
113
C *** test on clipping
114
IF (ACTION(1:1).EQ.'Y') THEN
115
CALL ILLUM(PNTRA,PNTRC,NPIX,XBMIN,XBMAX,YBMIN,YBMAX,
116
2 LOWSIG,HIGSIG,AVER)
118
CALL QILLUM(PNTRA,PNTRC,NPIX,XBMIN,XBMAX,YBMIN,YBMAX,AVER)
121
CALL STDCOP(IMNOA,IMNOC,1,' ',STATUS)
122
CALL STDWRR(IMNOC,'CCDMEAN',AVER,1,1,KUN,STATUS)
127
SUBROUTINE ILLUM(IN,OUT,NPIX,XBMIN,XBMAX,YBMIN,YBMAX,
134
INTEGER XBMIN,XBMAX,YBMIN,YBMAX
138
INTEGER LINEIN, LINEOUT
139
INTEGER IMNOS, IMNOG, IMNOP
140
INTEGER*8 IPOINT, PTRS, SUM, AVG, OUTPUT
142
INTEGER I, NITER, NREJ
153
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
155
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
158
C *** here create vitual memory
162
CALL STFCRE('dummsumm',D_R4_FORMAT,F_X_MODE,F_IMA_TYPE,
163
2 NCOLS,IMNOS,STAT) ! create sum array
164
CALL STFMAP(IMNOS,F_X_MODE,1,NCOLS,IAV,SUM,STAT)
166
CALL STFCRE('dummavg',D_R4_FORMAT,F_X_MODE,F_IMA_TYPE,
167
2 NCOLS,IMNOG,STAT) !create output array
168
CALL STFMAP(IMNOG,F_X_MODE,1,NCOLS,IAV,AVG,STAT)
171
CALL STFCRE('dummpntr',D_I4_FORMAT,F_X_MODE,F_IMA_TYPE,
172
2 YBMAX,IMNOP,STAT) ! create pointer array
173
CALL STFMAP(IMNOP,F_X_MODE,1,YBMAX,IAV,PTRS,STAT)
175
C *** now start the work
176
C IF (YBMAX.LT.NLINES) THEN
180
C *** accumulate the minimum y box
181
CALL ILLZER(MADRID(SUM),NCOLS) ! initialize sum array
183
C *** acumulate the minimum y box
186
IF (LINEIN.LT.YBMIN) THEN
188
IPOINT = IN + (LINEIN-1)*NCOLS
189
CALL ILLADD(MADRID(IPOINT),MADRID(SUM),MADRID(SUM),NCOLS)
190
PTR = PTRS + MOD(LINEIN,YBMAX)
195
C *** output the minimum y box
198
CALL AGBCAR(MADRID(SUM),MADRID(AVG),NCOLS,XBMIN,XBMAX,SCALE)
200
C *** Iteratively clean the initial lines
202
IF (YBOX2 .NE. YBMAX) THEN
208
DO LINEOUT = 1,LINEIN
209
IPOINT = MADRID(PTR+LINEOUT-1)
210
NREJ = NREJ + BXCLN(MADRID(IPOINT),MADRID(AVG),
211
2 MADRID(SUM),NCOLS,LOW,HIGH)
214
CALL AGBCAR(MADRID(SUM),MADRID(AVG),NCOLS,XBMIN,XBMAX,SCALE)
225
IF (LINEOUT.LT.YBOX2) THEN
226
LINEOUT = LINEOUT + 1
227
IPOINT = OUT + (LINEOUT-1)*NCOLS
228
CALL COPYF(MADRID(OUTPUT),MADRID(IPOINT),NCOLS)
231
MEAN = YBOX2*ILLSUM(MADRID(OUTPUT),NCOLS) ! calculate the MEAN
233
C *** increase the y box size by steps of 2 until the maximum szie.
235
IF (LINEIN.LT.YBMAX) THEN
237
IPOINT = IN + (LINEIN-1)*NCOLS
238
CALL ILLADD(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
239
PTR = PTRS + MOD(LINEIN,YBMAX)
243
NREJ = BXCLN(MADRID(IPOINT),MADRID(AVG),
244
2 MADRID(SUM),NCOLS,LOW,HIGH)
245
CALL AGBCAR(MADRID(SUM),MADRID(AVG),NCOLS,XBMIN,XBMAX,SCALE)
248
IPOINT = IN + (LINEIN-1)*NCOLS
249
CALL ILLADD(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
250
PTR = PTRS + MOD(LINEIN,YBMAX)
253
NREJ = BXCLN(MADRID(IPOINT),MADRID(AVG),MADRID(SUM),
256
CALL AGBCAR(MADRID(SUM),MADRID(AVG),NCOLS,XBMIN,XBMAX,SCALE)
258
LINEOUT = LINEOUT + 1
259
IPOINT = OUT + (LINEOUT-1)*NCOLS
260
CALL COPYF(MADRID(AVG),MADRID(IPOINT),NCOLS)
261
MEAN = MEAN + ILLSUM(MADRID(IPOINT),NCOLS) ! calculate MEAN
265
C *** for each line subtract the last line from the sum, add the
266
C next line to the sum, and output a line
268
IF (LINEIN.LT.NLINES) THEN
270
PTR = PTRS + MOD(LINEIN,YBMAX)
272
CALL ILLSUB(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
273
IPOINT = IN + (LINEIN-1)*NCOLS
274
CALL ILLADD(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
277
NREJ = BXCLN(MADRID(IPOINT),MADRID(AVG),MADRID(SUM),
280
LINEOUT = LINEOUT + 1
281
IPOINT = OUT + (LINEOUT-1)*NCOLS
282
CALL AGBCAR(MADRID(SUM),MADRID(AVG),NCOLS,XBMIN,XBMAX,SCALE)
283
CALL COPYF(MADRID(AVG),MADRID(IPOINT),NCOLS)
284
MEAN = MEAN + ILLSUM(MADRID(IPOINT),NCOLS) ! calculate the MEAN
288
C *** decrease the y box in steps of 2 until mimimum y box
290
IF (LINEOUT.LT.(NLINES-YBOX2)) THEN
292
PTR = PTRS + MOD(LINEIN,YBMAX)
294
CALL ILLSUB(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
296
PTR = PTRS + MOD(LINEIN,YBMAX)
298
CALL ILLSUB(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
301
LINEOUT = LINEOUT + 1
302
IPOINT = OUT + (LINEOUT-1)*NCOLS
303
CALL AGBCAR(MADRID(SUM),MADRID(IPOINT),NCOLS,XBMIN,XBMAX,SCALE)
304
MEAN = MEAN + ILLSUM(MADRID(IPOINT),NCOLS) ! calculate the MEAN
308
C *** output the last liens of the minimum y box size
309
CALL AGBCAR(MADRID(SUM),MADRID(AVG),NCOLS,XBMIN,XBMAX,SCALE)
311
IF (LINEOUT.LT.NLINES) THEN
312
LINEOUT = LINEOUT + 1
313
IPOINT = OUT + (LINEOUT-1)*NCOLS
314
CALL COPYF(MADRID(OUTPUT),MADRID(IPOINT),NCOLS)
318
C *** write the scaling vector
319
MEAN = MEAN + (NLINES-LINEOUT)*ILLSUM(MADRID(AVG),NCOLS)
320
MEAN = MEAN/(NCOLS*NLINES)
327
SUBROUTINE QILLUM(IN,OUT,NPIX,XBMIN,XBMAX,YBMIN,YBMAX,MEAN)
333
INTEGER XBMIN,XBMAX,YBMIN,YBMAX
336
INTEGER LINEIN, LINEOUT
337
INTEGER IMNOS, IMNOO, IMNOP
338
INTEGER IPOINT, PTRS, SUM, OUTPUT
348
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
350
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
352
C *** here create vitual memory
356
CALL STFCRE('dummsumm',D_R4_FORMAT,F_X_MODE,F_IMA_TYPE,
357
2 NCOLS,IMNOS,STAT) ! create sum array
358
CALL STFMAP(IMNOS,F_X_MODE,1,NCOLS,IAV,SUM,STAT)
360
CALL STFCRE('dummoutp',D_R4_FORMAT,F_X_MODE,F_IMA_TYPE,
361
2 NCOLS,IMNOO,STAT) !create output array
362
CALL STFMAP(IMNOO,F_X_MODE,1,NCOLS,IAV,OUTPUT,STAT)
364
CALL STFCRE('dummpntr',D_I4_FORMAT,F_X_MODE,F_IMA_TYPE,
365
2 YBMAX,IMNOP,STAT) ! create pointer array
366
CALL STFMAP(IMNOP,F_X_MODE,1,YBMAX,IAV,PTRS,STAT)
368
C *** now start the work
369
C IF (YBMAX.LT.NLINES) THEN
373
C *** accumulate the minimum y box
374
CALL ILLZER(MADRID(SUM),NCOLS) ! initialize sum array
376
C *** acumulate the minimum y box
379
IF (LINEIN.LT.YBMIN) THEN
381
IPOINT = IN + (LINEIN-1)*NCOLS
382
CALL ILLADD(MADRID(IPOINT),MADRID(SUM),MADRID(SUM),NCOLS)
383
PTR = PTRS + MOD(LINEIN,YBMAX)
388
C *** output the minimum y box
391
CALL AGBCAR(MADRID(SUM),MADRID(OUTPUT),NCOLS,XBMIN,XBMAX,SCALE)
394
IF (LINEOUT.LT.YBOX1) THEN
395
LINEOUT = LINEOUT + 1
396
IPOINT = OUT + (LINEOUT-1)*NCOLS
397
CALL COPYF(MADRID(OUTPUT),MADRID(IPOINT),NCOLS)
400
MEAN = YBOX1*ILLSUM(MADRID(OUTPUT),NCOLS) ! calculate the MEAN
402
C *** increase the y box size by steps of 2 until the maximum szie.
404
IF (LINEIN.LT.YBMAX) THEN
406
IPOINT = IN + (LINEIN-1)*NCOLS
407
CALL ILLADD(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
408
PTR = PTRS + MOD(LINEIN,YBMAX)
411
IPOINT = IN + (LINEIN-1)*NCOLS
412
CALL ILLADD(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
413
PTR = PTRS + MOD(LINEIN,YBMAX)
417
LINEOUT = LINEOUT + 1
418
IPOINT = OUT + (LINEOUT-1)*NCOLS
419
CALL AGBCAR(MADRID(SUM),MADRID(IPOINT),NCOLS,XBMIN,XBMAX,SCALE)
420
MEAN = MEAN + ILLSUM(MADRID(IPOINT),NCOLS) ! calculate MEAN
424
C *** for each line subtract the last line from the sum, add the
425
C next line to the sum, and output a line
427
IF (LINEIN.LT.NLINES) THEN
429
PTR = PTRS + MOD(LINEIN,YBMAX)
431
CALL ILLSUB(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
432
IPOINT = IN + (LINEIN-1)*NCOLS
433
CALL ILLADD(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
436
LINEOUT = LINEOUT + 1
437
IPOINT = OUT + (LINEOUT-1)*NCOLS
438
CALL AGBCAR(MADRID(SUM),MADRID(IPOINT),NCOLS,XBMIN,XBMAX,SCALE)
439
MEAN = MEAN + ILLSUM(MADRID(IPOINT),NCOLS) ! calculate the MEAN
443
C *** decrease the y box in steps of 2 until mimimum y box
445
IF (LINEOUT.LT.(NLINES-YBOX1)) THEN
447
PTR = PTRS + MOD(LINEIN,YBMAX)
449
CALL ILLSUB(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
451
PTR = PTRS + MOD(LINEIN,YBMAX)
453
CALL ILLSUB(MADRID(SUM),MADRID(IPOINT),MADRID(SUM),NCOLS)
455
LINEOUT = LINEOUT + 1
457
IPOINT = OUT + (LINEOUT-1)*NCOLS
458
CALL AGBCAR(MADRID(SUM),MADRID(IPOINT),NCOLS,XBMIN,XBMAX,SCALE)
459
MEAN = MEAN + ILLSUM(MADRID(IPOINT),NCOLS) ! calculate the MEAN
463
C *** output the last liens of the minimum y box size
464
CALL AGBCAR(MADRID(SUM),MADRID(OUTPUT),NCOLS,XBMIN,XBMAX,SCALE)
466
IF (LINEOUT.LT.NLINES) THEN
467
LINEOUT = LINEOUT + 1
468
IPOINT = OUT + (LINEOUT-1)*NCOLS
469
CALL COPYF(MADRID(OUTPUT),MADRID(IPOINT),NCOLS)
473
C *** write the scaling vector
474
MEAN = MEAN + (NLINES-LINEOUT)*ILLSUM(MADRID(OUTPUT),NCOLS)
475
MEAN = MEAN/(NCOLS*NLINES)
482
INTEGER FUNCTION BXCLN(DATA,BXAVG,SUM,NCOLS,LOW,HIGH)
484
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
485
C Reject data values from thr sum for the next boxcar average which
486
C exceed the minimum and maximum residual values from the current
487
C boxcar average. This excludes data from the moving avarge before it
488
C enters the average.
489
C-----------------------------------------------------------------------
501
REAL RMS,RESID,MINRES,MAXRES
505
RMS = RMS + (DATA(I)-BXAVG(1))**2
507
RMS = SQRT(RMS/NCOLS)
513
RESID = DATA(I)-BXAVG(I)
514
IF ((RESID.LT.MINRES) .OR. (RESID.GT.MAXRES)) THEN
516
SUM(I) = SUM(I)-RESID
527
SUBROUTINE ILLZER(A,NC)
542
SUBROUTINE ILLADD(A,B,C,NC)
557
SUBROUTINE ILLSUB(A,B,C,NC)
572
REAL FUNCTION ILLSUM(A,NC)
581
ILLSUM = ILLSUM + A(IC)
590
SUBROUTINE AGBCAR(INA,OUTA,NCOLS,XBMIN,XBMAX,YBOX)
592
C +++ Vector growing boxcar smooth. Taken from the IRAF CCD package
600
INTEGER COLIN, COLOUT, LASTCOL
608
IF (COLIN.LT.XBMIN) THEN
610
SUM = SUM + INA(COLIN)
618
IF (COLOUT.LT.XBMIN2) THEN
620
OUTA(COLOUT) = OUTPUT
625
IF (COLIN.LT.XBMAX) THEN
627
SUM = SUM + INA(COLIN)
629
SUM = SUM + INA(COLIN)
632
OUTA(COLOUT) = SUM/NPIX
638
IF (COLIN.LT.NCOLS) THEN
641
SUM = SUM + INA(COLIN) - INA(LASTCOL)
643
OUTA(COLOUT) = SUM/NPIX
648
IF (COLOUT.LT. NCOLS - XBMIN2) THEN
649
LASTCOL = LASTCOL + 1
650
SUM = SUM - INA(LASTCOL)
651
LASTCOL = LASTCOL + 1
652
SUM = SUM - INA(LASTCOL)
655
OUTA(COLOUT)= SUM/NPIX
661
IF (COLOUT.LT.NCOLS) THEN
663
OUTA(COLOUT) = OUTPUT