1
C===========================================================================
2
C Copyright (C) 1995-2008 European Southern Observatory (ESO)
4
C This program is free software; you can redistribute it and/or
5
C modify it under the terms of the GNU General Public License as
6
C published by the Free Software Foundation; either version 2 of
7
C the License, or (at your option) any later version.
9
C This program is distributed in the hope that it will be useful,
10
C but WITHOUT ANY WARRANTY; without even the implied warranty of
11
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
C GNU General Public License for more details.
14
C You should have received a copy of the GNU General Public
15
C License along with this program; if not, write to the Free
16
C Software Foundation, Inc., 675 Massachusetts Ave, Cambridge,
19
C Correspondence concerning ESO-MIDAS should be addressed as follows:
20
C Internet e-mail: midas@eso.org
21
C Postal address: European Southern Observatory
22
C Data Management Division
23
C Karl-Schwarzschild-Strasse 2
24
C D 85748 Garching bei Muenchen
26
C===========================================================================
28
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
30
C.COPYRIGHT: Copyright (c) 1987 European Southern Observatory,
33
C.VERSION: 1.0 ESO-FORTRAN Conversion, AA 22:26 - 3 DEC 1987
35
C.LANGUAGE: F77+ESOext
46
C 910128 P. Ballester Define and set variables for mmake -i
47
C 991005 S.Wolf ECHMR2O added: does an optimal merging.
51
C ECHELLE, CASPEC, ORDER MERGING
55
C OBTAIN A 1D FRM CALIBRATED IN WAVELENGTHS FROM A 2D FRM
56
C SAMPLED IN THE SPACE WAVELENGTH-ORDER.
60
C OVERLAPPING REGIONS OF CONSECUTIVE ORDERS ARE PROCESSED IN TWO WAYS:
61
C - CONCATENATION OF CONSECUTIVE ORDERS, USING THE MIDDLE POINT AS
62
C CONCATENATING POSITION (METHOD='CONCATENATE', DEFAULT)
63
C - AVERAGE OF OVERLAPPING REGION (METHOD='AVERAGE')
64
C - WEIGHTED AVERAGE OF OVERLAPPING REGION (METHOD='OPTIMAL')
65
C spmerged = (w1*sp1 + w2*sp2)/(w1+w2)
66
C - NO MERGING. INDIVIDUAL ORDERS ARE WRITTEN IN DIFFERENT FILES
67
C (METHOD = 'NOMERGE')
68
C - WEIGHTED AVERAGE. WEIGHTS PROPORTIONAL TO SINC**2 (METHOD='SINC')
69
C THE METHOD 'NOMERGE' WILL PRODUCE AS MANY FILES AS DEFINED ORDERS
70
C WITH NAMES xxxyyyy, xxxx IS THE OUTPUT FILE NAME, yyyy IS THE
75
C MERGE/ECHELLE INPUT OUTPUT [CONC]
76
C MERGE/ECHELLE INPUT OUTPUT ORD1,ORD2 NOCONCAT
77
C MERGE/ECHELLE INPUT OUTPUT DELTA AVERAGE
78
C MERGE/ECHELLE INPUT OUTPUT DELTA OPTIMAL WEIGHTS
80
C MERGE/ECHELLE INPUT OUTPUT TABLE SINC
84
C------------------------------------------------------------------------
91
INTEGER I, II1, II2, IORD1
94
INTEGER NAXISA, NAXISB, NAXISW
95
INTEGER NPIXA(3),NPIXB(3),NPIXW(3),NPTOT(100),ICOL(3),KUN,KNUL
96
INTEGER INIMA, OUTIMA, VARIMA, WGTIMA, TID
98
INTEGER*8 IPNTRA, IPNTRB, IPNTRV, IPNTRW !pointers ...
100
DOUBLE PRECISION DEL, WEND, WINIT, WSTEP
101
DOUBLE PRECISION WSTART(100)
102
DOUBLE PRECISION STARTA(3),STEPA(3)
103
DOUBLE PRECISION STARTB(3),STEPB(3)
104
DOUBLE PRECISION STARTW(3),STEPW(3)
106
REAL CUT(4),XMIN,XMAX,WRANGE(2),VAL(3),K(100),A(100)
109
CHARACTER*60 INFRM, OUTFRM, VARFRM, WGTFRM
110
CHARACTER OUTFIL*12,TABLE*12
111
CHARACTER METHOD*1,WS*5
112
CHARACTER IDENTA*72,IDENTB*72,CUNITA*64,CUNITB*64
113
CHARACTER IDENTW*72,CUNITW*64
114
CHARACTER*16 LABEL(3)
118
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
119
COMMON /VMR/MADRID(1)
120
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
122
DATA CUNITB/'FLUX WAVELENGTH'/
123
DATA LABEL(1)/'ORDER'/,LABEL(2)/'KFIT'/,LABEL(3)/'AFIT'/
125
C ... INITIALIZE SYSTEM
127
CALL STSPRO('ECHMRG')
132
CALL STKRDC('P1',1,1,60,I,INFRM,KUN,KNUL,ISTAT)
133
CALL STKRDC('P2',1,1,60,I,OUTFRM,KUN,KNUL,ISTAT)
134
CALL STKRDC('P6',1,1,60,I,VARFRM,KUN,KNUL,ISTAT)
135
CALL STKRDC('P5',1,1,60,I,WGTFRM,KUN,KNUL,ISTAT)
136
CALL CLNFRA(INFRM,INFRM,0)
137
CALL CLNFRA(OUTFRM,OUTFRM,0)
138
CALL CLNFRA(VARFRM,VARFRM,0)
139
CALL CLNFRA(WGTFRM,WGTFRM,0)
140
CALL STKRDC('P4',1,1,1,I,METHOD,KUN,KNUL,ISTAT)
141
CALL FORUPC(METHOD,METHOD)
143
. CALL STKRDC('P3',1,1,8,I,TABLE,KUN,KNUL,ISTAT)
144
CALL STKRDR('INPUTR',1,2,I,WRANGE,KUN,KNUL,ISTAT)
145
IF (METHOD.EQ.'A' .OR. METHOD.EQ.'O') THEN
156
CALL STIGET(INFRM,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
157
. 3,NAXISA,NPIXA,STARTA,STEPA,IDENTA,CUNITA,
158
. IPNTRA,INIMA,ISTAT)
159
CALL STDRDD(INIMA,'WSTART',1,NPIXA(2),I,
160
. WSTART,KUN,KNUL,ISTAT)
161
CALL STDRDI(INIMA,'NPTOT',1,NPIXA(2),I,NPTOT,
163
C ... CHECK IF NPTOT(NPIXA(2)) IS 0
164
IF (NPTOT(NPIXA(2)).EQ.0) THEN
165
NPIXA(2) = NPIXA(2) - 1
171
IF (METHOD.EQ.'O') THEN
172
CALL STIGET(WGTFRM,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
173
. 3,NAXISW,NPIXW,STARTW,STEPW,IDENTW,CUNITW,
174
. IPNTRW,WGTIMA,ISTAT)
175
IF (NAXISW.NE.NAXISA.OR.
176
. STARTW(1).NE.STARTA(1).OR.STARTW(2).NE.STARTA(2).OR.
177
. STEPW(1).NE.STEPA(1).OR.STEPW(1).NE.STEPA(1)) THEN
181
IF (METHOD.EQ.'N') THEN
183
C ... NO MERGE - PRODUCE ONE FILE PER ORDER
185
IF (WINIT.EQ.WEND .AND. WINIT.LT.0.5) THEN
189
IORD1 = MAX(NINT(WINIT),1)
190
IORD2 = MIN(NINT(WEND),NPIXA(2))
192
OUTFRM = OUTFRM(1:59)//' '
193
II1 = INDEX(OUTFRM,' ') - 1
195
OUTFIL = OUTFRM(1:II1)
196
DO 10 I = IORD1,IORD2
199
OUTFIL(II1+1:II1+4) = WS(2:5)
203
STARTB(1) = WSTART(I)
207
WRITE (IDENTB,9010) I
208
IDENTB(11:72) = IDENTA(1:62)
209
CALL STIPUT(OUTFIL,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
210
. NAXISB,NPIXB,STARTB,STEPB,
211
. IDENTB,CUNITB,IPNTRB,OUTIMA,ISTAT)
212
CALL COPY(MADRID(IPNTRA),NPIXA(1),NPIXA(2),MADRID(IPNTRB),
213
. NPIXB(1),I,XMIN,XMAX)
218
CALL DSCUPT(INIMA,OUTIMA,' ',ISTAT)
219
CALL STDWRR(OUTIMA,'LHCUTS',CUT,1,4,KUN,ISTAT)
220
CALL STFCLO(OUTIMA,ISTAT)
221
CALL STTPUT('File '//OUTFIL//' created ...',ISTAT)
226
C ... MAP OUTPUT FRAME
228
IF (WINIT.EQ.WEND) THEN
230
WEND = WSTART(NPIXA(2)) + (NPTOT(NPIXA(2))-1)*WSTEP
233
NPIXB(1) = (WEND-WINIT)/WSTEP + 1
239
CALL STIPUT(OUTFRM,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
240
. NAXISB,NPIXB,STARTB,STEPB,
241
. IDENTA,CUNITB,IPNTRB,OUTIMA,ISTAT)
243
C ... METHODS OF OVERLAPPING
245
IF (METHOD.EQ.'C') CALL ECHMR1(MADRID(IPNTRA),
247
+ STEPA,WSTART,NPTOT,MADRID(IPNTRB),
248
+ NPIXB,STARTB,XMIN,XMAX)
249
IF (METHOD.EQ.'A') CALL ECHMR2(MADRID(IPNTRA),
251
+ STEPA,WSTART,NPTOT,MADRID(IPNTRB),
252
+ NPIXB,STARTB,XMIN,XMAX,DEL)
253
IF (METHOD.EQ.'O') THEN
254
CALL STIPUT(VARFRM,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
255
. NAXISB,NPIXB,STARTB,STEPB,
256
. IDENTA,CUNITB,IPNTRV,VARIMA,ISTAT)
257
CALL ECHMR2O(MADRID(IPNTRA),MADRID(IPNTRW),
259
+ STEPA,WSTART,NPTOT,MADRID(IPNTRB),MADRID(IPNTRV),
260
+ NPIXB,STARTB,XMIN,XMAX,DEL)
261
CALL DSCUPT(INIMA,VARIMA,' ',ISTAT)
264
IF (METHOD.EQ.'S') THEN
266
C ... READ RIPPLE TABLE
268
CALL TBTOPN(TABLE,F_IO_MODE,TID,ISTAT)
269
CALL TBLSER(TID,LABEL(1),ICOL(1),ISTAT)
270
CALL TBLSER(TID,LABEL(2),ICOL(2),ISTAT)
271
CALL TBLSER(TID,LABEL(3),ICOL(3),ISTAT)
273
CALL TBRRDR(TID,I,3,ICOL,VAL,NULL,ISTAT)
278
CALL ECHMR3(MADRID(IPNTRA),
279
+ NPIXA(1),NPIXA(2),STEPA,WSTART,
280
+ NPTOT,MADRID(IPNTRB),NPIXB,STARTB,XMIN,XMAX,
284
C ... WRITE PROCESS DESCRIPTORS
290
CALL DSCUPT(INIMA,OUTIMA,' ',ISTAT)
291
CALL STDWRR(OUTIMA,'LHCUTS',CUT,1,4,KUN,ISTAT)
294
9998 CALL STTPUT('Error: Bad weight map! ',ISTAT)
296
+ ('(START, STEP and NAXIS same as in INPUT frame !?)',ISTAT)
299
9010 FORMAT ('ORDER:',I3)
302
SUBROUTINE ECHMR1(X,NPIXA1,NPIXA2,STEPA,WI,NP,Y,NY,YSTR,
305
C MERGE THE ORDERS, USING SIMPLE CONCATENATION IN THE MIDDLE POINT
308
INTEGER NY,J2,I,J1,JOFF,J,JJ
309
INTEGER NPIXA1,NPIXA2
312
DOUBLE PRECISION STEPA(2),WI(NPIXA2),YSTR
314
REAL X(NPIXA1,NPIXA2)
315
REAL XMIN,XMAX,RVAL,WEN1,WST2,WSTART
318
DOUBLE PRECISION WEND, YSTEP, YEND, WSTR
326
YEND = YSTR + (NY-1)*YSTEP
328
C ... ITERATION ON ORDERS
332
WSTR = DMAX1(WI(I),WEND+YSTEP)
333
IF (I.EQ.NPIXA2) THEN
334
WEND = WI(I) + (NP(I)-1)*YSTEP
336
WEN1 = WI(I) + (NP(I)-1)*YSTEP
338
IF (WST2.LT.WEN1) THEN
339
WEND = 0.5* (WEN1+WST2)
345
IF (WSTR.GE.YEND) RETURN
346
IF (WEND.GT.YSTR) THEN
348
C ... ITERATION ON WAVELENGTHS
350
WSTART = DMAX1(YSTR,WSTR)
351
WEND = DMIN1(WEND,YEND)
352
J1 = NINT((WSTART-WI(I))/YSTEP) + 1
353
J2 = NINT((WEND-WI(I))/YSTEP) + 1
354
JOFF = NINT((WI(I)-YSTR)/YSTEP)
359
IF (RVAL .GT. XMAX) XMAX = RVAL
360
IF (RVAL .LT. XMIN) XMIN = RVAL
372
SUBROUTINE ECHMR2(X,NPIXA1,NPIXA2,STEPA,WI,NP,Y,NY,YSTR,
375
C MERGE THE ORDERS, AVERAGE ON THE OVERLAPPING REGION
379
INTEGER NPIXA1, NPIXA2, NY
381
INTEGER IORD1, IORD2, IPIX, IPIX1, IPIX2
383
REAL X(NPIXA1,NPIXA2)
384
REAL Y(NY),XMIN,XMAX,RVAL
386
DOUBLE PRECISION STEPA(2),YSTR,DEL,WI(NPIXA2)
387
DOUBLE PRECISION YSTEP, W0, W1, WL, P1, P2
396
W1 = WI(IORD1) + (NP(IORD1)-1)*YSTEP - DEL
398
C ... ITERATION ON ORDERS
402
WL = YSTR + (IPIX-1)*YSTEP
404
IPIX1 = NINT((WL-WI(IORD1))/YSTEP) + 1
405
RVAL = X(IPIX1,IORD1)
406
IF (RVAL .GT. XMAX) XMAX = RVAL
407
IF (RVAL .LT. XMIN) XMIN = RVAL
409
ELSE IF (WL.LT.W1) THEN
410
IPIX1 = NINT((WL-WI(IORD1))/YSTEP) + 1
411
IPIX2 = NINT((WL-WI(IORD2))/YSTEP) + 1
412
P2 = (WL-W0)/ (W1-W0)
414
IF (X(IPIX1,IORD1).LE.0.0) THEN
418
IF (X(IPIX2,IORD2).LE.0.0) THEN
422
RVAL = X(IPIX1,IORD1)*P1 + X(IPIX2,IORD2)*P2
423
IF (RVAL .GT. XMAX) XMAX = RVAL
424
IF (RVAL .LT. XMIN) XMIN = RVAL
428
IF (IORD1.GT.NPIXA2) RETURN
430
IF (IORD2.GT.NPIXA2) THEN
435
W1 = WI(IORD1) + (NP(IORD1)-1)*YSTEP - DEL
436
IPIX1 = NINT((WL-WI(IORD1))/YSTEP) + 1
437
RVAL = X(IPIX1,IORD1)
438
IF (RVAL .GT. XMAX) XMAX = RVAL
439
IF (RVAL .LT. XMIN) XMIN = RVAL
446
SUBROUTINE ECHMR2O(X,WGT,NPIXA1,NPIXA2,STEPA,WI,NP,Y,VAR,NY
447
$ ,YSTR,XMIN,XMAX,DEL)
449
C MERGE THE ORDERS, AVERAGE ON THE OVERLAPPING REGION USING WEIGHTS
453
INTEGER NPIXA1, NPIXA2, NY
455
REAL X(NPIXA1,NPIXA2), WGT(NPIXA1,NPIXA2)
456
DOUBLE PRECISION STEPA(2),YSTR,DEL,WI(NPIXA2)
457
REAL Y(NY), VAR(NY),XMIN,XMAX,RVAL
459
INTEGER IORD1, IORD2, IPIX, IPIX1, IPIX2, IBAD
460
DOUBLE PRECISION YSTEP, WG1, WG2, W0, W1, WL
470
W1 = WI(IORD1) + (NP(IORD1)-1)*YSTEP - DEL
472
C ... ITERATION ON ORDERS
477
WL = YSTR + (IPIX-1)*YSTEP
479
IPIX1 = NINT((WL-WI(IORD1))/YSTEP) + 1
480
RVAL = X(IPIX1,IORD1)
481
IF (RVAL .GT. XMAX) XMAX = RVAL
482
IF (RVAL .LT. XMIN) XMIN = RVAL
484
VAR(IPIX) = WGT(IPIX1,IORD1)
485
IF (VAR(IPIX).NE.0.0) VAR(IPIX) = 1.0/VAR(IPIX)
486
ELSE IF (WL.LT.W1) THEN
487
IPIX1 = NINT((WL-WI(IORD1))/YSTEP) + 1
488
IPIX2 = NINT((WL-WI(IORD2))/YSTEP) + 1
489
WG1 = WGT(IPIX1,IORD1)
490
WG2 = WGT(IPIX2,IORD2)
492
IF (WG1.LT.1e-10 .AND. WG2.LT.1e-10) THEN
497
VAR(IPIX) = 1.0/(WG1 + WG2)
498
Y(IPIX) = X(IPIX1,IORD1)*WG1 + X(IPIX2,IORD2)*WG2
499
RVAL = Y(IPIX) * VAR(IPIX)
500
IF (RVAL .GT. XMAX) XMAX = RVAL
501
IF (RVAL .LT. XMIN) XMIN = RVAL
506
IF (IORD1.GT.NPIXA2) GOTO 99
508
IF (IORD2.GT.NPIXA2) THEN
513
W1 = WI(IORD1) + (NP(IORD1)-1)*YSTEP - DEL
514
IPIX1 = NINT((WL-WI(IORD1))/YSTEP) + 1
515
RVAL = X(IPIX1,IORD1)
516
IF (RVAL .GT. XMAX) XMAX = RVAL
517
IF (RVAL .LT. XMIN) XMIN = RVAL
519
VAR(IPIX) = WGT(IPIX1,IORD1)
520
IF (VAR(IPIX).NE.0.0) VAR(IPIX) = 1.0/VAR(IPIX)
523
99 IF (IBAD.GT.0) THEN
525
CALL STTPUT(MES,IBAD)
529
9099 FORMAT(I5,' undefined pixels ... set to 0.0!')
533
SUBROUTINE COPY(A,NA1,NA2,B,NB,I,XMIN,XMAX)
535
C COPY THE ORDER NUMBER I
539
INTEGER NA1, NA2, NB, I, J
541
REAL A(NA1,NA2),B(NB)
550
IF (RVAL .GT. XMAX) XMAX = RVAL
551
IF (RVAL .LT. XMIN) XMIN = RVAL
556
SUBROUTINE ECHMR3(X,NPIXA1,NPIXA2,STEPA,WI,NP,Y,NY,YSTR,
557
+ XMIN,XMAX,RORDER,K,A)
560
C MERGE THE ORDERS, AVERAGE ON THE OVERLAPPING REGION WITH
561
C WEIGHTS PROPORTIONAL TO THE SINC**2
565
INTEGER NY,IORD1,IPIX,NF,IORD,IPIX1,I,IFL,IORD2
566
INTEGER NPIXA1,NPIXA2
569
REAL XMIN,XMAX,YSTEP,PI,DW,WL
570
REAL X(NPIXA1,NPIXA2)
571
REAL Y(NY),RORDER(NPIXA2)
572
REAL K(NPIXA2),A(NPIXA2)
574
DOUBLE PRECISION DK,DA,PA,DM,DC,DX,WEIGHT(3),FLUX(3),SW,SF
575
DOUBLE PRECISION YSTR,STEPA(2),WI(NPIXA2)
579
PI = 0. ! To be updated (ULTRIX installation)
580
DW = 0. ! To be updated (ULTRIX installation)
583
IORD2 = MIN(IORD1+2,NPIXA2)
585
C ... ITERATION ON OUTPUT WAVELENGTHS
596
WL = YSTR + (IPIX-1)*YSTEP
598
C ... ITERATION ON ORDERS
600
DO 10 IORD = IORD1,IORD2
601
IPIX1 = (WL-WI(IORD))/YSTEP + 1
602
IF (IPIX1.GT.5 .AND. IPIX1.LT. (NP(IORD)-5)) THEN
604
C ... PIXEL IN THE ORDER RANGE
607
FLUX(NF) = X(IPIX1,IORD)
613
DX = (PA*DM*DC)* (DW-1.D0/DC)
614
IF (DABS(DX).LT.1.D-10) THEN
618
WEIGHT(NF) = 1.D0/ (DSIN(DX)/DX)**4
625
C ... AVERAGE OVER FLUXES
631
SW = SW + WEIGHT(IFL)
632
SF = SF + WEIGHT(IFL)*FLUX(IFL)
635
XMIN = MIN(XMIN,Y(IPIX))
636
XMAX = MAX(XMAX,Y(IPIX))
639
C ... CHECK ON ORDER LIMITS
641
IPIX1 = (WL-WI(IORD1))/YSTEP + 1
642
IF (IPIX1.GE.NP(IORD1)-5) THEN
644
IORD2 = MIN(IORD1+2,NPIXA2)
647
IF (IORD1.GT.NPIXA2) RETURN
649
DO 40 I = IPIX + 1,NY