~ubuntu-branches/debian/jessie/eso-midas/jessie

« back to all changes in this revision

Viewing changes to contrib/pepsys/libsrc/redsubs2.for

  • Committer: Package Import Robot
  • Author(s): Ole Streicher
  • Date: 2014-04-22 14:44:58 UTC
  • Revision ID: package-import@ubuntu.com-20140422144458-okiwi1assxkkiz39
Tags: upstream-13.09pl1.2+dfsg
ImportĀ upstreamĀ versionĀ 13.09pl1.2+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
C @(#)redsubs2.for      19.1 (ES0-DMD) 02/25/03 13:28:47
 
2
C===========================================================================
 
3
C Copyright (C) 1995 European Southern Observatory (ESO)
 
4
C
 
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.
 
9
C
 
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.
 
14
C
 
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, 
 
18
C MA 02139, USA.
 
19
C
 
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 
 
26
C                       GERMANY
 
27
C===========================================================================
 
28
C
 
29
      SUBROUTINE POLYGON(ARRAY,IFLAG,LABEL)
 
30
C  @(#)redsubs2.for     19.1  (ESO-IPG)  02/25/03  13:28:47
 
31
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
32
C.COPYRIGHT (c) European Southern Observatory 1992
 
33
C.IDENT         redsubs2.for
 
34
C.MODULE
 
35
C.AUTHOR        Andrew T. Young
 
36
C.KEYWORD
 
37
C.LANGUAGE      FORTRAN 77
 
38
C.PURPOSE       more subroutines for REDUCE
 
39
C.COMMENTS
 
40
C.VERSION       5.9
 
41
C.RETURNS
 
42
C.ENVIRONMENT
 
43
C.
 
44
C-----------------------------------------------------------------------------
 
45
C
 
46
C
 
47
C       scans array for items with NSTR=iflag, and does polygon interpolation.
 
48
C
 
49
C
 
50
      IMPLICIT NONE
 
51
      REAL ARRAY, XBAR, YBAR, SLOPE, FRACT, YMAX, YMIN
 
52
C
 
53
      INTEGER IFLAG, LEN, LWORD, JBGN, NIGHT, K, J,
 
54
     1         JMIN, JMAX, JEND, K1, K2
 
55
C
 
56
      INCLUDE 'MID_REL_INCL:obs.inc'
 
57
C
 
58
C
 
59
      DIMENSION ARRAY(MXOBS)
 
60
C
 
61
      CHARACTER A, LABEL*(*), CARD*79
 
62
C
 
63
      LOGICAL HELP
 
64
      EXTERNAL HELP
 
65
C
 
66
C
 
67
C
 
68
      LEN=LWORD(LABEL)
 
69
      JBGN=1
 
70
C
 
71
      DO 100 NIGHT=1,NIGHTS
 
72
C
 
73
        CALL SPACE2
 
74
        CALL NEED(24)
 
75
        CARD(:LEN)=LABEL(:LEN)
 
76
        CARD(LEN+1:LEN+6)='  for '
 
77
        CALL JD2DAT(REAL(2400000.5D0+DTZERO(NIGHT)),CARD(LEN+7:))
 
78
        CALL TV(CARD)
 
79
        K=0
 
80
        YMAX=-3.E33
 
81
        YMIN=3.E33
 
82
C
 
83
        DO 10 J=JBGN,NDATA
 
84
C
 
85
C         find data for current night.
 
86
          IF (NITE(J).NE.NIGHT) GO TO 20
 
87
          IF (NSTR(J).EQ.IFLAG)THEN
 
88
C           add to XS, YS.
 
89
            K=K+1
 
90
            XS(K)=DJOBS(J)
 
91
            YS(K)=ARRAY(J)
 
92
            YMAX=MAX(YMAX,YS(K))
 
93
            YMIN=MIN(YMIN,YS(K))
 
94
            IF (K.EQ.1) JMIN=J
 
95
            JMAX=J
 
96
          END IF
 
97
C
 
98
   10   CONTINUE
 
99
        J=NDATA+1
 
100
C
 
101
   20   CONTINUE
 
102
        JEND=J-1
 
103
C
 
104
C    JBGN, JEND index the first and last data of ANY kind for the night.
 
105
C    JMIN, JMAX index the first and last IFLAG data for the night.
 
106
C
 
107
C
 
108
C       K is count of data for night N.
 
109
C
 
110
        IF (YMAX.GT.YMIN) THEN
 
111
C           K > 1.
 
112
   22       CALL NEED(24)
 
113
            CALL PLOT(K,XS,YS,'*')
 
114
            CALL TVN('     Time (decimal days) -->')
 
115
            CALL ASKN('OK to interpolate with a polygon?',A)
 
116
            IF (A.EQ.'N') THEN
 
117
   24           CALL TV('Enter C to replace data with a Constant,')
 
118
                IF (K.GE.6)
 
119
     1               CALL TVN('      L to smooth with a Linear fit,')
 
120
                CALL ASKN('   or Q to Quit.',A)
 
121
                IF (A.EQ.'C') THEN
 
122
C                   be lazy: fit line, but force it horizontal.
 
123
                    CALL ROBLIN(XS,YS,K, XBAR,YBAR,SLOPE)
 
124
                    SLOPE=0.
 
125
                ELSE IF (A.EQ.'L') THEN
 
126
                    IF (K.LT.6) THEN
 
127
                        CALL TV('Not enough data to fit a line safely.')
 
128
                        CALL TVN('Try a constant instead.')
 
129
                        GO TO 24
 
130
                    END IF
 
131
                    CALL ROBLIN(XS,YS,K, XBAR,YBAR,SLOPE)
 
132
                ELSE
 
133
                   GO TO 24
 
134
                END IF
 
135
C
 
136
                DO 28 J=JBGN,JEND
 
137
                    ARRAY(J)=(DJOBS(J)-XBAR)*SLOPE+YBAR
 
138
   28           CONTINUE
 
139
C
 
140
                GO TO 41
 
141
            ELSE IF (A.EQ.'Y' .OR. A.EQ.'O') THEN
 
142
C               go on.
 
143
            ELSE IF (HELP(A)) THEN
 
144
                CALL TV('Reply NO to smooth data.')
 
145
                GO TO 22
 
146
            ELSE
 
147
                GO TO 22
 
148
            END IF
 
149
        ELSE IF (YMAX.EQ.YMIN) THEN
 
150
            CALL TV('Only 1 value available for this night!')
 
151
            CALL SPACE2
 
152
            DO 30 J=JBGN,JEND
 
153
                ARRAY(J)=ARRAY(JMIN)
 
154
   30       CONTINUE
 
155
            GO TO 99
 
156
        ELSE
 
157
            CALL TV('NO DATA AVAILABLE FOR THIS NIGHT')
 
158
            CALL STSEPI
 
159
        END IF
 
160
C
 
161
C       Now interpolate.
 
162
C
 
163
        K1=1
 
164
        K2=2
 
165
C
 
166
        DO 40 J=JBGN,JEND
 
167
           IF (J.LT.JMIN) THEN
 
168
               ARRAY(J)=ARRAY(JMIN)
 
169
           ELSE IF (J.GT.JMAX) THEN
 
170
               ARRAY(J)=ARRAY(JMAX)
 
171
           ELSE
 
172
               IF (DJOBS(J).GT.XS(K2)) THEN
 
173
                   K1=K2
 
174
                   K2=K2+1
 
175
               END IF
 
176
C
 
177
C               linear interp...
 
178
               FRACT=(DJOBS(J)-XS(K1))/(XS(K2)-XS(K1))
 
179
               ARRAY(J)=YS(K1)+(YS(K2)-YS(K1))*FRACT
 
180
           END IF
 
181
   40   CONTINUE
 
182
C
 
183
   41   CARD(66:78)=CARD(53:65)
 
184
        CARD(53:65)=CARD(40:52)
 
185
        CARD(40:52)=CARD(27:39)
 
186
        CARD(27:39)=CARD(14:26)
 
187
        CARD(14:26)=CARD(:13)
 
188
        CARD(:13)='Interpolated '
 
189
        CALL NEED(24)
 
190
        CALL TV(CARD)
 
191
C       fudge to get right plot limits....
 
192
        XS(1)=DJOBS(JBGN)
 
193
        XS(K)=DJOBS(JEND)
 
194
        CALL PLOT(-K,XS,YS,' ')
 
195
        DO 50 J=JBGN,JEND
 
196
        CALL PLOT(-1,DJOBS(J),ARRAY(J),'+')
 
197
   50   CONTINUE
 
198
C       now undo fudge.
 
199
        XS(1)=DJOBS(JMIN)
 
200
        XS(K)=DJOBS(JMAX)
 
201
        CALL PLOT(K,XS,YS,'*')
 
202
        CALL RTNCON('     Time (decimal days) -->',28)
 
203
C
 
204
   99   JBGN=JEND+1
 
205
C       IF (JBGN.GT.NDATA) RETURN
 
206
  100 CONTINUE
 
207
C
 
208
      RETURN
 
209
      END
 
210
      SUBROUTINE DARKFIT(NDET,NDUSED,LABEL)
 
211
C
 
212
C       scans SIGNAL for items with NSTR=-1, models dark level vs. DTMP,
 
213
C       and subtracts dark current for detector number NDET.
 
214
C
 
215
C
 
216
C     C A U T I O N :  This routine has *** NOT *** been debugged!
 
217
C     ===============
 
218
C
 
219
      IMPLICIT NONE
 
220
C
 
221
      REAL XLIMS, YLIMS, SIGMIN, SIGMAX, YMAX, 
 
222
     1   YMIN, XBAR, YBAR, SLOPE, XBAR1, YBAR1, SLOPE1, TRY, XBAR2, 
 
223
     2         YBAR2, SLOPE2, FIT
 
224
      INTEGER NDET, LEN, LWORD, K, J, JMIN,
 
225
     1   JMAX, K3, K1, I, K2, NIX
 
226
C
 
227
      INCLUDE 'MID_REL_INCL:mbands.inc'
 
228
C     PARAMETER (MBANDS=9)
 
229
      INTEGER MXCOLR
 
230
      PARAMETER (MXCOLR=3*MBANDS)
 
231
      INTEGER NDUSED(MXCOLR)
 
232
C
 
233
      INCLUDE 'MID_REL_INCL:obs.inc'
 
234
C     This defines SIGNAL, NSTR, KBND, etc.
 
235
C
 
236
C     Includes for dlsq:
 
237
      INCLUDE 'MID_REL_INCL:kingfit.inc'
 
238
      INCLUDE 'MID_REL_INCL:dlsq.inc'
 
239
C
 
240
      CHARACTER A1, LABEL*16, CARD*79
 
241
C
 
242
      DIMENSION XLIMS(2),YLIMS(2)
 
243
C
 
244
      LOGICAL HELP
 
245
      EXTERNAL HELP
 
246
C
 
247
      EXTERNAL YP2EXP
 
248
C
 
249
C
 
250
C       Begin execution:
 
251
C
 
252
      LEN=LWORD(LABEL)
 
253
C
 
254
    2 K=0
 
255
      SIGMAX=-3.E33
 
256
      SIGMIN=3.E33
 
257
      CALL SPACE2
 
258
      CARD(:LEN)=LABEL(:LEN)
 
259
      CARD(LEN+1:)='  Log(DARK) vs. Temperature'
 
260
C
 
261
      DO 10 J=1,NDATA
 
262
C
 
263
C       find  dark data    for  current detector.
 
264
        IF (NSTR(J).EQ.-1 .AND. KBND(J).EQ.NDET)THEN
 
265
C           add to XS, YS.
 
266
            K=K+1
 
267
            XS(K)=DTMP(J)
 
268
            IF (SIGNAL(J).GT.0.) THEN
 
269
               YS(K)=LOG(SIGNAL(J))
 
270
            ELSE
 
271
               CARD='Negative dark reading at MJD ='
 
272
               WRITE(CARD(35:),'(F12.5)') DTZERO(NITE(J))+DJOBS(J)
 
273
               CARD(48:)='in channel'
 
274
               WRITE(CARD(55:),'(I3)') NDET
 
275
               CALL TV(CARD)
 
276
               K=K-1
 
277
               GO TO 10
 
278
            END IF
 
279
            SIGMAX=MAX(SIGMAX,SIGNAL(J))
 
280
            SIGMIN=MIN(SIGMIN,SIGNAL(J))
 
281
C
 
282
C           SYMB is night label:
 
283
            IF (NITE(J).LT.10) THEN
 
284
                SYMB(K)=CHAR(ICHAR('0')+NITE(J))
 
285
            ELSE
 
286
                SYMB(K)=CHAR(ICHAR('A')+NITE(J)-1)
 
287
            END IF
 
288
C
 
289
            IF (K.EQ.1) THEN
 
290
               JMIN=J
 
291
            END IF
 
292
C               do this every time, in case only 1 datum.
 
293
            JMAX=J
 
294
        END IF
 
295
C
 
296
   10 CONTINUE
 
297
C
 
298
C       K is count of data for current detector.
 
299
C
 
300
   21 YMAX=-3.E33
 
301
      YMIN=3.E33
 
302
C
 
303
      IF (SIGMAX.GT.SIGMIN) THEN
 
304
C           K > 1.
 
305
C           set page size:
 
306
            CALL PLOT(0,78.,22.,'P')
 
307
C           set different-symbol mode:
 
308
   22       CALL PLOT(0,78.,22.,'D')
 
309
            CALL NEED(24)
 
310
            CALL TV(CARD)
 
311
C           plot each night with its own symbol.
 
312
            CALL PLOT(K,XS,YS,SYMB)
 
313
C           set same-symbol mode:
 
314
            CALL PLOT(0,78.,22.,'S')
 
315
            IF (K.GT.10) THEN
 
316
                CALL TVN('     Temperature -->')
 
317
                CALL ASKN('OK to fit with 2 lines?',A1)
 
318
            ELSE IF (HELP(A1)) THEN
 
319
                CALL TV('Reply YES only if concave upward')
 
320
                CALL TVN('(high at ends, lower in middle)')
 
321
                GO TO 22
 
322
            ELSE
 
323
                A1='N'
 
324
                CALL RTNCON('     Temperature -->', 20)
 
325
            END IF
 
326
C
 
327
            IF (A1.EQ.'N') THEN
 
328
   24           CALL TV('Enter C to replace data with a Constant,')
 
329
                CALL TVN('      L to smooth with a Linear fit,')
 
330
                CALL ASKN('   or Q to Quit.',A1)
 
331
C
 
332
                IF (A1.EQ.'C') THEN
 
333
C                   be lazy: fit line, but force it horizontal.
 
334
                    CALL ROBLIN(XS,YS,K, XBAR,YBAR,SLOPE)
 
335
                    SLOPE=0.
 
336
                    NIX=1
 
337
                    IX(1)=2
 
338
                ELSE IF (A1.EQ.'L') THEN
 
339
                    IF (K.LT.6) THEN
 
340
                        CALL TV('Not enough data to fit 1 line safely.')
 
341
                        CALL TVN('Try a constant instead.')
 
342
                        GO TO 24
 
343
                    END IF
 
344
C                       fit a simple exponential in temperature:
 
345
                    CALL ROBLIN(XS,YS,K, XBAR,YBAR,SLOPE)
 
346
                    NIX=0
 
347
                ELSE
 
348
                   GO TO 24
 
349
                END IF
 
350
C
 
351
C
 
352
C               Refine one-exponential fit:
 
353
C
 
354
                IPR=0
 
355
                KIP=2
 
356
                PG(1)=EXP(YBAR)
 
357
                PG(2)=SLOPE
 
358
                DO 26 J=1,K
 
359
                  X(1,J)=XS(J)-XBAR
 
360
                  Y(J)=EXP(YS(J))
 
361
C                 use expected ordinates to weight:
 
362
                  W(J)=1./EXP(YBAR+X(1,J)*SLOPE)
 
363
   26           CONTINUE
 
364
C               refine fit:
 
365
C      subroutine DLSQ(YP,NPTS,NPARMS,NBLOX,MBLOK,NIX,NARGS,NKARGS,TEST)
 
366
                CALL DLSQ(YP2EXP,K,2,   1,    2,  NIX,  1,    0,  1.E-3)
 
367
                SLOPE=LOG(P(2))
 
368
                YBAR=P(1)
 
369
C
 
370
C
 
371
C               now subtract fit from ALL data with this detector:
 
372
C
 
373
                DO 28 J=1,NDATA
 
374
                   IF ((NSTR(J).GT.0 .AND. NDUSED(KBND(J)).NE.NDET) .OR.
 
375
     1                 (NSTR(J).EQ.-1 .AND. KBND(J).NE.NDET)) GO TO 28
 
376
C                  subtract dark:
 
377
                   SIGNAL(J)=SIGNAL(J)-EXP((DTMP(J)-XBAR)*SLOPE+YBAR)
 
378
                   IF (NSTR(J).EQ.-1) THEN
 
379
                      YMAX=MAX(YMAX,SIGNAL(J))
 
380
                      YMIN=MIN(YMIN,SIGNAL(J))
 
381
                   END IF
 
382
   28           CONTINUE
 
383
C
 
384
                GO TO 61
 
385
C
 
386
C
 
387
            ELSE IF (A1.EQ.'Y' .OR. A1.EQ.'O') THEN
 
388
C               go on to do two-exponential fit at *****.
 
389
C
 
390
            ELSE IF (A1.EQ.'H')THEN
 
391
                CALL TV('If the plot is generally concave upward,')
 
392
                CALL TVN('and the different nights (different symbols)')
 
393
                CALL TVN('appear to follow the same curve, reply YES.')
 
394
                CALL TV('If the plot is straight or concave downward,')
 
395
                CALL TVN('or some nights are offset, reply NO.')
 
396
                CALL TV('Overlapping points are denoted by "$".')
 
397
                CALL SPACE2
 
398
                CALL RTNCON(' ',1)
 
399
                GO TO 21
 
400
C
 
401
            ELSE
 
402
                GO TO 22
 
403
C
 
404
            END IF
 
405
C
 
406
      ELSE IF (SIGMAX.EQ.SIGMIN) THEN
 
407
            CALL TV('Only 1 dark value available!')
 
408
            CALL SPACE2
 
409
            DO 30 J=1,NDATA
 
410
C               subtract dark:
 
411
                IF (NSTR(J).GT.0 .AND. NDUSED(KBND(J)).EQ.NDET)
 
412
     1             SIGNAL(J)=SIGNAL(J)-SIGMIN
 
413
   30       CONTINUE
 
414
C           skip plot.
 
415
            GO TO 99
 
416
      ELSE
 
417
            CALL TV('NO DATA AVAILABLE -- cannot subtract dark')
 
418
            RETURN
 
419
      END IF
 
420
C
 
421
C     *****
 
422
C
 
423
C       Here to fit 2 lines (exponentials), and remove their sum.
 
424
C
 
425
      K3=K/3
 
426
C
 
427
      IF (K3.LT.9) THEN
 
428
          CALL TV('CAUTION: probably too few points to get a fit.')
 
429
          CALL ASKN('Were there any wild points in the plot above?',A1)
 
430
C
 
431
          IF (A1.EQ.'Y')THEN
 
432
              CALL TV('Then you should try to fit just one line.')
 
433
              CALL RTNCON(' ',1)
 
434
              GO TO 21
 
435
          ELSE IF (A1.EQ.'N') THEN
 
436
C               go ahead.
 
437
          ELSE IF (A1.EQ.'H') THEN
 
438
C               get help: show plot again.
 
439
                GO TO 21
 
440
          ELSE
 
441
          END IF
 
442
C
 
443
      END IF
 
444
C
 
445
      CALL SORT2(XS,YS,K)
 
446
C     fit trial line to bottom 1/3 of data.
 
447
      CALL ROBLIN(XS,YS,K3, XBAR1,YBAR1,SLOPE1)
 
448
C
 
449
C     remove lower trial line, and fit the upper line.
 
450
C
 
451
      K1=0
 
452
C
 
453
      DO 32 I=1,K3
 
454
C        move upper third to lower third:
 
455
         K2=K-K3+I
 
456
         TRY=EXP(YS(K2))-EXP(YBAR1+SLOPE1*(XS(K2)-XBAR1))
 
457
         IF (TRY.LE.0.) THEN
 
458
C           skip this point.
 
459
         ELSE
 
460
            K1=K1+1
 
461
C           save K1 in K1+K.
 
462
            XS(K1+K)=XS(K1)
 
463
            YS(K1+K)=YS(K1)
 
464
C           move K2 to K1.
 
465
            YS(K1)=LOG(TRY)
 
466
            XS(K1)=XS(K2)
 
467
         END IF
 
468
   32 CONTINUE
 
469
C
 
470
      IF (K1.LT.6)THEN
 
471
          CALL TV('Sorry; can''t fit 2 lines.  Try 1 line.')
 
472
          CALL RTNCON(' ',1)
 
473
          GO TO 2
 
474
      ELSE
 
475
          CALL ROBLIN(XS,YS,K1, XBAR2,YBAR2,SLOPE2)
 
476
          IF (SLOPE2.LT.0. .OR. SLOPE2.LT.SLOPE1) THEN
 
477
C               unphysical result; complain.
 
478
              CALL TV('Sorry; attempted fit is nonsense.')
 
479
              CALL RTNCON('Try again, using 1 line.',24)
 
480
              GO TO 2
 
481
          ELSE
 
482
          END IF
 
483
      END IF
 
484
C
 
485
C     Now restore saved data to lower K1:
 
486
      DO 35 I=1,K1
 
487
         XS(K1)=XS(K1+K)
 
488
         YS(K1)=YS(K1+K)
 
489
   35 CONTINUE
 
490
C
 
491
C     *****  Polish the result.  *****
 
492
C
 
493
C     Set up for DLSQ:
 
494
C
 
495
      IPR=0
 
496
      NIX=0
 
497
C     Set up data:
 
498
      XBAR=(XBAR1+XBAR2)*0.5
 
499
      DO 36 I=1,K
 
500
         X(1,I)=XS(I)-XBAR
 
501
         Y(I)=YS(I)
 
502
         W(I)=1./(EXP(YBAR1+SLOPE1*(XS(I)-XBAR1)) +
 
503
     1            EXP(YBAR2+SLOPE2*(XS(I)-XBAR2)) )
 
504
   36 CONTINUE
 
505
      KIP=4
 
506
      PG(1)=EXP(YBAR1+SLOPE1*(XBAR-XBAR1))
 
507
      PG(2)=SLOPE1
 
508
      PG(3)=EXP(YBAR2+SLOPE2*(XBAR-XBAR2))
 
509
      PG(4)=SLOPE2
 
510
C               refine fit:
 
511
      DO 40 I=1,3
 
512
C     Subroutine DLSQ(YP,NPTS,NPARMS,NBLOX,MBLOK,NIX,NARGS,NKARGS,TEST)
 
513
        CALL DLSQ(YP2EXP, K,    2,    1,    2,   NIX, 1,    0,   1.E-3)
 
514
C
 
515
        IF (P(1).LE.0.D0 .OR. P(3).LE.0.D0) THEN
 
516
          CALL TV('Sorry -- unable to fit two lines.  Try one.')
 
517
          CALL RTNCON(' ',1)
 
518
          GO TO 2
 
519
        END IF
 
520
C       Update values:
 
521
        DO 38 J=1,4
 
522
   38   PG(J)=P(J)
 
523
        SLOPE1=P(2)
 
524
        YBAR1=LOG(P(1))-SLOPE1*(XBAR-XBAR1)
 
525
        SLOPE2=P(4)
 
526
        YBAR2=LOG(P(3))-SLOPE2*(XBAR-XBAR2)
 
527
C       Revise weights:
 
528
        DO 39 J=1,K
 
529
          W(J)=1./(EXP(YBAR1+SLOPE1*(XS(I)-XBAR1)) +
 
530
     1             EXP(YBAR2+SLOPE2*(XS(I)-XBAR2)) )
 
531
   39   CONTINUE
 
532
   40 CONTINUE
 
533
C
 
534
C
 
535
C
 
536
C     Subtract the interpolated values from ALL data for this det.
 
537
C
 
538
      DO 60 J=1,NDATA
 
539
         IF ((NSTR(J).GT.0 .AND. NDUSED(KBND(J)).NE.NDET) .OR.
 
540
     1            (NSTR(J).EQ.-1 .AND. KBND(J).NE.NDET)) GO TO 60
 
541
         FIT=EXP(YBAR1+SLOPE1*(DTMP(J)-XBAR1)) +
 
542
     1        EXP(YBAR2+SLOPE2*(DTMP(J)-XBAR2))
 
543
         SIGNAL(J)=SIGNAL(J)-FIT
 
544
         IF (NSTR(J).NE.-1) GO TO 60
 
545
C        use only dark data to set limits for residual plot.
 
546
         YMAX=MAX(YMAX,SIGNAL(J))
 
547
         YMIN=MIN(YMIN,SIGNAL(J))
 
548
   60 CONTINUE
 
549
C
 
550
C       Now inspect resids. vs. time:
 
551
C
 
552
   61 CARD(:LEN)=LABEL(:LEN)
 
553
      CARD(LEN+1:)=' Dark RESIDUALS  vs. Time'
 
554
      CALL NEED(24)
 
555
      CALL TV(CARD)
 
556
C     set plot limits....
 
557
      XLIMS(1)=DJOBS(1)
 
558
      XLIMS(2)=DJOBS(NDATA)
 
559
      YLIMS(1)=YMIN
 
560
      YLIMS(2)=YMAX
 
561
      CALL PLOT(0,XLIMS,YLIMS,'L')
 
562
      DO 80 J=1,NDATA
 
563
          IF (NSTR(J).NE.-1 .OR. KBND(J).NE.NDET) GO TO 80
 
564
          IF (NITE(J).LT.10) THEN
 
565
             A1=CHAR(ICHAR('0')+NITE(J))
 
566
          ELSE
 
567
             A1=CHAR(ICHAR('A')+NITE(J)-1)
 
568
          END IF
 
569
          CALL PLOT(-1,DJOBS(J),SIGNAL(J),A1)
 
570
   80 CONTINUE
 
571
C     force plot:
 
572
      CALL PLOT(1,0.,0.,'+')
 
573
      CALL RTNCON('     Time (decimal days) -->',28)
 
574
C
 
575
   99 CONTINUE
 
576
C
 
577
      RETURN
 
578
      END
 
579
      SUBROUTINE YP2EXP
 
580
C
 
581
C   Fits  Y = P(1)*EXP(P(2)*Z(1)) + P(3)*EXP(P(4)*Z(1))
 
582
C
 
583
C
 
584
      IMPLICIT NONE
 
585
C
 
586
C     Includes for dlsq:
 
587
      INCLUDE 'MID_REL_INCL:kingfit.inc'
 
588
      INCLUDE 'MID_REL_INCL:dlsq.inc'
 
589
C
 
590
      DOUBLE PRECISION TERM
 
591
C
 
592
C
 
593
C   Start with first term:
 
594
C
 
595
C
 
596
C     KIP is set by DARKFIT.
 
597
C
 
598
      IP(1)=1
 
599
      IP(2)=2
 
600
C
 
601
      TERM=P(2)*Z(1)
 
602
      TERM=EXP(MIN(TERM,30.D0))
 
603
      PART(1)=TERM
 
604
      PART(2)=P(1)*TERM*Z(1)
 
605
C
 
606
      YT = P(1)*TERM
 
607
C
 
608
      IF (KIP.EQ.2) RETURN
 
609
C
 
610
C   Here for second term:
 
611
C
 
612
      IP(3)=3
 
613
      IP(4)=4
 
614
C
 
615
      TERM=P(4)*Z(1)
 
616
      TERM=EXP(MIN(TERM,30.D0))
 
617
      PART(3)=TERM
 
618
      PART(4)=P(3)*TERM*Z(1)
 
619
C
 
620
      YT = YT + P(3)*TERM
 
621
C
 
622
C
 
623
      RETURN
 
624
      END
 
625
      SUBROUTINE DARKPOLY(NDET,NDUSED,LABEL)
 
626
C
 
627
C       scans SIGNAL for items with NSTR=-1, and does polygon interpolation
 
628
C       and subtraction of dark current for detector number NDET.
 
629
C
 
630
C
 
631
      IMPLICIT NONE
 
632
C
 
633
      REAL XLIMS, YLIMS, SIGMIN, SIGMAX, SIGA, SIGZ, YMAX, 
 
634
     1         YMIN, XBAR, YBAR, SLOPE, FRACT
 
635
      INTEGER NDET, LEN, LWORD, JBGN, NIGHT, K, J,
 
636
     1         JMIN, JMAX, JEND, K1, K2, NIX
 
637
C
 
638
      INCLUDE 'MID_REL_INCL:mbands.inc'
 
639
C     PARAMETER (MBANDS=9)
 
640
      INTEGER MXCOLR
 
641
      PARAMETER (MXCOLR=3*MBANDS)
 
642
      INTEGER NDUSED(MXCOLR)
 
643
C
 
644
      INCLUDE 'MID_REL_INCL:obs.inc'
 
645
C     This defines NITE, SIGNAL, NSTR, KBND, etc.
 
646
C
 
647
C     Includes for dlsq:
 
648
      INCLUDE 'MID_REL_INCL:kingfit.inc'
 
649
      INCLUDE 'MID_REL_INCL:dlsq.inc'
 
650
C
 
651
      CHARACTER A1, LABEL*16, CARD*79
 
652
C
 
653
      DIMENSION XLIMS(2),YLIMS(2)
 
654
C
 
655
      LOGICAL HELP
 
656
      EXTERNAL HELP
 
657
C
 
658
      EXTERNAL YPLIN
 
659
C
 
660
C
 
661
C       Begin execution:
 
662
C
 
663
      LEN=LWORD(LABEL)
 
664
      JBGN=1
 
665
C
 
666
      DO 100 NIGHT=1,NIGHTS
 
667
C
 
668
        CALL SPACE2
 
669
        CALL NEED(24)
 
670
        CARD(:LEN)=LABEL(:LEN)
 
671
        CARD(LEN+1:LEN+10)='  DARK on '
 
672
        CALL JD2DAT(REAL(2400000.5D0+DTZERO(NIGHT)),CARD(LEN+11:))
 
673
        CARD(LWORD(CARD)+3:)='=  MJD'
 
674
        WRITE (CARD(LWORD(CARD)+1:),'(F7.0)') DTZERO(NIGHT)
 
675
        CALL TV(CARD)
 
676
        SIGMAX=-3.E33
 
677
        SIGMIN=3.E33
 
678
        K=0
 
679
C
 
680
        DO 10 J=JBGN,NDATA
 
681
C
 
682
C         find dark data for current night and detector.
 
683
          IF (NITE(J).NE.NIGHT) GO TO 20
 
684
c         KBND holds NDET for DARK data, remember.
 
685
          IF (NSTR(J).EQ.-1 .AND. KBND(J).EQ.NDET)THEN
 
686
C           add to XS, YS.
 
687
            K=K+1
 
688
            XS(K)=DJOBS(J)
 
689
            YS(K)=SIGNAL(J)
 
690
            IF (K.EQ.1) JMIN=J
 
691
            IF (K.EQ.1) SIGA=SIGNAL(J)
 
692
            JMAX=J
 
693
            SIGZ=SIGNAL(J)
 
694
            SIGMAX=MAX(SIGMAX,SIGNAL(J))
 
695
            SIGMIN=MIN(SIGMIN,SIGNAL(J))
 
696
          END IF
 
697
C
 
698
   10   CONTINUE
 
699
        J=NDATA+1
 
700
C
 
701
   20   CONTINUE
 
702
        JEND=J-1
 
703
C
 
704
C    JBGN, JEND index the first and last data of ANY kind for the night.
 
705
C    JMIN, JMAX index the first and last DARK data for the night.
 
706
C    SIGA, SIGZ are the first and last dark LEVELS for the night.
 
707
C    SIGMIN, SIGMAX are the lowest and highest dark LEVELS for the night.
 
708
C
 
709
C
 
710
        YMAX=-3.E33
 
711
        YMIN=3.E33
 
712
C
 
713
C       K is count of data for night N.
 
714
C
 
715
        IF (SIGMAX.GT.SIGMIN) THEN
 
716
   22       CALL NEED(24)
 
717
            CALL PLOT(K,XS,YS,'*')
 
718
            CALL TVN('     TIME (decimal days) -->')
 
719
            CALL ASKN('OK to interpolate with a polygon?',A1)
 
720
            IF (A1.EQ.'N') THEN
 
721
   24           CALL TV('Enter C to replace data with a Constant,')
 
722
                IF (K.GE.6)
 
723
     1               CALL TVN('      L to smooth with a Linear fit,')
 
724
                CALL ASKN('   or Q to Quit.',A1)
 
725
                IF (A1.EQ.'C') THEN
 
726
C                   be lazy: fit line, but force it horizontal.
 
727
                    CALL ROBLIN(XS,YS,K, XBAR,YBAR,SLOPE)
 
728
                    SLOPE=0.
 
729
                    NIX=1
 
730
                    IX(1)=2
 
731
                ELSE IF (A1.EQ.'L') THEN
 
732
                    IF (K.LT.6) THEN
 
733
                        CALL TV('Not enough data to fit a line safely.')
 
734
                        CALL TVN('Try a constant instead.')
 
735
                        GO TO 24
 
736
                    END IF
 
737
                    CALL ROBLIN(XS,YS,K, XBAR,YBAR,SLOPE)
 
738
                    NIX=0
 
739
                ELSE IF (HELP(A1)) THEN
 
740
                    CALL TV('Reply NO to smooth data.')
 
741
                    GO TO 22
 
742
                ELSE
 
743
                   GO TO 24
 
744
                END IF
 
745
C
 
746
C
 
747
C               Refine fit:
 
748
C
 
749
                IPR=0
 
750
                PG(1)=YBAR
 
751
                PG(2)=SLOPE
 
752
                DO 26 J=1,K
 
753
                  X(1,J)=XS(J)-XBAR
 
754
                  Y(J)=YS(J)
 
755
                  W(J)=1.
 
756
   26           CONTINUE
 
757
C               refine fit:
 
758
C     Subroutine DLSQ(YP,NPTS,NPARMS,NBLOX,MBLOK,NIX,NARGS,NKARGS,TEST)
 
759
                CALL DLSQ(YPLIN,K,2,  1,    2,   NIX, 1,    0,   1.E-3)
 
760
                SLOPE=P(2)
 
761
                YBAR=P(1)
 
762
C
 
763
C
 
764
C               Subtract fit:
 
765
C
 
766
                DO 28 J=JBGN,JEND
 
767
                    IF((NSTR(J).GT.0 .AND. NDUSED(KBND(J)).NE.NDET) .OR.
 
768
C                       real star, not observed with current det...
 
769
     1                 (NSTR(J).LE.0 .AND. KBND(J).NE.NDET)) GO TO 28
 
770
C                       ...or dark, not observed with current det.
 
771
C                   OK, subtract interpolated dark line:
 
772
                    SIGNAL(J)=SIGNAL(J)-((DJOBS(J)-XBAR)*SLOPE+YBAR)
 
773
                    IF (NSTR(J).EQ.-1) THEN
 
774
C                       reset limits for residual plot.
 
775
                        YMAX=MAX(YMAX,SIGNAL(J))
 
776
                        YMIN=MIN(YMIN,SIGNAL(J))
 
777
                    END IF
 
778
   28           CONTINUE
 
779
C
 
780
C               plot residuals.
 
781
C
 
782
                CALL NEED(24)
 
783
                CARD(66:78)=CARD(53:65)
 
784
                CARD(53:65)=CARD(40:52)
 
785
                CARD(40:52)=CARD(27:39)
 
786
                CARD(27:39)=CARD(14:26)
 
787
                CARD(14:26)=CARD(:13)
 
788
                CARD(:13)='RESIDUALS of '
 
789
                CALL TV(CARD)
 
790
C               set plot limits....
 
791
                XLIMS(1)=DJOBS(JBGN)
 
792
                XLIMS(2)=DJOBS(JEND)
 
793
                YLIMS(1)=YMIN
 
794
                YLIMS(2)=YMAX
 
795
                CALL PLOT(0,XLIMS,YLIMS,'L')
 
796
                CALL XAXIS(XLIMS)
 
797
                DO 29 J=JBGN,JEND
 
798
                   IF (NSTR(J).NE.-1 .OR. KBND(J).NE.NDET) GO TO 29
 
799
C                  plot only dark resids., not star data.
 
800
                   CALL PLOT(-1,DJOBS(J),SIGNAL(J),'*')
 
801
   29           CONTINUE
 
802
C               force plot:
 
803
                CALL PLOT(1,0.,0.,'+')
 
804
                CALL RTNCON('     Time (decimal days) -->',28)
 
805
                GO TO 99
 
806
C
 
807
            ELSE IF (A1.EQ.'Y' .OR. A1.EQ.'O') THEN
 
808
C               go on.
 
809
            ELSE
 
810
                GO TO 22
 
811
            END IF
 
812
        ELSE IF (K.EQ.1) THEN
 
813
            CALL TV('Only 1 datum available for this night!')
 
814
            CALL SPACE2
 
815
            DO 30 J=JBGN,JEND
 
816
C                subtract dark:
 
817
                 IF((NSTR(J).GT.0 .AND. NDUSED(KBND(J)).NE.NDET) .OR.
 
818
     1                 (NSTR(J).LE.0 .AND. KBND(J).NE.NDET)) THEN
 
819
c                   skip it.
 
820
                 ELSE
 
821
                    SIGNAL(J)=SIGNAL(J)-SIGA
 
822
                 END IF
 
823
   30       CONTINUE
 
824
C           skip plot.
 
825
            GO TO 99
 
826
        ELSE
 
827
            CALLTV('NO DATA AVAILABLE FOR THIS NIGHT -- no subtraction')
 
828
            GO TO 99
 
829
        END IF
 
830
C
 
831
C       Do polygon interpolation here.
 
832
C
 
833
        K1=1
 
834
        K2=2
 
835
C
 
836
        DO 40 J=JBGN,JEND
 
837
           IF (NDUSED(KBND(J)).NE.NDET) GO TO 40
 
838
C          skip observations with other detectors.
 
839
           IF (J.LT.JMIN) THEN
 
840
C              Before 1st dark (at JMIN); use it.
 
841
               SIGNAL(J)=SIGNAL(J)-SIGA
 
842
           ELSE IF (J.GT.JMAX) THEN
 
843
C              After last dark (at JMAX); use it.
 
844
               SIGNAL(J)=SIGNAL(J)-SIGZ
 
845
           ELSE
 
846
C              Can interpolate.
 
847
               IF (DJOBS(J).GT.XS(K2)) THEN
 
848
C                  Step to next interval.
 
849
                   K1=K2
 
850
                   K2=K2+1
 
851
               END IF
 
852
C
 
853
C               linear interp...
 
854
                FRACT=(DJOBS(J)-XS(K1))/(XS(K2)-XS(K1))
 
855
                SIGNAL(J)=SIGNAL(J)-(YS(K1)+(YS(K2)-YS(K1))*FRACT)
 
856
           END IF
 
857
C          note that we have no plot of residuals at the DARK data points,
 
858
C          as they are negligible for polygon fit.
 
859
   40   CONTINUE
 
860
C
 
861
   99   JBGN=JEND+1
 
862
C       IF (JBGN.GT.NDATA) RETURN
 
863
  100 CONTINUE
 
864
C
 
865
      RETURN
 
866
      END
 
867
      SUBROUTINE ROBLIN (X, Y, N,  XBAR, YBAR, SLOPE)
 
868
C
 
869
C       Fits a robust line to N pairs (X,Y), having medians (Xbar, Ybar)
 
870
C       and SLOPE.  Method: see Hoaglin, Mosteller & Tukey, Ch.5.
 
871
C
 
872
C       Does NOT mess up input data; but leaves them sorted on X in XDUM,YDUM.
 
873
C
 
874
C
 
875
C       Input arguments:
 
876
C
 
877
      INTEGER N
 
878
      REAL X(N), Y(N)
 
879
C
 
880
C       Output arguments:
 
881
C
 
882
      REAL XBAR,YBAR,SLOPE
 
883
C
 
884
C   Scratch arrays:
 
885
C
 
886
      INCLUDE 'MID_REL_INCL:obs.inc'
 
887
C     (defines MXOBS.)
 
888
      REAL XDUM,YDUM,ZDUM
 
889
      COMMON /SCRAT/ XDUM(MXOBS), YDUM(MXOBS), ZDUM(MXOBS)
 
890
C
 
891
C   Local variables:
 
892
C
 
893
      INTEGER I,J,N3,MID,MIDL,MIDR
 
894
      REAL XL,XR,YL,YR,B,B0,B1,B2,RL,RR,DELTA1,DELTAX,DR0,DR1
 
895
C
 
896
C
 
897
C   *****  BEGIN EXECUTION  *****
 
898
C
 
899
      IF (N.GT.MXOBS)THEN
 
900
            CALL TV('Too many data to sort in available slots.')
 
901
            CALL TV('Expand MXOBS and recompile.')
 
902
            CALL STSEPI
 
903
      ELSE IF (N.EQ.2)THEN
 
904
            XBAR=(X(1)+X(2))/2.
 
905
            YBAR=(Y(1)+Y(2))/2.
 
906
            IF (X(2).NE.X(1)) THEN
 
907
              SLOPE=(Y(2)-Y(1))/(X(2)-X(1))
 
908
            ELSE
 
909
              SLOPE=0.
 
910
            END IF
 
911
            RETURN
 
912
      ELSE IF (N.EQ.1)THEN
 
913
            XBAR=X(1)
 
914
            YBAR=Y(1)
 
915
            SLOPE=0.
 
916
            RETURN
 
917
      ELSE IF (N.LE.0)THEN
 
918
            CALL TV('ROBLIN can''t fit a line to 0 points!')
 
919
            CALL TVN('BUG in program')
 
920
            CALL STSEPI
 
921
      END IF
 
922
C
 
923
      DO 1 I=1,N
 
924
      XDUM(I)=X(I)
 
925
      YDUM(I)=Y(I)
 
926
      ZDUM(I)=Y(I)
 
927
    1 CONTINUE
 
928
C
 
929
      CALL SORT1(ZDUM,N)
 
930
      CALL SORT2(XDUM,YDUM,N)
 
931
      MID=(N+1)/2
 
932
C
 
933
      IF (MID.EQ.N/2) THEN
 
934
C                             N EVEN
 
935
            XBAR=(XDUM(MID)+XDUM(MID+1))*0.5
 
936
            YBAR=(ZDUM(MID)+ZDUM(MID+1))*0.5
 
937
      ELSE
 
938
C                             N ODD
 
939
            XBAR=XDUM(MID)
 
940
            YBAR=ZDUM(MID)
 
941
      END IF
 
942
C
 
943
C             Pick size of end thirds:
 
944
C
 
945
      N3=(N+1)/3
 
946
C                     Pick end thirds:
 
947
      MIDL=(N3+1)/2
 
948
      MIDR=N+1-MIDL
 
949
C
 
950
      IF (MIDL.EQ.N3/2) THEN
 
951
C                             N3 EVEN
 
952
            XL=(XDUM(MIDL)+XDUM(MIDL+1))*0.5
 
953
            XR=(XDUM(MIDR)+XDUM(MIDR-1))*0.5
 
954
      ELSE
 
955
C                             N3 ODD
 
956
            XL=XDUM(MIDL)
 
957
            XR=XDUM(MIDR)
 
958
      END IF
 
959
      DELTAX=(XR-XL)
 
960
C
 
961
C       Now find y medians for left and right groups.
 
962
C                             LEFT group:
 
963
      DO 10 I=1,N3
 
964
   10 ZDUM(I)=YDUM(I)
 
965
      CALL SORT1(ZDUM,N3)
 
966
C
 
967
      IF (MIDL.EQ.N3/2) THEN
 
968
C                     N3 EVEN
 
969
            YL=(ZDUM(MIDL)+ZDUM(MIDL+1))*0.5
 
970
      ELSE
 
971
C                     N3 ODD
 
972
            YL=ZDUM(MIDL)
 
973
      END IF
 
974
C                             RIGHT group:
 
975
      DO 20 I=1,N3
 
976
   20 ZDUM(I)=YDUM(N+1-I)
 
977
      CALL SORT1(ZDUM,N3)
 
978
C
 
979
      IF (MIDL.EQ.N3/2) THEN
 
980
C                     N3 EVEN
 
981
            YR=(ZDUM(MIDL)+ZDUM(MIDL+1))*0.5
 
982
      ELSE
 
983
C                     N3 ODD
 
984
            YR=ZDUM(MIDL)
 
985
      END IF
 
986
C
 
987
      B0=(YR-YL)/DELTAX
 
988
      B=B0
 
989
C
 
990
C       B0 is initial slope.
 
991
C
 
992
C                     *****  BEGIN ITERATIONS  *****
 
993
      DO 50 J=1,5
 
994
C             Put RESIDS. in zdum:
 
995
C                             LEFT:
 
996
        DO 30 I=1,N3
 
997
   30   ZDUM(I)=YDUM(I)-(YBAR+B*(XDUM(I)-XBAR))
 
998
        CALL SORT1(ZDUM,N3)
 
999
C
 
1000
        IF (MIDL.EQ.N3/2) THEN
 
1001
C                     N3 EVEN
 
1002
            RL=(ZDUM(MIDL)+ZDUM(MIDL+1))*0.5
 
1003
        ELSE
 
1004
C                     N3 ODD
 
1005
            RL=ZDUM(MIDL)
 
1006
        END IF
 
1007
C                             RIGHT:
 
1008
        DO 40 I=1,N3
 
1009
   40   ZDUM(I)=YDUM(N+1-I)-(YBAR+B*(XDUM(N+1-I)-XBAR))
 
1010
        CALL SORT1(ZDUM,N3)
 
1011
C
 
1012
        IF (MIDL.EQ.N3/2) THEN
 
1013
C                     N3 EVEN
 
1014
            RR=(ZDUM(MIDL)+ZDUM(MIDL+1))*0.5
 
1015
        ELSE
 
1016
C                     N3 ODD
 
1017
            RR=ZDUM(MIDL)
 
1018
        END IF
 
1019
C
 
1020
        IF (J.EQ.1) THEN
 
1021
            DR0=RR-RL
 
1022
            DELTA1=DR0/DELTAX
 
1023
            B1=B0+DELTA1
 
1024
            IF (B1.EQ.B0) GOTO 100
 
1025
            B=B1
 
1026
        ELSE
 
1027
            DR1=RR-RL
 
1028
            IF (DR1.EQ.0.) GOTO 100
 
1029
            IF (ABS((DR1-DR0)/DR1).LT.1.E-4) GOTO 100
 
1030
            B2=B1-DR1*(B1-B0)/(DR1-DR0)
 
1031
            B=B2
 
1032
            IF (ABS(B2-B1).LT.1.E-6*ABS(B1)) GO TO 100
 
1033
C                     prepare for next round:
 
1034
            B0=B1
 
1035
            B1=B2
 
1036
            DR0=DR1
 
1037
        END IF
 
1038
   50 CONTINUE
 
1039
C
 
1040
  100 CONTINUE
 
1041
      SLOPE=B
 
1042
C       Current value of b is converged.  Recalculate all resids.:
 
1043
C
 
1044
      DO 110 I=1,N
 
1045
  110 ZDUM(I)=YDUM(I)-(YBAR+B*(XDUM(I)-XBAR))
 
1046
      CALL SORT1(ZDUM,N)
 
1047
C
 
1048
      IF (MID.EQ.N/2) THEN
 
1049
C                             N EVEN
 
1050
            YBAR=(ZDUM(MID)+ZDUM(MID+1))*0.5+YBAR
 
1051
      ELSE
 
1052
C                             N ODD
 
1053
            YBAR=ZDUM(MID)+YBAR
 
1054
      END IF
 
1055
C
 
1056
C
 
1057
      RETURN
 
1058
      END
 
1059
      SUBROUTINE SORT1(X,N)
 
1060
C
 
1061
C       Sorts X, in place.
 
1062
C
 
1063
C  BOOTHROYD'S SHELL-SORT:  COMM.ACM 6,445(1963) ALG.201.
 
1064
C
 
1065
C  SEE H.LORIN,"SORTING & SORT SYSTEMS" (ADDISON-WESLEY,1975)
 
1066
C  CH.3 & 11 FOR THEORY AND TESTS.
 
1067
C
 
1068
C
 
1069
      IMPLICIT NONE
 
1070
C
 
1071
      INTEGER N
 
1072
      REAL X(N)
 
1073
C
 
1074
C
 
1075
C  Local variables:
 
1076
C
 
1077
      INTEGER I,J,M
 
1078
      REAL DUM
 
1079
C
 
1080
C  **** BEGIN ****
 
1081
C
 
1082
      IF(N.EQ.1)RETURN
 
1083
      I=1
 
1084
    3 I=I+I
 
1085
      IF(I.LE.N)GO TO 3
 
1086
      M=I-1
 
1087
    5 M=M/2
 
1088
      IF(M.EQ.0)RETURN
 
1089
      DO 20 J=1,N-M
 
1090
      DO 10 I=J,1,-M
 
1091
      IF(X(I+M).GE.X(I)) GO TO 20
 
1092
      DUM=X(I)
 
1093
      X(I)=X(I+M)
 
1094
      X(I+M)=DUM
 
1095
   10 CONTINUE
 
1096
   20 CONTINUE
 
1097
      GO TO 5
 
1098
C
 
1099
      END
 
1100
      SUBROUTINE SORT2(X,Y,N)
 
1101
C
 
1102
C       Sorts (X,Y) pairs on X, in place.
 
1103
C
 
1104
C  BOOTHROYD'S SHELL-SORT:  COMM.ACM 6,445(1963) ALG.201.
 
1105
C
 
1106
C  SEE H.LORIN,"SORTING & SORT SYSTEMS" (ADDISON-WESLEY,1975)
 
1107
C  CH.3 & 11 FOR THEORY AND TESTS.
 
1108
C
 
1109
C
 
1110
      IMPLICIT NONE
 
1111
C
 
1112
      INTEGER N
 
1113
      REAL X(N),Y(N)
 
1114
C
 
1115
C
 
1116
C  Local variables:
 
1117
C
 
1118
      INTEGER I,J,M
 
1119
      REAL DUM
 
1120
C
 
1121
C  **** BEGIN ****
 
1122
C
 
1123
      IF(N.EQ.1)RETURN
 
1124
      I=1
 
1125
    3 I=I+I
 
1126
      IF(I.LE.N)GO TO 3
 
1127
      M=I-1
 
1128
    5 M=M/2
 
1129
      IF(M.EQ.0)RETURN
 
1130
      DO 20 J=1,N-M
 
1131
      DO 10 I=J,1,-M
 
1132
      IF(X(I+M).GE.X(I)) GO TO 20
 
1133
      DUM=X(I)
 
1134
      X(I)=X(I+M)
 
1135
      X(I+M)=DUM
 
1136
      DUM=Y(I)
 
1137
      Y(I)=Y(I+M)
 
1138
      Y(I+M)=DUM
 
1139
   10 CONTINUE
 
1140
   20 CONTINUE
 
1141
      GO TO 5
 
1142
C
 
1143
      END
 
1144
      SUBROUTINE YPLIN
 
1145
C
 
1146
C  YP for use by DLSQ in linear fits.
 
1147
C
 
1148
C
 
1149
C  fits:   Y = P(1) + P(2)*Z(1)
 
1150
C
 
1151
C
 
1152
      IMPLICIT NONE
 
1153
C
 
1154
C     Includes for dlsq:
 
1155
      INCLUDE 'MID_REL_INCL:kingfit.inc'
 
1156
      INCLUDE 'MID_REL_INCL:dlsq.inc'
 
1157
C
 
1158
C
 
1159
C
 
1160
      YT = P(1) + P(2)*Z(1)
 
1161
C
 
1162
      PART(1)=1.D0
 
1163
      PART(2)=Z(1)
 
1164
C
 
1165
      IP(1)=1
 
1166
      IP(2)=2
 
1167
      KIP=2
 
1168
C
 
1169
C
 
1170
      RETURN
 
1171
      END
 
1172
      SUBROUTINE SKYSUB(BANDS,KMIN,KMAX,DTYPE,KDIAPHRAGM,EXTIN)
 
1173
C
 
1174
C       scans SIGNAL for items with DTYPE='Y', and does modelling,
 
1175
C       interpolation, and subtraction of sky for each passband.
 
1176
C
 
1177
C
 
1178
      IMPLICIT NONE
 
1179
C
 
1180
C
 
1181
      INCLUDE 'MID_REL_INCL:mbands.inc'
 
1182
C     PARAMETER (MBANDS=9)
 
1183
C
 
1184
      INCLUDE 'MID_REL_INCL:obs.inc'
 
1185
      REAL XDUM,YDUM,ZDUM
 
1186
      COMMON /SCRAT/ XDUM(MXOBS), YDUM(MXOBS), ZDUM(MXOBS)
 
1187
C
 
1188
C
 
1189
C   Args:
 
1190
C
 
1191
      INTEGER KMIN, KMAX, KDIAPHRAGM
 
1192
      CHARACTER DTYPE(MXOBS)
 
1193
      REAL EXTIN(MBANDS)
 
1194
C
 
1195
C
 
1196
      REAL COSOB, SINOB, RASUN, DESUN, HASUN, SOLONG, ELMOON, BMOON, 
 
1197
     1    SINPHI, COSPHI, ELONG, ELROT, UTROT, STUTZ, TWOPI, ST2UT, 
 
1198
     2    TNOON1, TNOON2, PI, DEGRAD, ALAT, XLIMS, YLIMS, ALTS, T, 
 
1199
     3    YMAX, YMIN, AIRMAX, SALTS, OBLIQ, SIGMIN, 
 
1200
     4    SIGMAX, RISE, SET, DAWN, DUSK, UTRAD, TLST, HAMOON, COSDEL, 
 
1201
     5    SINDEL, COSHA, XM, YM, ZM, AZMOON, DELAZ, COSEL, XBAR, 
 
1202
     6    YBAR, SLOPE, OLDVAR, ELONGMAX, ELONGMIN, ZENITH
 
1203
C
 
1204
      INTEGER NB, LEN, LWORD, JBGN, NIGHT, NTWI,
 
1205
     1       K, J, JMIN, JMAX, JEND, MOONUP, NERROR, NIX, NPTS, NFIT
 
1206
C
 
1207
C   COMMONS FOR SPHERICAL TRIG.:
 
1208
C
 
1209
      COMMON /CSUN/ COSOB,SINOB,RASUN,DESUN,HASUN,SOLONG,ELMOON,BMOON
 
1210
      COMMON /SPHERE/ SINPHI,COSPHI,ELONG,ELROT,UTROT,STUTZ,TWOPI,ST2UT,
 
1211
     1 TNOON1,TNOON2,PI,DEGRAD,ALAT
 
1212
      INTEGER MXCOLR
 
1213
      PARAMETER (MXCOLR=3*MBANDS)
 
1214
C
 
1215
C       commons for star catalog:
 
1216
      INCLUDE 'MID_REL_INCL:mstars.inc'
 
1217
C     PARAMETER (MSTARS=1650)
 
1218
      CHARACTER *32 STARS
 
1219
      COMMON /SCATA/ STARS(MSTARS)
 
1220
C
 
1221
C     Includes for dlsq:
 
1222
      INCLUDE 'MID_REL_INCL:kingfit.inc'
 
1223
      INCLUDE 'MID_REL_INCL:dlsq.inc'
 
1224
C
 
1225
C
 
1226
C   Commons for 12 Diaphragms:
 
1227
C
 
1228
      INTEGER NP2NDIA(12*MBANDS)
 
1229
      INTEGER NDIA2NP(12,MBANDS), NDIAS,NDIA
 
1230
C          indices: NDIA,K
 
1231
      REAL      XNDIA(12,MBANDS)
 
1232
      COMMON /DIACOM/XNDIA,NP2NDIA,NDIA2NP,NDIAS,NDIA
 
1233
C
 
1234
      CHARACTER DIANAM(12)*4
 
1235
      COMMON /DIACH/DIANAM
 
1236
C
 
1237
C
 
1238
C   LOCAL variables:
 
1239
C
 
1240
      CHARACTER A1, CARD*80, BANDS(MXCOLR)*8, DATSTR*16
 
1241
C
 
1242
      REAL ERRSAVE(12)
 
1243
      INTEGER LORDER(12),L,NN, JDUSK,JDAWN, NPARMS,NREFDIA
 
1244
C
 
1245
      LOGICAL TWILIT, SHORT
 
1246
C
 
1247
C
 
1248
      EXTERNAL YPLIN, YPSKY
 
1249
C
 
1250
C
 
1251
      DIMENSION XLIMS(2),YLIMS(2)
 
1252
      DIMENSION ALTS(2), SALTS(5)
 
1253
C
 
1254
C       true altitude of Moon at rise & set:
 
1255
      DATA ALTS/-.0145,-.0145/
 
1256
C
 
1257
C
 
1258
C       true altitude of Sun at limit of astronomical twilight:
 
1259
      DATA SALTS/-.309,0.,0.,0.,-.309/
 
1260
C
 
1261
C
 
1262
C
 
1263
C       Begin execution:
 
1264
C
 
1265
      CALL SPACE2
 
1266
      CALL TV('               SKY subtraction:')
 
1267
      CALL TV('You will see graphs of sky brightness, plotted against')
 
1268
      CALL TVN('time, airmass, and lunar elongation, for each band,')
 
1269
      CALL TVN('on each night separately.')
 
1270
      CALL TV('Then you can choose the method of fitting or')
 
1271
      CALL TVN('interpolating sky brightness, for each case.')
 
1272
      CALL SPACE
 
1273
      CALL RTNCON(' ',1)
 
1274
      CALL PLOT(0,78.,23.,'P')
 
1275
C
 
1276
      DO 1000 NB=KMIN,KMAX
 
1277
        LEN=LWORD(BANDS(NB))
 
1278
        JBGN=1
 
1279
      DO 1000 NIGHT=1,NIGHTS
 
1280
        CALL SPACE2
 
1281
        CALL NEED(24)
 
1282
    2   CARD(:LEN)=BANDS(NB)
 
1283
        CARD(LEN+1:LEN+10)='  SKY on'
 
1284
        CALL JD2DAT(REAL(2400000.5D0+DTZERO(NIGHT)),CARD(LEN+11:))
 
1285
        DATSTR=CARD(LEN+6:)
 
1286
        SHORT=.FALSE.
 
1287
C
 
1288
    3   K=0
 
1289
        DO 5 NDIA=1,NDIAS
 
1290
           NDIA2NP(NDIA,1)=0
 
1291
    5   CONTINUE
 
1292
        YMAX=-3.E33
 
1293
        YMIN=3.E33
 
1294
        AIRMAX=1.
 
1295
C
 
1296
        DO 10 J=JBGN,NDATA
 
1297
C
 
1298
C         find range of sky data for current night and passband.
 
1299
          IF (NITE(J).NE.NIGHT) GO TO 12
 
1300
          IF (KBND(J).NE.NB) GO TO 10
 
1301
          IF (DTYPE(J).EQ.'Y')THEN
 
1302
C           add to XS, YS.
 
1303
            K=K+1
 
1304
            XS(K)=DJOBS(J)
 
1305
            YS(K)=SIGNAL(J)
 
1306
            YMAX=MAX(YMAX,SIGNAL(J))
 
1307
            YMIN=MIN(YMIN,SIGNAL(J))
 
1308
            AIRMAX=MAX(AIRMAX,AIRM(J))
 
1309
            IF (K.EQ.1) JMIN=J
 
1310
            IF (K.EQ.1) SIGMIN=SIGNAL(J)
 
1311
            JMAX=J
 
1312
            SIGMAX=SIGNAL(J)
 
1313
          END IF
 
1314
C
 
1315
   10   CONTINUE
 
1316
        J=NDATA+1
 
1317
C
 
1318
   12   CONTINUE
 
1319
        JEND=J-1
 
1320
C
 
1321
C    JBGN, JEND index the first and last data of ANY kind for the night.
 
1322
C    JMIN, JMAX index the first and last SKY data for the night & band.
 
1323
C    SIGMIN, SIGMAX are the first and last sky LEVELS for the night.
 
1324
C
 
1325
C       K is count of data for night N.
 
1326
C
 
1327
        T=(DTZERO(NIGHT)+INT(DJOBS((JBGN+JEND)/2))-51544.5)/36525.
 
1328
        CALL STUTZR(T)
 
1329
C       STUTZR sets sidereal time for later use by UTMOON & UTSUN.
 
1330
C       Set OBLIQ for SUN (called by UTSUN).
 
1331
        OBLIQ=(23.43929-T*(1.30042E-2+T*(1.639E-7-T*5.036E-7)))*DEGRAD
 
1332
        COSOB=COS(OBLIQ)
 
1333
        SINOB=SIN(OBLIQ)
 
1334
C
 
1335
C     Adjust YMAX for possible outliers:
 
1336
C
 
1337
        CALL SORT2(YS,XS,K)
 
1338
C       (Note reversal of Y and X.)
 
1339
        YM=(YS((K+1)/2)+YS(K/2+1))*0.5
 
1340
C       YM is median.
 
1341
        NN=(K+2)/4
 
1342
        ZM=YS(K-NN)-YS(NN)
 
1343
C       ZM is interquartile range.
 
1344
        YMAX=MIN(YMAX,YM+4.*ZM)
 
1345
C
 
1346
        IF (K.GT.1) THEN
 
1347
C
 
1348
C           Take shortcut if required:
 
1349
            IF (SHORT) THEN
 
1350
               A1='T'
 
1351
               GO TO 102
 
1352
            END IF
 
1353
C
 
1354
C           set up plots; first, TIME:
 
1355
C
 
1356
C           set plot limits:
 
1357
            XLIMS(1)=DJOBS(JMIN)
 
1358
            XLIMS(2)=DJOBS(JMAX)
 
1359
            YLIMS(1)=YMIN
 
1360
            YLIMS(2)=YMAX
 
1361
            CALL PLOT(0,XLIMS,YLIMS,'L')
 
1362
C
 
1363
C           plot moonrise & moonset.  First, guarantee RISE < SET:
 
1364
            RISE=DJOBS(JMIN)
 
1365
            SET=DJOBS(JMAX)
 
1366
C           UTMOON needs T in Julian centuries from J2000.
 
1367
            T=((2400000.5D0-2451545.D0)+DTZERO(NIGHT)+
 
1368
     1                   INT(DJOBS((JBGN+JEND)/2)))/36525.
 
1369
            CALL UTMOON(T,ALTS,1,*21)
 
1370
C           UTMOON returns result in UTROT, in /SPHERE/.
 
1371
            RISE=UTROT+INT(DJOBS((JBGN+JEND)/2))
 
1372
C           we have at most 18 intervals between YMIN & YMAX.
 
1373
            CALL PLOT(-1,RISE,(YMIN+14.*YMAX)/15.,'|')
 
1374
            CALL PLOT(-1,RISE,(YMIN*2.+13.*YMAX)/15.,'|')
 
1375
            CALL PLOT(-1,RISE,YMAX,'R')
 
1376
            IF (DJOBS(JMIN).LT.RISE .AND. DJOBS(JMAX).GT.RISE)
 
1377
     1         CARD(LWORD(CARD)+5:)='R = moonrise'
 
1378
   21       CALL UTMOON(T,ALTS,2,*22)
 
1379
            SET=UTROT+INT(DJOBS((JBGN+JEND)/2))
 
1380
            CALL PLOT(-1,SET,(YMIN+14.*YMAX)/15.,'|')
 
1381
            CALL PLOT(-1,SET,(YMIN*2.+13.*YMAX)/15.,'|')
 
1382
            CALL PLOT(-1,SET,YMAX,'S')
 
1383
            IF (DJOBS(JMIN).LT.SET .AND. DJOBS(JMAX).GT.SET)
 
1384
     1         CARD(LWORD(CARD)+5:)='S = moonset'
 
1385
   22       CONTINUE
 
1386
C
 
1387
C           RISE & SET now are correct for Moon.  Do SUN:
 
1388
            DUSK=DJOBS(JMIN)
 
1389
            DAWN=DJOBS(JMAX)
 
1390
C           Here the argument is DAYS from J2000.
 
1391
            CALL UTSUN(T*36525.,SALTS,1,*23)
 
1392
            DUSK=UTROT+INT(DJOBS((JBGN+JEND)/2))
 
1393
   23       CALL UTSUN(T*36525.,SALTS,5,*24)
 
1394
            DAWN=UTROT+INT(DJOBS((JBGN+JEND)/2))
 
1395
   24       CONTINUE
 
1396
C           DUSK & DAWN are now limits of astronomical twilight.
 
1397
C
 
1398
            TWILIT=.FALSE.
 
1399
            JDUSK=JEND
 
1400
            JDAWN=JBGN
 
1401
            DO 26 J=JMIN,JMAX
 
1402
                IF (KBND(J).NE.NB) GO TO 26
 
1403
                IF ( (DAWN.LT.DUSK  .AND.
 
1404
     1               DJOBS(J).GT.DAWN .AND. DJOBS(J).LT.DUSK) .OR.
 
1405
     2               (DAWN .GT.DUSK  .AND.
 
1406
     3               (DJOBS(J).GT.DAWN .OR. DJOBS(J).LT.DUSK) )  ) THEN
 
1407
C                   Twilight.
 
1408
                    A1='t'
 
1409
                    TWILIT=.TRUE.
 
1410
                ELSE
 
1411
C                   Not twilit.
 
1412
                    A1='*'
 
1413
                    JDUSK=MIN(JDUSK,J)
 
1414
                    JDAWN=MAX(JDAWN,J)
 
1415
                END IF
 
1416
                IF (DTYPE(J).EQ.'Y')THEN
 
1417
                    CALL PLOT(-1,DJOBS(J),SIGNAL(J),A1)
 
1418
                END IF
 
1419
   26       CONTINUE
 
1420
            IF (TWILIT) CARD(LWORD(CARD)+5:)='t = twilight sky'
 
1421
            CALL TV(CARD)
 
1422
            CALL SPACE
 
1423
            CALL PLOT(1,0.,0.,'+')
 
1424
            WRITE(CARD,'(A,F7.0)')'    TIME (MJD =',DTZERO(NIGHT)
 
1425
            CARD(LWORD(CARD):)=' + decimal of day) -->'
 
1426
            CALL RTNCON(CARD,LWORD(CARD))
 
1427
C
 
1428
C               End of TIME plot; begin AIRMASS plot.
 
1429
C
 
1430
            CALL NEED(24)
 
1431
            CARD(:32)='SKY brightness vs. AIRMASS, for'
 
1432
            CARD(33:LEN+33)=BANDS(NB)
 
1433
            CARD(LEN+34:)=DATSTR
 
1434
            CARD(LWORD(CARD)+5:)='M = Moon up'
 
1435
            CALL TV(CARD)
 
1436
            CALL SPACE
 
1437
            XLIMS(1)=1.
 
1438
            XLIMS(2)=AIRMAX
 
1439
            CALL PLOT(0,XLIMS,YLIMS,'L')
 
1440
            K=0
 
1441
            MOONUP=0
 
1442
            NTWI=0
 
1443
            DO 30 J=JMIN,JMAX
 
1444
              IF (KBND(J).NE.NB) GO TO 30
 
1445
              IF (DTYPE(J).EQ.'Y')THEN
 
1446
                K=K+1
 
1447
                IF ( (DAWN.LT.DUSK  .AND.
 
1448
     1               DJOBS(J).GT.DAWN .AND. DJOBS(J).LT.DUSK) .OR.
 
1449
     2               (DAWN .GT.DUSK  .AND.
 
1450
     3               (DJOBS(J).GT.DAWN .OR. DJOBS(J).LT.DUSK) )  ) THEN
 
1451
C                   Twilight.
 
1452
                    A1='t'
 
1453
                    NTWI=NTWI+1
 
1454
                    KX(1,K)=-1
 
1455
                ELSE IF ( (RISE.LT.SET  .AND.
 
1456
     1               DJOBS(J).GT.RISE .AND. DJOBS(J).LT.SET) .OR.
 
1457
     2               (RISE .GT.SET  .AND.
 
1458
     3               (DJOBS(J).GT.RISE .OR. DJOBS(J).LT.SET) )  ) THEN
 
1459
C                   Moon is up.  Flag in KX.
 
1460
                    A1='M'
 
1461
                    MOONUP=MOONUP+1
 
1462
C                   Flag for model solution.
 
1463
                    KX(1,K)=1
 
1464
                ELSE
 
1465
C                   Moon is down.
 
1466
                    A1='-'
 
1467
                    KX(1,K)=0
 
1468
                END IF
 
1469
                SYMB(K)=A1
 
1470
                CALL PLOT(-1,AIRM(J),SIGNAL(J),A1)
 
1471
C               Set KX(2,*) to NDIA, or 0 if no diaphragm:
 
1472
                DO 28 NDIA=1,NDIAS
 
1473
                  IF (DIAPH(J).EQ.DIANAM(NDIA)) THEN
 
1474
                     KX(2,K)=NDIA
 
1475
                     NDIA2NP(NDIA,1)=NDIA2NP(NDIA,1)+1
 
1476
                     GO TO 29
 
1477
                  END IF
 
1478
   28           CONTINUE
 
1479
C               Here only if no dias.
 
1480
                KX(2,K)=0
 
1481
C                          Debugging:
 
1482
C                          IF (KDIAPHRAGM.NE.-1) CALL TV('Dia.error!')
 
1483
   29           CONTINUE
 
1484
C               Set KX(3,*) to J for use in later plots.
 
1485
                KX(3,K)=J
 
1486
C               Set X(1,*) to airmass.
 
1487
                X(1,K)=AIRM(J)
 
1488
C               Set X(4,*) to nearest star signal.
 
1489
                CALL HALO(NB,DTYPE,KDIAPHRAGM,J,JBGN,JEND, X(4,K))
 
1490
                Y(K)=SIGNAL(J)
 
1491
                W(K)=1./ABS(SIGNAL(J))
 
1492
              END IF
 
1493
   30       CONTINUE
 
1494
            CALL PLOT(1,50.,-50.,' ')
 
1495
            CALL RTNCON('     AIRMASS -->',16)
 
1496
C
 
1497
C               End of AIRMASS plot; begin LUNAR ELONGATION plot.
 
1498
C
 
1499
            IF(MOONUP.LT.2) GO TO 100
 
1500
            ELONGMAX=0.
 
1501
            ELONGMIN=50.
 
1502
            CALL NEED(24)
 
1503
            CARD(:41)='SKY brightness vs. LUNAR ELONGATION, for'
 
1504
            CARD(42:LEN+42)=BANDS(NB)
 
1505
            CARD(LEN+43:)=DATSTR
 
1506
            CARD(LWORD(CARD)+5:)='M = Moon up'
 
1507
            CALL TV(CARD)
 
1508
            CALL SPACE
 
1509
            XLIMS(1)=0.
 
1510
            XLIMS(2)=180.
 
1511
            CALL PLOT(0,XLIMS,YLIMS,'L')
 
1512
            K=0
 
1513
            DO 40 J=JMIN,JMAX
 
1514
              IF (KBND(J).NE.NB) GO TO 40
 
1515
              IF (DTYPE(J).EQ.'Y')THEN
 
1516
                K=K+1
 
1517
                T=(DTZERO(NIGHT)-51544.5D0+DJOBS(J))/36525.
 
1518
                UTRAD=MOD(DJOBS(J),1.)*TWOPI
 
1519
                TLST=STUTZ+(UTRAD*1.00273791)+ELONG
 
1520
C               MOON uses T for lunar position, TLST for topocentric ephemeris.
 
1521
                CALL MOON(T, TLST)
 
1522
C               MOON returns lunar coords. in RASUN, DESUN in /CSUN/.
 
1523
                HAMOON=TLST-RASUN
 
1524
                COSDEL=COS(DESUN)
 
1525
                SINDEL=SIN(DESUN)
 
1526
                COSHA=COS(HAMOON)
 
1527
                XM= -COSDEL*SIN(HAMOON)
 
1528
                YM=COSPHI*SINDEL-SINPHI*COSDEL*COSHA
 
1529
                ZM=SINPHI*SINDEL+COSPHI*COSDEL*COSHA
 
1530
                IF (ZM.GT.ALTS(1)) THEN
 
1531
C                  Set X(2,*) to LUNAR airmass.  (ZM is cosZ(Moon).)
 
1532
                   X(2,K)=(.0096467+ZM*(.148386+ZM*1.0024342))/
 
1533
     1                    (.000303978+ZM*(.0102963+ZM*(.149864+ZM)))
 
1534
                ELSE
 
1535
C                  Moon below horizon.
 
1536
                   X(2,K)=50.
 
1537
C                                  WRITE(CARD,*)'ZM=',ZM
 
1538
C                                  IF(KX(1,K).EQ.1)CALL TV(CARD)
 
1539
                   IF(KX(1,K).EQ.1) SYMB(K)='m'
 
1540
                END IF
 
1541
                AZMOON=ATAN2(YM,XM)
 
1542
                DELAZ=AZMOON-AZIM(J)
 
1543
C               approximate cosz(sky) as 1/airmass.
 
1544
                COSEL=ZM/AIRM(J) +
 
1545
     1               SQRT((1.-ZM*ZM)*(1.-1./AIRM(J)**2))*COS(DELAZ)
 
1546
C               Set X(3,*) to lunar elongation.
 
1547
                X(3,K)=ACOS(COSEL)
 
1548
                IF (KX(1,K).EQ.1) THEN
 
1549
                   ELONGMAX=MAX(ELONGMAX,X(3,K))
 
1550
                   ELONGMIN=MIN(ELONGMIN,X(3,K))
 
1551
                END IF
 
1552
                XS(K)=ACOS(COSEL)/DEGRAD
 
1553
                YS(K)=SIGNAL(J)
 
1554
              END IF
 
1555
   40       CONTINUE
 
1556
            CALL PLOT(0,0.,0.,'D')
 
1557
            CALL PLOT(K,XS,YS,SYMB)
 
1558
            CALL PLOT(0,0.,0.,'S')
 
1559
            CALL RTNCON('     LUNAR ELONGATION (deg.) -->',32)
 
1560
C
 
1561
C               End of plots.
 
1562
C
 
1563
  100       CALL SPACE
 
1564
            CALL TVN('Do you want to interpolate in TIME alone, or')
 
1565
            CALL TVN('do you want to try fitting sky with a MODEL?')
 
1566
            CALL TV('(Enter T for Time; M to Model the sky; or)')
 
1567
            CALL ASKN('(        R to re-display the plots.)',A1)
 
1568
            CALL SPACE
 
1569
C
 
1570
  102       IF (A1.EQ.'T') THEN
 
1571
                K=0
 
1572
                DO 105 J=JMIN,JMAX
 
1573
C
 
1574
C                  restore sky data for current night and passband.
 
1575
                   IF (KBND(J).NE.NB) GO TO 105
 
1576
                   IF (DTYPE(J).EQ.'Y')THEN
 
1577
C                    add to XS, YS.
 
1578
                     K=K+1
 
1579
                     XS(K)=DJOBS(J)
 
1580
                     YS(K)=SIGNAL(J)
 
1581
                   END IF
 
1582
C
 
1583
  105           CONTINUE
 
1584
C
 
1585
  110           CALL TV('Enter C to replace sky data with a Constant,')
 
1586
                CALL TVN('      L to smooth with a Linear fit,')
 
1587
                CALL TVN('      N to use the sky Nearest the star,')
 
1588
                CALL TVN('      P to use the sky Preceding the star,')
 
1589
                CALL TVN('      F to use the sky Following the star,')
 
1590
                CALL TVN('      R to Re-display plots,')
 
1591
                CALL TVN('   or Q to Quit.')
 
1592
                CALL ASKN('?',A1)
 
1593
                IF (A1.EQ.'C') THEN
 
1594
C                   be lazy: fit line, but force it horizontal.
 
1595
                    CALL ROBLIN(XS,YS,K, XBAR,YBAR,SLOPE)
 
1596
                    SLOPE=0.
 
1597
                    PG(2)=0.
 
1598
                    NIX=1
 
1599
                    IX(1)=2
 
1600
                ELSE IF (A1.EQ.'L') THEN
 
1601
                    IF (K.LT.6) THEN
 
1602
                        CALL TV('Not enough data to fit a line safely.')
 
1603
                        CALL TVN('Try a constant instead.')
 
1604
                        GO TO 110
 
1605
                    END IF
 
1606
                    CALL ROBLIN(XS,YS,K, XBAR,YBAR,SLOPE)
 
1607
                    PG(2)=SLOPE
 
1608
                    NIX=0
 
1609
                ELSE
 
1610
C                  for neighboring-sample subtraction:
 
1611
C
 
1612
                   IF (A1.EQ.'N') THEN
 
1613
C                     use NEAREST neighbor.
 
1614
                      CALL TV('CAUTION: This method is not robust!')
 
1615
                      CALL SKYNBR(NB,DTYPE,KDIAPHRAGM,JBGN,JEND)
 
1616
                   ELSE IF (A1.EQ.'P') THEN
 
1617
C                     SKY comes first.
 
1618
                      CALL TV('CAUTION: This method is not robust!')
 
1619
                      CALL SKYADJ(NB,DTYPE,KDIAPHRAGM,JBGN,JEND,NERROR)
 
1620
                      IF (NERROR.GT.0) GO TO 2
 
1621
                   ELSE IF (A1.EQ.'F') THEN
 
1622
C                     STAR comes first, so scan in reverse order.
 
1623
                      CALL TV('CAUTION: This method is not robust!')
 
1624
                      CALL SKYADJ(NB,DTYPE,KDIAPHRAGM,JEND,JBGN,NERROR)
 
1625
                      IF (NERROR.GT.0) GO TO 2
 
1626
                   ELSE IF (A1.EQ.'R') THEN
 
1627
                      GO TO 2
 
1628
                   ELSE
 
1629
                      CALL TV('Usually N is your best choice; but')
 
1630
                      CALL TVN('if you have been careful to take sky')
 
1631
                      CALL TVN('ALWAYS before or after every star, you')
 
1632
                      CALL TVN('can choose P for sky-then-star, or')
 
1633
                      CALL TVN('           F for star-then-sky.')
 
1634
                      GO TO 110
 
1635
                   END IF
 
1636
C                  skip residual plots if sky is subtracted exactly.
 
1637
                   CALL TV('(Sky samples were subtracted exactly; so')
 
1638
                   CALL TVN(' there are no residuals to plot.)')
 
1639
                   GO TO 999
 
1640
                END IF
 
1641
C
 
1642
C               here when linear model was used.
 
1643
C
 
1644
                IPR=0
 
1645
                PG(1)=YBAR
 
1646
C               PG(2) was set above.
 
1647
                DO 120 J=1,K
 
1648
                  X(1,J)=XS(J)-XBAR
 
1649
                  Y(J)=YS(J)
 
1650
                  W(J)=1.
 
1651
  120           CONTINUE
 
1652
C               refine fit:
 
1653
C     Subroutine DLSQ(YP,NPTS,NPARMS,NBLOX,MBLOK,NIX,NARGS,NKARGS,TEST)
 
1654
                CALL DLSQ(YPLIN,K,2,  1,    2,   NIX, 1,    0,   1.E-3)
 
1655
                SLOPE=P(2)
 
1656
                YBAR=P(1)
 
1657
C
 
1658
                YMAX=-3.E33
 
1659
                YMIN=3.E33
 
1660
C
 
1661
                DO 130 J=JBGN,JEND
 
1662
                    IF (KBND(J).NE.NB) GO TO 130
 
1663
C                   subtract fitted sky:
 
1664
                    SIGNAL(J)=SIGNAL(J)-((DJOBS(J)-XBAR)*SLOPE+YBAR)
 
1665
                    IF (DTYPE(J).EQ.'Y') THEN
 
1666
                        YMAX=MAX(YMAX,SIGNAL(J))
 
1667
                        YMIN=MIN(YMIN,SIGNAL(J))
 
1668
                    END IF
 
1669
  130           CONTINUE
 
1670
C
 
1671
C               plot sky resids.
 
1672
C
 
1673
                CALL NEED(24)
 
1674
                CARD(:26)='Sky resids.  vs. TIME for'
 
1675
                CARD(27:)=BANDS(NB)
 
1676
                CALL TV(CARD)
 
1677
C               set plot limits....
 
1678
                XLIMS(1)=DJOBS(JMIN)
 
1679
                XLIMS(2)=DJOBS(JMAX)
 
1680
                YLIMS(1)=YMIN
 
1681
                YLIMS(2)=YMAX
 
1682
                CALL PLOT(0,XLIMS,YLIMS,'L')
 
1683
                DO 140 J=JBGN,JEND
 
1684
                   IF (KBND(J).NE.NB) GO TO 140
 
1685
                   CALL PLOT(-1,DJOBS(J),SIGNAL(J),'*')
 
1686
  140           CONTINUE
 
1687
C               force plot:
 
1688
                CALL PLOT(1,0.,0.,'+')
 
1689
                CALL RTNCON('     Time (decimal days) -->',28)
 
1690
                GO TO 999
 
1691
C
 
1692
            ELSE IF (A1.EQ.'M') THEN
 
1693
C               go on.
 
1694
C
 
1695
            ELSE IF (A1.EQ.'R') THEN
 
1696
                GO TO 2
 
1697
C
 
1698
            ELSE IF (A1.EQ.'H') THEN
 
1699
                CALL SPACE2
 
1700
                CALL TV('Reply M to detect bad sky measurements.')
 
1701
                CALL TV('Reply T to use a neighboring sky sample,')
 
1702
                CALL TVN('either before, after, or nearest the star.')
 
1703
                CALL SPACE2
 
1704
                GO TO 100
 
1705
C
 
1706
            ELSE
 
1707
                GO TO 100
 
1708
            END IF
 
1709
        ELSE IF (K.EQ.1) THEN
 
1710
            CALL TV('Only 1 datum available for this night!')
 
1711
            CALL SPACE2
 
1712
            DO 150 J=JBGN,JEND
 
1713
C               subtract sky:
 
1714
                IF (KBND(J).EQ.NB)
 
1715
     1              SIGNAL(J)=SIGNAL(J)-SIGMIN
 
1716
  150       CONTINUE
 
1717
C           skip plot.
 
1718
            GO TO 999
 
1719
        ELSE
 
1720
            CALL TV('NO SKY DATA AVAILABLE for this night')
 
1721
            Call ASK('Do you want to continue?',A1)
 
1722
            IF (A1.EQ.'Y') THEN
 
1723
               RETURN
 
1724
            ELSE
 
1725
               CALL STSEPI
 
1726
            END IF
 
1727
        END IF
 
1728
C
 
1729
C
 
1730
C       Now  *****  MODEL  *****  and interpolate sky.
 
1731
C
 
1732
        IPR=0
 
1733
        NPTS=K
 
1734
C       remove const. term:
 
1735
        NIX=1
 
1736
        IX(1)=1
 
1737
        PG(1)=0.
 
1738
C       set up diaphragm factors:
 
1739
        NPARMS=11
 
1740
        NN=0
 
1741
        NREFDIA=0
 
1742
        DO 157 K=12,11+NDIAS
 
1743
           PG(K)=1.
 
1744
           NDIA=K-11
 
1745
               WRITE(CARD,*)NDIA2NP(NDIA,1),' data in dia.',DIANAM(NDIA)
 
1746
               CALL TV(CARD)
 
1747
C          Set NPARMS to largest one actually used.
 
1748
           IF (NDIA2NP(NDIA,1).GT.0) NPARMS=K
 
1749
C          Find leading diaphragm...
 
1750
           IF (NDIA2NP(NDIA,1).GT.NN) THEN
 
1751
C             flag NDIA as possible NREFDIA.
 
1752
              NN=NDIA2NP(NDIA,1)
 
1753
              NREFDIA=NDIA
 
1754
           END IF
 
1755
  157   CONTINUE
 
1756
C
 
1757
C
 
1758
C       Plot star haloes:
 
1759
        K=0
 
1760
        DO 160 J=1,NPTS
 
1761
           IF (X(4,J).GT.0.) THEN
 
1762
             K=K+1
 
1763
             XS(K)=X(4,J)
 
1764
             YS(K)=Y(J)
 
1765
           END IF
 
1766
  160   CONTINUE
 
1767
        CALL ROBLIN(XS,YS,K,  XBAR, YBAR, SLOPE)
 
1768
C       Fraction of star included:
 
1769
        IF (SLOPE.GT.0. .AND. SLOPE.LT.0.01) THEN
 
1770
          CALL SORT2(XS,YS,K)
 
1771
          ZM=XS(K)
 
1772
C         ZM is max. value of XS.
 
1773
          CALL NEED(24)
 
1774
          CALL CENTER('Sky vs. corresponding Star signal:')
 
1775
          CALL TVN('    Sky')
 
1776
          CALL PLOT(-K,XS,YS,' ')
 
1777
          CALL PLOT(0,0.,0.,'O')
 
1778
          DO 165 J=1,20
 
1779
             XM=J*ZM/20.
 
1780
             YM=YBAR+SLOPE*(XM-XBAR)
 
1781
             CALL PLOT(-1,XM,YM,'+')
 
1782
  165     CONTINUE
 
1783
          CALL PLOT(0,0.,1.,'O')
 
1784
          DO 166 J=1,NPTS
 
1785
            IF (X(4,J).EQ.0.) GO TO 166
 
1786
            CALL PLOT(-1,X(4,J),Y(J),SYMB(J))
 
1787
  166     CONTINUE
 
1788
          CALL PLOT(1,0.,0.,'+')
 
1789
          CARD='   Star signal -->      (Sky is 0.xxxx of Star)'
 
1790
          WRITE (CARD(32:38),'(F7.4)') SLOPE
 
1791
          CALL RTNCON(CARD,49)
 
1792
        ELSE
 
1793
          CALL TV('Contribution of star to sky measures not detected.')
 
1794
          SLOPE=0.
 
1795
        END IF
 
1796
C
 
1797
C       Set default order:
 
1798
        DO 167 J=1,10
 
1799
           LORDER(J)=J
 
1800
  167   CONTINUE
 
1801
C
 
1802
C       estimate PG's:
 
1803
C
 
1804
        PG(11)=SLOPE
 
1805
C
 
1806
C       Start for dark sky:
 
1807
C         Fit rough line to dark sky:
 
1808
          K=0
 
1809
          DO 170 J=1,NPTS
 
1810
            IF (KX(1,J).EQ.0) THEN
 
1811
C             Add to new list:
 
1812
              K=K+1
 
1813
              XS(K)=X(1,J)
 
1814
              YS(K)=Y(J) - PG(11)*X(4,J)
 
1815
C             set initial wt.:
 
1816
              W(J)=1.
 
1817
            ELSE
 
1818
C             zero weights if Moon is up, or twilight:
 
1819
              W(J)=0.
 
1820
            END IF
 
1821
  170     CONTINUE
 
1822
          NN=K
 
1823
C
 
1824
        IF (NPTS-MOONUP-NTWI.GT.6 .AND. AIRMAX.GT.1.5) THEN
 
1825
C             Debugging:
 
1826
C             CALL TV('DATA:')
 
1827
C             CALL PLOT(-NN,XS,YS,'*')
 
1828
C         NN data now set for moonless part.
 
1829
C
 
1830
          OLDVAR=3.E33
 
1831
          NFIT=1
 
1832
C         Set order of relaxation:
 
1833
          LORDER(3)=4
 
1834
          LORDER(4)=5
 
1835
          LORDER(5)=3
 
1836
C
 
1837
C         Fit line to data vs. airmass:
 
1838
          CALL ROBLIN(XS,YS,NN, XBAR,YBAR,SLOPE)
 
1839
C             Debugging:
 
1840
C             DO 174 K=1,NN
 
1841
C               CALL PLOT(-1, XS(K), YBAR+SLOPE*(XS(K)-XBAR),'-')
 
1842
C 174         CONTINUE
 
1843
C             CALL PLOT(1,0.,0.,'+')
 
1844
C             CALL RTNCON('  AIRMASS -->',13)
 
1845
          PG(2)=YBAR/XBAR
 
1846
C
 
1847
          IF (YBAR.LE.XBAR*SLOPE) THEN
 
1848
C           Negative or zero intercept; form can't be fit.
 
1849
C                             CALL TV('Negative intercept.')
 
1850
            PG(3)=0.D0
 
1851
            PG(4)=0.D0
 
1852
            PG(5)=0.D0
 
1853
          ELSE
 
1854
C           Positive intercept; OK.
 
1855
            IF (SLOPE.GT.0.5*YBAR/XBAR) THEN
 
1856
C             P(4) is small.
 
1857
C                             CALL TV('P(4) small.')
 
1858
              PG(4)=(SQRT(YBAR/(XBAR*SLOPE))-1.)/XBAR
 
1859
              PG(5)=PG(4)**2
 
1860
            ELSE
 
1861
C             P(4) is big.
 
1862
C                             CALL TV('P(4) big; using P(5).')
 
1863
              PG(4)=1./XBAR
 
1864
              PG(5)=(YBAR/XBAR-SLOPE)/((YBAR+SLOPE*XBAR)*XBAR)
 
1865
              PG(2)=(YBAR/XBAR+YBAR*PG(4)+YBAR*XBAR*PG(5))
 
1866
              LORDER(3)=5
 
1867
              LORDER(4)=4
 
1868
            END IF
 
1869
          END IF
 
1870
C                     Override trial line with a priori values:
 
1871
                      PG(4)=EXTIN(NB)
 
1872
                      PG(5)=0.5*PG(4)*PG(4)
 
1873
                      PG(2)=YBAR/(1.+(PG(4)+PG(5)*XBAR)*XBAR)
 
1874
        ELSE
 
1875
C         Not enough data or range to fit.
 
1876
                              CALL TV('Can''t fit dark sky.')
 
1877
          PG(2)=YMIN*2.
 
1878
          PG(4)=EXTIN(NB)
 
1879
          PG(5)=0.5*PG(4)*PG(4)
 
1880
        END IF
 
1881
        PG(3)=PG(5)*PG(2)*0.1
 
1882
        ZENITH=PG(1)+(PG(2)+PG(3))/(1.+PG(4)+PG(5))
 
1883
        IF (NPTS-MOONUP-NTWI.LT.6) GO TO 200
 
1884
C
 
1885
C       PG's now set.
 
1886
C
 
1887
C       hold all fixed but P(2):
 
1888
        DO 180 J=2,11
 
1889
          CALL FIXP(J,PG(J),NIX)
 
1890
  180   CONTINUE
 
1891
        CALL UNFIXP(2,NIX)
 
1892
C
 
1893
C       Relax successive parameters:
 
1894
        DO 190 L=3,6
 
1895
           CARD='Solving for x sky parameters...'
 
1896
C          IF(L.EQ.3) CARD(24:24)=' '
 
1897
           WRITE(CARD(12:13),'(I2)') L-1
 
1898
           CALL TV(CARD)
 
1899
           IF (NPTS+NIX.LT.NPARMS+4) GO TO 191
 
1900
C
 
1901
C          Fix all sky parms.:
 
1902
           DO 181 K=1,11
 
1903
             IX(K)=K
 
1904
  181      CONTINUE
 
1905
           NIX=11
 
1906
           IF (NDIAS.GT.0) THEN
 
1907
C             Fix reference diaphragm:
 
1908
              K=NREFDIA+11
 
1909
              CALL FIXP(K,PG(K),NIX)
 
1910
C                    Debugging:
 
1911
C                    WRITE(CARD,*)'Holding PG(',K,') at',PG(K)
 
1912
C                    CALL TV(CARD)
 
1913
           END IF
 
1914
C
 
1915
C          See if we can release P(11), the star fraction:
 
1916
           IF (NPTS.GT.2*MOONUP) CALL UNFIXP(11,NIX)
 
1917
C
 
1918
C         First, vary ONLY the new parameter.
 
1919
          CALL UNFIXP(LORDER(L-1),NIX)
 
1920
C
 
1921
C      Subroutine DLSQ(YP,NPTS,NPARMS,NBLOX,MBLOK,NIX,NARGS,NKARGS,TEST)
 
1922
          CALL DLSQ(YPSKY,NPTS,NPARMS, 1,  NPARMS,NIX, 4,    2,   1.E-3)
 
1923
C
 
1924
C          Next, see if result is acceptable:
 
1925
           IF (WVAR.GT.0.D0) PG(LORDER(L-1))=P(LORDER(L-1))
 
1926
C          Check each case individually:
 
1927
           IF (P(2).LT.0.D0) CALL FIXP(2,0.,NIX)
 
1928
           IF (P(3).LT.0.D0) CALL FIXP(3,0.,NIX)
 
1929
           IF (P(5).LT.0.D0) CALL FIXP(5,0.,NIX)
 
1930
           IF (P(11).LT.0.D0) CALL FIXP(11,0.,NIX)
 
1931
C
 
1932
           DO 182 K=3,L
 
1933
              CALL UNFIXP(LORDER(K-1),NIX)
 
1934
  182      CONTINUE
 
1935
C
 
1936
C      Subroutine DLSQ(YP,NPTS,NPARMS,NBLOX,MBLOK,NIX,NARGS,NKARGS,TEST)
 
1937
          CALL DLSQ(YPSKY,NPTS,NPARMS, 1,  NPARMS,NIX, 4,    2,   1.E-3)
 
1938
C
 
1939
C         Give up if solution failed:
 
1940
          IF (WVAR.EQ.0.D0 .OR. WVAR.GT.1.2*OLDVAR) GO TO 189
 
1941
C
 
1942
C         Debugging:
 
1943
C             CALL TV('DATA:')
 
1944
C             CALL PLOT(-NN,XS,YS,'*')
 
1945
C             DO 184 K=1,NPTS
 
1946
C               remember that YC is DP...
 
1947
C               IF (W(K).GT.0.) CALL PLOT(-1,X(1,K),REAL(YC(K)),'C')
 
1948
C 184         CONTINUE
 
1949
C             CALL PLOT(1,0.,0.,'+')
 
1950
C             CALL RTNCON('  AIRMASS -->',13)
 
1951
C
 
1952
C         Check solution for plausibility:
 
1953
          IF (P(2).LE.0.D0 .OR. P(3).LT.0.D0 .OR. P(5).LT.0.D0 .OR.
 
1954
     1       (P(4).LT.0.D0 .AND. P(4)*P(4).GE.4.D0*P(5)) .OR.
 
1955
     2       (P(4).GT.100.D0 .OR. P(5).GE.100.D0) .OR.
 
1956
     3       (P(11).GT.0.01D0 .OR. P(11).LT.0.D0) ) THEN
 
1957
C            Trouble.
 
1958
             GO TO 189
 
1959
          ELSE
 
1960
C            OK.
 
1961
          END IF
 
1962
C
 
1963
C         Adjust weights of moonless data:
 
1964
          ZENITH=PG(1)+(PG(2)+PG(3))/(1.+PG(4)+PG(5))
 
1965
          DO 185 K=1,NPTS
 
1966
            IF (KX(1,K).EQ.0) W(K)=EXPTIM(KX(3,K))/(ABS(YC(K)) + ZENITH)
 
1967
  185     CONTINUE
 
1968
C         Update parameters:
 
1969
          DO 187 K=1,5
 
1970
             PG(K)=P(K)
 
1971
             ERRSAVE(K)=SP(K)
 
1972
C             WRITE(CARD,'(''P('',I2,'') ='',G9.2)') K,P(K)
 
1973
C             CALL TV(CARD)
 
1974
C             WRITE(CARD,'(4X,''+/-'',G9.2)') SP(K)
 
1975
C             CALL TVN(CARD)
 
1976
  187     CONTINUE
 
1977
C         Star wings:
 
1978
          PG(11)=P(11)
 
1979
C          IF (SP(11).GT.0.) THEN
 
1980
C             WRITE(CARD,'(''P(11) ='',G9.2)') P(11)
 
1981
C             CALL TV(CARD)
 
1982
C             WRITE(CARD,'(4X,''+/-'',G9.2)') SP(11)
 
1983
C             CALL TVN(CARD)
 
1984
C          END IF
 
1985
C         Diaphragms:
 
1986
          DO 188 K=12,NPARMS
 
1987
             IF (P(K).GT.0.) PG(K)=P(K)
 
1988
  188     CONTINUE
 
1989
          NFIT=NPARMS-NIX
 
1990
          WRITE(CARD,'(I5,A)') NFIT,'-parameter fit accepted.'
 
1991
          CALL TV(CARD)
 
1992
          OLDVAR=WVAR
 
1993
C         Release next parameter and try again.
 
1994
  189     CALL UNFIXP(LORDER(L),NIX)
 
1995
  190   CONTINUE
 
1996
C
 
1997
  191   CONTINUE
 
1998
C
 
1999
C       Plot fit:
 
2000
        CALL SPACE
 
2001
        CALL NEED(24)
 
2002
        WRITE (CARD,'(A,I3,A,I4,2A)')
 
2003
     1    'Fit',NFIT,' parameters to',NN,' dark-sky data in ',BANDS(NB)
 
2004
        CALL CENTER(CARD)
 
2005
        CALL TVN('    Sky')
 
2006
        ZENITH=PG(1)+(PG(2)+PG(3))/(1.+PG(4)+PG(5))
 
2007
C       Reserve space:
 
2008
        XLIMS(1)=1.0
 
2009
        XLIMS(2)=AIRMAX
 
2010
        YLIMS(1)=0.7*ZENITH
 
2011
        XM=SQRT(AIRMAX)
 
2012
        YLIMS(2)=1.4*MAX(ZENITH, PG(1)+((PG(2)+AIRMAX*PG(3))*AIRMAX)/
 
2013
     1                             (1.+AIRMAX*(PG(4)+AIRMAX*PG(5))),
 
2014
     2         PG(1)+((PG(2)+XM*PG(3))*XM)/(1.+XM*(PG(4)+XM*PG(5))))
 
2015
        CALL PLOT(0,XLIMS,YLIMS,'L')
 
2016
        CALL PLOT(0,0.,0.,'O')
 
2017
C       Show fitted fcn.:
 
2018
        DO 194 K=1,40
 
2019
           XS(1)=1.+(AIRMAX-1.)*.025*K
 
2020
           YS(1)=PG(1)+((PG(2)+XS(1)*PG(3))*XS(1))/
 
2021
     1                (1.+XS(1)*(PG(4)+XS(1)*PG(5)))
 
2022
           CALL PLOT(-1,XS,YS,'+')
 
2023
  194   CONTINUE
 
2024
        CALL PLOT(0,0.,1.,'O')
 
2025
C       Show data:
 
2026
        DO 195 K=1,NPTS
 
2027
           IF(KX(1,K).EQ.0) CALL PLOT(-1,X(1,K),Y(K)-PG(11)*X(4,K), '*')
 
2028
  195   CONTINUE
 
2029
        CALL PLOT(1,0.,0.,'+')
 
2030
        CALL RTNCON('   Airmass -->',14)
 
2031
C
 
2032
C     Start for MOONLIGHT:
 
2033
C
 
2034
C       Rough estimates for large-airmass parameters:
 
2035
  200   PG(9)=0.35*EXTIN(NB)
 
2036
        PG(10)=EXP(-EXTIN(NB))
 
2037
C
 
2038
C         Fit rough fcn. to lunar aureole:
 
2039
          K=0
 
2040
          DO 210 J=1,NPTS
 
2041
            IF (KX(1,J).EQ.1) THEN
 
2042
C             Add to new list:
 
2043
              K=K+1
 
2044
              XM=X(1,J)+X(2,J)
 
2045
              ZM=X(1,J)*X(2,J)
 
2046
              XS(K)=X(3,J)
 
2047
C                        remove dark-sky component...
 
2048
              YS(K)=(Y(J) - (PG(1)+((PG(2)+X(1,J)*PG(3))*X(1,J))/
 
2049
     1                        (1.+X(1,J)*(PG(4)+X(1,J)*PG(5))))
 
2050
C                     ... remove star halo ...
 
2051
     2                    - PG(11)*X(4,J)
 
2052
C                        ...and scale to unit airmass.
 
2053
     3                  ) * X(3,J)/(X(1,J)*(EXP(-PG(9)*XM)+PG(10)/ZM))
 
2054
C             partial allowance for photon noise:
 
2055
              W(J)=EXPTIM(KX(3,J))/(ABS(Y(J))+ZENITH)
 
2056
            ELSE
 
2057
C             Keep old wt. for dark sky.
 
2058
            END IF
 
2059
  210     CONTINUE
 
2060
C
 
2061
        IF (MOONUP.GT.6 .AND. ELONGMAX-ELONGMIN.GT.0.2) THEN
 
2062
C         Sort on elongation & use bottom of list for aureole:
 
2063
          CALL SORT2(XS,YS,K)
 
2064
          DO 211 J=1,K
 
2065
C            Select points in aureole:
 
2066
             IF (XS(J).GT.1.) GO TO 212
 
2067
  211     CONTINUE
 
2068
C         Whole set is in aureole.  Use 1st half:
 
2069
          J=NPTS/2
 
2070
  212     IF (J.EQ.1) THEN
 
2071
C            No aureole data. Pick something:
 
2072
             J=3
 
2073
          END IF
 
2074
C                      Debugging:
 
2075
C                      WRITE(CARD,*) J,' points in initial fit.'
 
2076
C                      CALL TV(card)
 
2077
C         First J now suitable to estimate PG(6).
 
2078
          CALL ROBLIN(XS,YS,J, XBAR,YBAR,SLOPE)
 
2079
          PG(6)=YBAR-XBAR*SLOPE
 
2080
          PG(7)=SLOPE
 
2081
          IF (PG(6).LT.0.D0) THEN
 
2082
C            Aureole not detectable.
 
2083
             PG(6)=0.D0
 
2084
             PG(7)=YBAR/XBAR
 
2085
          END IF
 
2086
C         Now move down *last* third...
 
2087
          DO 216 J=1,K/3
 
2088
             XS(J)=XS(K-K/3+J)
 
2089
C            ...and divide by elongation.
 
2090
             YS(J)=YS(K-K/3+J)/XS(J)
 
2091
  216     CONTINUE
 
2092
          CALL ROBLIN(XS,YS,K/3, XBAR,YBAR,SLOPE)
 
2093
          PG(8)=MAX(SLOPE,0.)
 
2094
        ELSE
 
2095
C         Not enough data to fit with Moon.
 
2096
          IF (K.GT.0) THEN
 
2097
C           Use median Y:
 
2098
            CALL SORT2(YS,XS,K)
 
2099
            PG(7)=(YS((K+1)/2)+YS(K/2+1))*0.5
 
2100
          ELSE
 
2101
            PG(7)=0.
 
2102
          END IF
 
2103
          PG(6)=0.
 
2104
          PG(8)=0.
 
2105
        END IF
 
2106
C
 
2107
C       PG's now set for moonlight terms.
 
2108
C
 
2109
        IF (ELONGMAX-ELONGMIN.LT.2.) THEN
 
2110
C          Rearrange order of solving:
 
2111
           IF (ELONGMIN.GT.1.5) THEN
 
2112
              LORDER(6)=8
 
2113
              LORDER(8)=10
 
2114
              LORDER(10)=6
 
2115
              IF (ELONGMIN.GT.2.) THEN
 
2116
                 LORDER(7)=9
 
2117
                 LORDER(9)=7
 
2118
              END IF
 
2119
           ELSE IF (ELONGMIN.GT.0.5) THEN
 
2120
              LORDER(6)=7
 
2121
              LORDER(7)=6
 
2122
              IF (ELONGMAX.LT.1.) THEN
 
2123
                 LORDER(7)=9
 
2124
                 LORDER(8)=10
 
2125
                 LORDER(9)=6
 
2126
                 LORDER(10)=8
 
2127
              END IF
 
2128
           ELSE IF (ELONGMAX.LT.1.0) THEN
 
2129
              LORDER(7)=9
 
2130
              LORDER(8)=7
 
2131
              LORDER(9)=10
 
2132
              LORDER(10)=8
 
2133
           END IF
 
2134
        END IF
 
2135
C
 
2136
        OLDVAR=3.E33
 
2137
        NFIT=0
 
2138
        IF (MOONUP.LT.3) GO TO 241
 
2139
        DO 240 J=6,10
 
2140
C          Relax parameters one by one:
 
2141
           DO 221 K=1,11
 
2142
              IX(K)=K
 
2143
  221      CONTINUE
 
2144
           NIX=11
 
2145
           IF (NDIAS.GT.0) THEN
 
2146
C             Fix reference diaphragm:
 
2147
              K=NREFDIA+11
 
2148
              CALL FIXP(K,PG(K),NIX)
 
2149
           END IF
 
2150
C
 
2151
C          Release P(11), the star fraction:
 
2152
           CALL UNFIXP(11,NIX)
 
2153
C
 
2154
           CARD='Solving for x moonlight parameters...'
 
2155
           IF(J.EQ.6) CARD(24:24)=' '
 
2156
           WRITE(CARD(12:13),'(I2)') J-5
 
2157
           CALL TV(CARD)
 
2158
C
 
2159
C          First, vary ONLY the new parameter.
 
2160
           CALL UNFIXP(LORDER(J),NIX)
 
2161
           IF (MOONUP.LT.NPARMS+4-NIX) GO TO 241
 
2162
C
 
2163
C     subroutine DLSQ(YP,NPTS,NPARMS,NBLOX,MBLOK,NIX,NARGS,NKARGS,TEST)
 
2164
           CALL DLSQ(YPSKY,NPTS,NPARMS, 1,NPARMS,NIX, 4,    2,   1.E-3)
 
2165
C
 
2166
C          Next, see if result is acceptable:
 
2167
           IF (WVAR.GT.0.D0) PG(LORDER(J))=P(LORDER(J))
 
2168
C          Check each case individually:
 
2169
           IF (P(6).LT.0.D0) CALL FIXP(6,0.,NIX)
 
2170
           IF (P(8).LT.0.D0) CALL FIXP(8,0.,NIX)
 
2171
           IF (P(9).LT.0.D0) CALL FIXP(9,0.,NIX)
 
2172
           IF (P(10).LT.0.D0) CALL FIXP(10,0.,NIX)
 
2173
           IF (P(9).GT.9.D0 .AND. P(10).EQ.0.D0) CALL FIXP(9,9.,NIX)
 
2174
           IF (P(9).GT.10.D0) CALL FIXP(9,1.,NIX)
 
2175
           IF (P(11).LT.0.D0) CALL FIXP(11,0.,NIX)
 
2176
C
 
2177
C          Then, vary parameters 6 to J.
 
2178
           DO 222 K=6,J
 
2179
              CALL UNFIXP(LORDER(K),NIX)
 
2180
  222      CONTINUE
 
2181
           IF (MOONUP.LT.NPARMS+4-NIX) GO TO 241
 
2182
C
 
2183
C     subroutine DLSQ(YP,NPTS,NPARMS,NBLOX,MBLOK,NIX,NARGS,NKARGS,TEST)
 
2184
           CALL DLSQ(YPSKY,NPTS,NPARMS, 1,NPARMS,NIX, 4,    2,   1.E-3)
 
2185
C
 
2186
C          Re-extract data for plots:
 
2187
           YMAX=-3.E33
 
2188
           YMIN=3.E33
 
2189
           K=0
 
2190
           DO 226 L=1,NPTS
 
2191
             IF (KX(1,L).EQ.1) THEN
 
2192
C              Add to new list:
 
2193
               K=K+1
 
2194
               XS(K)=X(3,L)
 
2195
               XM=X(1,L)+X(2,L)
 
2196
               ZM=X(1,L)*X(2,L)
 
2197
C                         remove dark-sky component...
 
2198
               YS(K)=(Y(L) - (P(1)+((P(2)+X(1,L)*P(3))*X(1,L))/
 
2199
     1                         (1.+X(1,L)*(P(4)+X(1,L)*P(5))))
 
2200
C                ...subtract star halo, and scale to unit airmass.
 
2201
     2           - PG(11)*X(4,L) ) / (X(1,L)*(EXP(-P(9)*XM) + P(10)/ZM))
 
2202
               IF(NDIAS.GT.1) YS(K)=YS(K)/P(KX(2,L)+11)
 
2203
               YMAX=MAX(YMAX,YS(K))
 
2204
               YMIN=MIN(YMIN,YS(K))
 
2205
             END IF
 
2206
  226      CONTINUE
 
2207
           NN=K
 
2208
C
 
2209
C          Skip plotting:
 
2210
C
 
2211
           IF (NIX.GT.0) GO TO 231
 
2212
C
 
2213
C          Fix up plot limits:
 
2214
C
 
2215
           XLIMS(1)=0.1
 
2216
           XLIMS(2)=ELONGMAX
 
2217
C          Adjust for possible outliers:
 
2218
           CALL SORT2(YS,XS,K)
 
2219
C          (Note reversal of Y and X.)
 
2220
           YM=(YS((K+1)/2)+YS(K/2+1))*0.5
 
2221
C          YM is median.
 
2222
           L=(K+2)/4
 
2223
           ZM=YS(K-L)-YS(L)
 
2224
C          ZM is interquartile range.
 
2225
           YMAX=MIN(YMAX,YM+4.*ZM)
 
2226
           YMIN=MAX(YMIN,YM-4.*ZM)
 
2227
           YLIMS(1)=YMIN
 
2228
           YLIMS(2)=YMAX
 
2229
C
 
2230
C          Show result:
 
2231
           CALL SPACE
 
2232
           CALL NEED(24)
 
2233
           WRITE(CARD,'(I5,A,I4,1X,2A)')
 
2234
     1           NPARMS-NIX,'-parameter fit ( + + + ) to',MOONUP,
 
2235
     2           BANDS(NB)(:LWORD(BANDS(NB))),' data ( * ) with Moon'
 
2236
           CALL CENTER(CARD)
 
2237
           CALL TVN('Normalized Sky')
 
2238
           CALL PLOT(0,0.,0.,'O')
 
2239
C          Reserve space:
 
2240
           CALL PLOT(0,XLIMS,YLIMS,'L')
 
2241
           IF (YLIMS(1).LT.0.) CALL XAXIS(XLIMS)
 
2242
C          Plot fit to aureole terms:
 
2243
           DO 230 K=1,40
 
2244
              XM=0.1+(.02+.003*K)*K
 
2245
              YM=(P(6)/XM + P(7) + P(8)*XM)
 
2246
              CALL PLOT(-1,XM,YM,'+')
 
2247
  230      CONTINUE
 
2248
           CALL PLOT(0,0.,1.,'O')
 
2249
           CALL PLOT(NN,XS,YS,'*')
 
2250
           CALL RTNCON('     LUNAR ELONGATION (rad.) -->',32)
 
2251
C
 
2252
C          Give up if solution failed:
 
2253
  231      IF (WVAR.EQ.0.D0 .OR. WVAR.GT.1.2*OLDVAR) GO TO 240
 
2254
C          Tests for plausibility:
 
2255
           IF (P(6).LT.0.D0 .OR. P(8).LT.0.D0 .OR.
 
2256
     1         P(9).LT.0.D0 .OR. P(10).LT.0.D0 .OR.
 
2257
     2        (P(9).GT.10.D0 .AND. P(10).EQ.0.D0) .OR.
 
2258
     3       (P(11).GT.0.01D0 .OR. P(11).LT.0.D0) ) GO TO 240
 
2259
C
 
2260
C          Result accepted.
 
2261
C
 
2262
C          Revise weights:
 
2263
           DO 235 K=1,NPTS
 
2264
C             partial allowance for photon noise:
 
2265
              IF(KX(1,K).EQ.1) W(K)=EXPTIM(KX(3,K))/(ABS(Y(K))+ZENITH)
 
2266
  235      CONTINUE
 
2267
C          Update parameters:
 
2268
           DO 237 K=6,10
 
2269
             PG(K)=P(K)
 
2270
             ERRSAVE(K)=SP(K)
 
2271
C             WRITE(CARD,'(''P('',I2,'') ='',G9.2)') K,P(K)
 
2272
C             CALL TV(CARD)
 
2273
C             WRITE(CARD,'(4X,''+/-'',G9.2)') SP(K)
 
2274
C             CALL TVN(CARD)
 
2275
  237      CONTINUE
 
2276
C          Wings of star image:
 
2277
           IF (P(11).GT.0.D0) PG(11)=P(11)
 
2278
           IF (SP(11).GT.0.) THEN
 
2279
C             WRITE(CARD,'(''P(11) ='',G9.2)') P(11)
 
2280
C             CALL TV(CARD)
 
2281
C             WRITE(CARD,'(4X,''+/-'',G9.2)') SP(11)
 
2282
C             CALL TVN(CARD)
 
2283
           END IF
 
2284
C         Diaphragms:
 
2285
          DO 238 K=12,NPARMS
 
2286
             IF (P(K).GT.0.) PG(K)=P(K)
 
2287
  238     CONTINUE
 
2288
C
 
2289
           NFIT=NPARMS-NIX
 
2290
           WRITE(CARD,'(I5,A)') NFIT,'-parameter fit accepted.'
 
2291
           CALL TV(CARD)
 
2292
           OLDVAR=WVAR
 
2293
C
 
2294
  240   CONTINUE
 
2295
C
 
2296
C       Re-extract data for final plot:
 
2297
  241   YMAX=-3.E33
 
2298
        YMIN=3.E33
 
2299
        K=0
 
2300
        DO 244 L=1,NPTS
 
2301
          IF (KX(1,L).EQ.1) THEN
 
2302
C           Add to new list:
 
2303
            K=K+1
 
2304
            XS(K)=X(3,L)
 
2305
            XM=X(1,L)+X(2,L)
 
2306
            ZM=X(1,L)*X(2,L)
 
2307
C                      remove dark-sky component...
 
2308
            YS(K)=(Y(L) - (PG(1)+((PG(2)+X(1,L)*PG(3))*X(1,L))/
 
2309
     1                       (1.+X(1,L)*(PG(4)+X(1,L)*PG(5))))
 
2310
C           ...subtract star halo, and scale to unit airmass.
 
2311
     2         - PG(11)*X(4,L) ) / (X(1,L)*(EXP(-PG(9)*XM) + PG(10)/ZM))
 
2312
            YMAX=MAX(YMAX,YS(K))
 
2313
            YMIN=MIN(YMIN,YS(K))
 
2314
          END IF
 
2315
  244   CONTINUE
 
2316
C
 
2317
C       Fix up plot limits:
 
2318
        XLIMS(1)=ELONGMIN
 
2319
        XLIMS(2)=ELONGMAX
 
2320
        IF (K.EQ.0) GO TO 300
 
2321
C       Adjust for possible outliers:
 
2322
        CALL SORT2(YS,XS,K)
 
2323
C       (Note reversal of Y and X.)
 
2324
        YM=(YS((K+1)/2)+YS(K/2+1))*0.5
 
2325
C       YM is median.
 
2326
        L=(K+2)/4
 
2327
        ZM=YS(K-L)-YS(L)
 
2328
C       ZM is interquartile range.
 
2329
        YMAX=MIN(YMAX,YM+3.*ZM)
 
2330
        YMIN=MAX(YMIN,YM-3.*ZM)
 
2331
        IF (YMAX.EQ.YMIN) GO TO 300
 
2332
        YLIMS(1)=YMIN
 
2333
        YLIMS(2)=YMAX
 
2334
C
 
2335
C       Show result:
 
2336
        CALL SPACE
 
2337
        CALL NEED(24)
 
2338
        WRITE(CARD,'(I5,A,I4,1X,2A)')
 
2339
     1           NFIT,'-parameter fit ( + + + ) to',MOONUP,
 
2340
     2           BANDS(NB)(:LWORD(BANDS(NB))),' data ( * ) with Moon'
 
2341
        CALL CENTER(CARD)
 
2342
        CALL TVN('Normalized Sky')
 
2343
        CALL PLOT(0,0.,0.,'O')
 
2344
C       Reserve space:
 
2345
        CALL PLOT(0,XLIMS,YLIMS,'L')
 
2346
        IF (YLIMS(1).LT.0.) CALL XAXIS(XLIMS)
 
2347
C       Plot fit to aureole terms:
 
2348
        DO 250 K=1,40
 
2349
           XM=ELONGMIN+(ELONGMAX-ELONGMIN)*(.02+.003*K)*K
 
2350
           YM=(PG(6)/XM + PG(7) + PG(8)*XM)
 
2351
           CALL PLOT(-1,XM,YM,'+')
 
2352
  250   CONTINUE
 
2353
        CALL PLOT(0,0.,1.,'O')
 
2354
        CALL PLOT(NN,XS,YS,'*')
 
2355
        CALL RTNCON('     LUNAR ELONGATION (rad.) -->',32)
 
2356
C
 
2357
  300   CONTINUE
 
2358
C
 
2359
C
 
2360
C   Now display fitted equation:
 
2361
C
 
2362
        DO 310 J=1,10
 
2363
          SP(J)=ERRSAVE(J)
 
2364
  310   CONTINUE
 
2365
        CALL SKYEQN(PG,SP,CARD)
 
2366
C
 
2367
C
 
2368
C   Don't forget diaphragm scaling:
 
2369
C
 
2370
        IF (NPARMS.GT.11) THEN
 
2371
          CALL SPACE
 
2372
          CALL TV('Diaphragm scaling:')
 
2373
        END IF
 
2374
        DO 320 J=12,NPARMS
 
2375
          WRITE(CARD,'(A,F7.3,'' +/-'',F7.3)') DIANAM(J-11),P(J),SP(J)
 
2376
          CALL TV(CARD)
 
2377
  320   CONTINUE
 
2378
C
 
2379
C
 
2380
C   Now display overall fit:
 
2381
C
 
2382
C       Hold all fixed; evaluate YC's:
 
2383
        DO 355 K=1,NPARMS
 
2384
           IX(K)=K
 
2385
  355   CONTINUE
 
2386
        NIX=NPARMS
 
2387
C
 
2388
C     subroutine DLSQ(YP,NPTS,NPARMS,NBLOX,MBLOK,NIX,NARGS,NKARGS,TEST)
 
2389
           CALL DLSQ(YPSKY,NPTS,NPARMS, 1, NPARMS,NIX, 4,    2,   1.E-1)
 
2390
C
 
2391
        CALL SPACE
 
2392
        CALL NEED(24)
 
2393
        CARD='Measured vs. model ( + + ) sky brightness in '//BANDS(NB)
 
2394
        CARD(LWORD(CARD)+1:)=':'
 
2395
        CALL CENTER(CARD)
 
2396
        CALL TVN('Observed sky')
 
2397
        XLIMS(1)=3.E33
 
2398
        YLIMS(1)=0.
 
2399
        YLIMS(2)=0.
 
2400
        K=0
 
2401
        DO 360 J=1,NPTS
 
2402
C          omit twilight.
 
2403
           IF (KX(1,J).LT.0) GO TO 360
 
2404
           K=K+1
 
2405
           XS(K)=YC(J)
 
2406
           YS(K)=Y(J)
 
2407
           XLIMS(1)=MIN(XLIMS(1),XS(K))
 
2408
           IF (KX(1,J).EQ.0) THEN
 
2409
             SYMB(K)='*'
 
2410
           ELSE IF (KX(1,J).EQ.1) THEN
 
2411
             SYMB(K)='M'
 
2412
C          ELSE IF (KX(1,J).EQ.-1) THEN
 
2413
C            SYMB(K)='t'
 
2414
           ELSE
 
2415
             SYMB(K)='?'
 
2416
           END IF
 
2417
  360   CONTINUE
 
2418
        CALL SORT2(XS,YS,K)
 
2419
        IF (XS(K).LT.2.*XS(K-1)) THEN
 
2420
          XLIMS(2)=XS(K)
 
2421
        ELSE
 
2422
          XLIMS(2)=XS(K-1)
 
2423
        END IF
 
2424
        YLIMS(1)=0.8*XLIMS(1)
 
2425
        YLIMS(2)=1.2*XLIMS(2)
 
2426
        CALL PLOT(0,XLIMS,YLIMS,'L')
 
2427
C       Draw unit diagonal:
 
2428
        DO 370 J=1,20
 
2429
           XM=J*XLIMS(2)/20.
 
2430
           CALL PLOT(-1,XM,XM,'+')
 
2431
  370   CONTINUE
 
2432
        CALL PLOT(0,0.,0.,'D')
 
2433
        CALL PLOT(K,XS,YS,SYMB)
 
2434
        CALL RTNCON('     Calculated sky -->',23)
 
2435
C
 
2436
C       Plot star halo resids.:
 
2437
C
 
2438
        CALL SPACE
 
2439
        CALL NEED(24)
 
2440
        CARD='Residuals vs. Star signal in '//BANDS(NB)
 
2441
        CARD(LWORD(CARD)+1:)=':'
 
2442
        CALL CENTER(CARD)
 
2443
        CALL TVN('  Residual')
 
2444
        XLIMS(1)=0.
 
2445
        YLIMS(1)=0.
 
2446
        YLIMS(1)=0.
 
2447
        YLIMS(2)=0.
 
2448
        K=0
 
2449
        DO 380 J=1,NPTS
 
2450
           IF (KX(1,J).LT.0) GO TO 380
 
2451
           K=K+1
 
2452
           XS(K)=X(4,J)
 
2453
           YS(K)=Y(J)-YC(J)
 
2454
           XLIMS(2)=MAX(XLIMS(2),XS(K))
 
2455
           YLIMS(1)=MIN(YLIMS(1),YS(K))
 
2456
           YLIMS(2)=MAX(YLIMS(2),YS(K))
 
2457
  380   CONTINUE
 
2458
        CALL PLOT(0,XLIMS,YLIMS,'L')
 
2459
        CALL XAXIS(XLIMS)
 
2460
        CALL PLOT(K,XS,YS,SYMB)
 
2461
        CALL PLOT(0,0.,0.,'S')
 
2462
        CARD='   Star signal -->      (Sky is 0.xxxx of Star)'
 
2463
        WRITE (CARD(32:38),'(F7.4)') PG(11)
 
2464
        CALL RTNCON(CARD,49)
 
2465
C
 
2466
C       Plot resids. vs. time:
 
2467
C
 
2468
        CALL SPACE
 
2469
        CALL NEED(24)
 
2470
        CARD='O/C Ratio vs. Time in '//BANDS(NB)
 
2471
        CARD(LWORD(CARD)+1:)=':'
 
2472
        CALL CENTER(CARD)
 
2473
        CALL TVN('   Ratio')
 
2474
        XLIMS(1)=DJOBS(JDUSK)
 
2475
        XLIMS(2)=DJOBS(JDAWN)
 
2476
        YLIMS(1)=0.6
 
2477
        YLIMS(2)=1.5
 
2478
        CALL PLOT(0,XLIMS,YLIMS,'L')
 
2479
C       Draw "axis" at 1.0:
 
2480
        DO 388 J=1,80
 
2481
           XM=XLIMS(1)+(XLIMS(2)-XLIMS(1))*J/80.
 
2482
           CALL PLOT(-1,XM,1.,'-')
 
2483
  388   CONTINUE
 
2484
        DO 390 J=1,NPTS
 
2485
           IF (KX(1,J).LT.0) GO TO 390
 
2486
           IF (YC(J).EQ.0.D0) YC(J)=1.E-6
 
2487
           CALL PLOT(-1,DJOBS(KX(3,J)),Y(J)/REAL(YC(J)),SYMB(J))
 
2488
  390   CONTINUE
 
2489
C       force plot:
 
2490
        CALL PLOT(1,10.,0.,'+')
 
2491
        WRITE(CARD,'(A,F7.0)')'    TIME (MJD =',DTZERO(NIGHT)
 
2492
        CARD(LWORD(CARD):)=' + decimal of day) -->'
 
2493
        CALL RTNCON(CARD,LWORD(CARD))
 
2494
C
 
2495
C
 
2496
C    List outliers:
 
2497
C
 
2498
        CALL SPACE2
 
2499
        CALL NEED(10)
 
2500
        CARD='Sky anomalies in '//BANDS(NB)
 
2501
        WRITE(CARD(LWORD(CARD)+2:),'(''on MJD'',F7.0)')
 
2502
     1       DTZERO(NIGHT)+INT(DJOBS((JBGN+JEND)/2))
 
2503
        CALL TV(CARD)
 
2504
        CARD='DECIMAL    SKY      LUNAR     LUNAR    STELLAR'
 
2505
        CARD(52:)='SKY       SKY       O/C'
 
2506
        CALL TV(CARD)
 
2507
        CARD='  DAY    AIRMASS   AIRMASS  ELONGATION  SIGNAL  OBSERVED'
 
2508
        CARD(59:)='CALCULATED  RATIO'
 
2509
        CALL TVN(CARD)
 
2510
        WRITE(CARD,'(''------'',7(3X,''-------''))')
 
2511
        CALL TVN(CARD)
 
2512
        NN=0
 
2513
        DO 450 J=1,NPTS
 
2514
          IF (KX(1,J).GE.0 .AND.
 
2515
     1        W(J)*(Y(J)-REAL(YC(J)))**2 .GT. SCALE*36.) THEN
 
2516
            WRITE(CARD,'(F6.4,F9.3,2F10.3,1PE12.2,0P2F10.3,F8.3)')
 
2517
     1           DJOBS(KX(3,J)),(X(K,J),K=1,4),Y(J),YC(J),Y(J)/YC(J)
 
2518
            IF (KX(1,J).NE.1) THEN
 
2519
               CARD(20:35)='   -         -'
 
2520
            END IF
 
2521
            CALL TVN(CARD)
 
2522
            NN=NN+1
 
2523
          END IF
 
2524
  450   CONTINUE
 
2525
        IF (NN.EQ.0) THEN
 
2526
           CALL TV('   (none)')
 
2527
        ELSE
 
2528
           WRITE(CARD,'(I3,'' anomalous sky data'')') NN
 
2529
           IF (NN.EQ.1) CARD(22:23)='um'
 
2530
           CALL TV(CARD)
 
2531
        END IF
 
2532
C
 
2533
C
 
2534
C    Ask for approval:
 
2535
C
 
2536
  500   CARD=
 
2537
     1    'Do you want to subtract the fitted model from stellar data?'
 
2538
        CALL ASK(CARD,A1)
 
2539
        IF (A1.EQ.'Y' .OR. A1.EQ.'O') THEN
 
2540
C         Go on.
 
2541
        ELSE IF (A1.EQ.'N') THEN
 
2542
C         Take short-cut to 110.
 
2543
          SHORT=.TRUE.
 
2544
          GO TO 3
 
2545
        ELSE IF (A1.EQ.'R') THEN
 
2546
          GO TO 2
 
2547
        ELSE IF (A1.EQ.'H') THEN
 
2548
          IF (NPTS.GT.20*NN .AND. SCALE.LT.0.1*ZENITH) THEN
 
2549
C            Clearly a good fit.
 
2550
             CALL TV('     YES, that''s a good fit.')
 
2551
          ELSE IF (NPTS.LT.10*NN .OR. SCALE.GT.0.2*ZENITH) THEN
 
2552
C            Clearly a bad fit.
 
2553
             CALL TV('     NO, that''s a POOR fit.')
 
2554
          ELSE
 
2555
C            Not clear.
 
2556
             CALL SPACE
 
2557
             WRITE(CARD,'(I5,''% rejects; typical residual is'',F5.2)')
 
2558
     1              (NN*100+NPTS/2)/NPTS,SCALE/ZENITH
 
2559
             CARD(LWORD(CARD)+2:)='of zenith brightness.'
 
2560
             CALL TV(CARD)
 
2561
             CALL TV('Hard to say.  You may want to try it both ways,')
 
2562
             CALL TVN('and compare the results.')
 
2563
          END IF
 
2564
          GO TO 500
 
2565
        ELSE
 
2566
          CALL SPACE2
 
2567
          CALL TV('Enter either YES or NO, or')
 
2568
          CALL TVN('H for Help, or R to Re-display plots.')
 
2569
          GO TO 500
 
2570
        END IF
 
2571
C
 
2572
C
 
2573
C     Now subtract sky fit from data:
 
2574
C
 
2575
C    JBGN, JEND index the first and last data of ANY kind for the night.
 
2576
C    JMIN, JMAX index the first and last SKY data for the night & band.
 
2577
C
 
2578
C
 
2579
        IF (NTWI.GT.0) THEN
 
2580
          CALL TV('Using nearest-neighbor subtraction in twilight...')
 
2581
          CALL SKYNBR(NB,DTYPE,KDIAPHRAGM,JBGN,JDUSK)
 
2582
          CALL SKYNBR(NB,DTYPE,KDIAPHRAGM,JDAWN,JEND)
 
2583
        END IF
 
2584
C
 
2585
C       Subtract fitted fcn. from rest:
 
2586
        CALL TV('Using fitted model...')
 
2587
        DO 600 J=JDUSK,JDAWN
 
2588
           IF (NB.NE.KBND(J)) GO TO 600
 
2589
           Z(1)=AIRM(J)
 
2590
           IF ( (RISE.LT.SET  .AND.
 
2591
     1               DJOBS(J).GT.RISE .AND. DJOBS(J).LT.SET) .OR.
 
2592
     2               (RISE .GT.SET  .AND.
 
2593
     3               (DJOBS(J).GT.RISE .OR. DJOBS(J).LT.SET) )  ) THEN
 
2594
C               Moon is up.
 
2595
                KZ(1)=1
 
2596
                T=(DTZERO(NIGHT)-51544.5D0+DJOBS(J))/36525.
 
2597
                UTRAD=MOD(DJOBS(J),1.)*TWOPI
 
2598
                TLST=STUTZ+(UTRAD*1.00273791)+ELONG
 
2599
C               MOON uses T for lunar position, TLST for topocentric ephemeris.
 
2600
                CALL MOON(T, TLST)
 
2601
C               MOON returns lunar coords. in RASUN, DESUN in /CSUN/.
 
2602
                HAMOON=TLST-RASUN
 
2603
                COSDEL=COS(DESUN)
 
2604
                SINDEL=SIN(DESUN)
 
2605
                COSHA=COS(HAMOON)
 
2606
                XM= -COSDEL*SIN(HAMOON)
 
2607
                YM=COSPHI*SINDEL-SINPHI*COSDEL*COSHA
 
2608
                ZM=SINPHI*SINDEL+COSPHI*COSDEL*COSHA
 
2609
                IF (ZM.GT.0.) THEN
 
2610
C                  Set Z(2) to LUNAR airmass.
 
2611
                   Z(2)=1./ZM
 
2612
                ELSE
 
2613
C                  Moon below horizon.
 
2614
                   Z(2)=100.
 
2615
                END IF
 
2616
                AZMOON=ATAN2(YM,XM)
 
2617
                DELAZ=AZMOON-AZIM(J)
 
2618
C               approximate cosz(sky) as 1/airmass.
 
2619
                COSEL=ZM/AIRM(J) +
 
2620
     1               SQRT((1.-ZM*ZM)*(1.-1./AIRM(J)**2))*COS(DELAZ)
 
2621
C               Set Z(3) to lunar elongation.
 
2622
                Z(3)=ACOS(COSEL)
 
2623
           ELSE
 
2624
C               Moon is down.
 
2625
                KZ(1)=0
 
2626
                Z(2)=0.
 
2627
           END IF
 
2628
C
 
2629
           IF (DTYPE(J).EQ.'S') THEN
 
2630
C             Star.
 
2631
              Z(4)=SIGNAL(J)
 
2632
           ELSE IF (DTYPE(J).EQ.'Y') THEN
 
2633
C             Sky.
 
2634
              CALL HALO(NB,DTYPE,KDIAPHRAGM,J,JBGN,JEND, Z(4))
 
2635
           ELSE
 
2636
C             Dark, etc.
 
2637
              GO TO 600
 
2638
           END IF
 
2639
C
 
2640
C          Put NDIA in KZ(2):
 
2641
           DO 580 NDIA=1,NDIAS
 
2642
              IF (DIAPH(J).EQ.DIANAM(NDIA)) THEN
 
2643
                 KZ(2)=NDIA
 
2644
                 GO TO 581
 
2645
              END IF
 
2646
  580      CONTINUE
 
2647
           KZ(2)=0
 
2648
  581      CONTINUE
 
2649
C
 
2650
C          Z's and KZ(1) are now set for YPSKY:
 
2651
           CALL YPSKY
 
2652
C          Sky brightness now returned in YT.
 
2653
           SIGNAL(J)=SIGNAL(J)-YT
 
2654
  600   CONTINUE
 
2655
C
 
2656
C
 
2657
C       Prepare for next night:
 
2658
C
 
2659
  999   JBGN=JEND+1
 
2660
C
 
2661
 1000 CONTINUE
 
2662
C               END of loops over bands and nights.
 
2663
C
 
2664
      RETURN
 
2665
      END
 
2666
      SUBROUTINE YPSKY
 
2667
C
 
2668
C   Fits  Y = [Y1 + Y2 + Y3 + P(1)] * P(diaphragm),  where
 
2669
C
 
2670
C
 
2671
C                                 2
 
2672
C            P(2)*Z(1) + P(3)*Z(1)
 
2673
C   Y1 = ---------------------------   is the sky background, and
 
2674
C                                 2
 
2675
C        1 + P(4)*Z(1) + P(5)*Z(1)
 
2676
C
 
2677
C
 
2678
C
 
2679
C   Y2 = Z(1) * [P(6)/Z(3) + P(7) + P(8)*Z(3)] * {exp[-P(9)*v1] + P(10)/v3}
 
2680
C
 
2681
C                                      is the scattered moonlight.
 
2682
C
 
2683
C
 
2684
C   Y3 = Z(4) * P(11)       is the part of the star included in sky measures.
 
2685
C
 
2686
C
 
2687
C
 
2688
C     P(1) is a possible zero-offset, if dark was not subtracted.
 
2689
C
 
2690
C
 
2691
C     Independent variables:
 
2692
C     ---------------------
 
2693
C
 
2694
C     Z(1) = observed airmass           v1 = Z(1) + Z(2) = sum of airmasses
 
2695
C
 
2696
C     Z(2) = lunar airmass              v3 = Z(1)*Z(2) = product of airmasses
 
2697
C
 
2698
C     Z(3) = lunar elongation
 
2699
C
 
2700
C     Z(4) = nearest star signal, or zero if none found.
 
2701
C
 
2702
C
 
2703
C     KZ(1) = Moon flag (1 if Moon up)
 
2704
C
 
2705
C     KZ(2) = diaphragm number (KDIA)
 
2706
C
 
2707
C
 
2708
C
 
2709
C
 
2710
      IMPLICIT NONE
 
2711
C
 
2712
C     Includes for dlsq:
 
2713
      INCLUDE 'MID_REL_INCL:kingfit.inc'
 
2714
      INCLUDE 'MID_REL_INCL:dlsq.inc'
 
2715
C
 
2716
      DOUBLE PRECISION DEN,  V1, V3, FIRST, SECOND, FZ1, EXPFAC, Y2
 
2717
C
 
2718
      INTEGER I, KDIA
 
2719
C
 
2720
C     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 
2721
C
 
2722
C
 
2723
      IF (KZ(1).LT.0) THEN
 
2724
C        Twilight:  Not in model.
 
2725
         KIP=0
 
2726
         YT=0.
 
2727
         RETURN
 
2728
      END IF
 
2729
C
 
2730
C
 
2731
C                                 2
 
2732
C            P(2)*Z(1) + P(3)*Z(1)
 
2733
C   Y1 = ---------------------------   is the sky background...
 
2734
C                                 2
 
2735
C        1 + P(4)*Z(1) + P(5)*Z(1)
 
2736
C
 
2737
C
 
2738
      KIP=6
 
2739
      IP(1)=1
 
2740
      IP(2)=2
 
2741
      IP(3)=3
 
2742
      IP(4)=4
 
2743
      IP(5)=5
 
2744
      IP(6)=11
 
2745
C
 
2746
      DEN = 1.D0 + (P(4) + P(5)*Z(1))*Z(1)
 
2747
      YT = (P(2) + P(3)*Z(1))*Z(1)/DEN
 
2748
C
 
2749
      PART(1)=1.D0
 
2750
      PART(2)=Z(1)/DEN
 
2751
      PART(3)=Z(1)*PART(2)
 
2752
      PART(4)= -YT*PART(2)
 
2753
      PART(5)= -YT*PART(3)
 
2754
      PART(11)=Z(4)
 
2755
C
 
2756
      YT = YT + P(1) + P(11)*Z(4)
 
2757
C
 
2758
      IF (KZ(1).EQ.0) THEN
 
2759
C        Don't need moonlight, so finish up:
 
2760
         IF (KZ(2).GT.0) THEN
 
2761
C           Scale old partials by diaphragm factor...
 
2762
            KDIA=KZ(2)+11
 
2763
            DO 30 I=1,KIP
 
2764
               PART(IP(I))=PART(IP(I))*P(KDIA)
 
2765
   30       CONTINUE
 
2766
C           Scale by diaphragm factor, and add to KIP:
 
2767
            KIP=7
 
2768
            IP(7)=KDIA
 
2769
            PART(KDIA)=YT
 
2770
            YT=P(KDIA)*YT
 
2771
         END IF
 
2772
         RETURN
 
2773
      END IF
 
2774
C
 
2775
C
 
2776
C     Here if we need to add moonlight:
 
2777
C
 
2778
C
 
2779
C   Y2 = Z(1) * [P(6)/Z(3) + P(7) + P(8)*Z(3)] * {exp[-P(9)*v1] + P(10)/v3}
 
2780
C
 
2781
C                                      is the scattered moonlight.
 
2782
C
 
2783
      KIP=11
 
2784
      IP(7)=6
 
2785
      IP(8)=7
 
2786
      IP(9)=8
 
2787
      IP(10)=9
 
2788
      IP(11)=10
 
2789
C
 
2790
      V1=Z(1)+Z(2)
 
2791
      V3=Z(1)*Z(2)
 
2792
C
 
2793
      FIRST=P(6)/Z(3) + P(7) + P(8)*Z(3)
 
2794
      FZ1=FIRST*Z(1)
 
2795
      IF (-P(9)*V1.GT.30.D0) THEN
 
2796
C        try to prevent floating-point exceptions.
 
2797
         EXPFAC=EXP(30.D0)
 
2798
      ELSE
 
2799
         EXPFAC=EXP(-P(9)*V1)
 
2800
      END IF
 
2801
      SECOND=EXPFAC + P(10)/V3
 
2802
C
 
2803
      Y2 = FZ1*SECOND
 
2804
C
 
2805
      PART(7)=SECOND*Z(1)
 
2806
      PART(6)=PART(7)/Z(3)
 
2807
      PART(8)=Z(3)*PART(7)
 
2808
      PART(9)= -V1*EXPFAC*FZ1
 
2809
      PART(10)=FZ1/V3
 
2810
C
 
2811
      YT = YT + Y2
 
2812
C
 
2813
C        Diaphragm scaling:
 
2814
         IF (KZ(2).GT.0) THEN
 
2815
C           Scale old partials by diaphragm factor...
 
2816
            KDIA=KZ(2)+11
 
2817
            DO 50 I=1,KIP
 
2818
               PART(IP(I))=PART(IP(I))*P(KDIA)
 
2819
   50       CONTINUE
 
2820
C           Scale by diaphragm factor, and add to KIP:
 
2821
            KIP=12
 
2822
            IP(12)=KDIA
 
2823
            PART(KDIA)=YT
 
2824
            YT=P(KDIA)*YT
 
2825
         END IF
 
2826
C
 
2827
      RETURN
 
2828
      END
 
2829
      SUBROUTINE SKYADJ(NB,DTYPE,KDIAPHRAGM,JBGN,JEND,NERROR)
 
2830
C
 
2831
C       Picks an ADJACENT sky sample, and subtracts it from star.
 
2832
C
 
2833
C
 
2834
      IMPLICIT NONE
 
2835
C
 
2836
      REAL SKY, PHNOISE, ERREST
 
2837
      INTEGER NB, KDIAPHRAGM, JBGN, JEND, NERROR, J3, J,
 
2838
     1         LWORD, JJ
 
2839
C
 
2840
      INCLUDE 'MID_REL_INCL:obs.inc'
 
2841
C
 
2842
      INCLUDE 'MID_REL_INCL:mstars.inc'
 
2843
C     PARAMETER (MSTARS=1650)
 
2844
C       MSTARS is max.number of star-catalog entries.
 
2845
C       commons for star catalog:
 
2846
      CHARACTER *32 STARS
 
2847
      COMMON /SCATA/ STARS(MSTARS)
 
2848
C
 
2849
      CHARACTER DTYPE(MXOBS)
 
2850
C
 
2851
      CHARACTER A, CARD*48, PRECEDED*8, FOLLOWING*9, DSKY*4
 
2852
C
 
2853
C
 
2854
      SKY=-3.E33
 
2855
      DSKY=' '
 
2856
      NERROR=0
 
2857
C
 
2858
C     Decide which way to scan:
 
2859
C
 
2860
      IF (JBGN.LT.JEND) THEN
 
2861
          J3=1
 
2862
          PRECEDED='preceded'
 
2863
          FOLLOWING='FOLLOWING'
 
2864
      ELSE
 
2865
          J3=-1
 
2866
          PRECEDED='followed'
 
2867
          FOLLOWING='PRECEDING'
 
2868
      END IF
 
2869
C
 
2870
      DO 134 J=JBGN,JEND,J3
 
2871
C
 
2872
         IF (KBND(J).NE.NB .OR. NSTR(J).LT.0) GO TO 134
 
2873
C        here if bands match.
 
2874
         IF (DTYPE(J).EQ.'Y') THEN
 
2875
C           this is sky; reset it.
 
2876
            SKY=SIGNAL(J)
 
2877
            PHNOISE=PHVAR(J)
 
2878
            ERREST=ESTER(J)
 
2879
            IF (KDIAPHRAGM.NE.-1) THEN
 
2880
C              flag sky diaphragm code; expect star to match.
 
2881
               DSKY=DIAPH(J)
 
2882
            END IF
 
2883
         ELSE
 
2884
C           this is star; subtract sky.
 
2885
C
 
2886
            IF (SKY.EQ.-3.E33) THEN
 
2887
C              ERROR: no previous sky!
 
2888
               CALL SPACE2
 
2889
               CARD=STARS(NSTR(J))
 
2890
               CARD(LWORD(CARD)+2:LWORD(CARD)+6)='at'
 
2891
               WRITE(CARD(LWORD(CARD)+2:),'(F7.4)')DJOBS(J)
 
2892
               CALL TV(CARD)
 
2893
               CARD='!! Star not '//PRECEDED//' by sky !!'
 
2894
               CALL TVN(CARD)
 
2895
               CARD='Do you want to use the '//FOLLOWING//' sky?'
 
2896
               CALL ASK(CARD,A)
 
2897
C
 
2898
               IF (A.EQ.'Y' .OR. A.EQ.'O')THEN
 
2899
C                 look for following sky:
 
2900
                  DO 132 JJ=J+J3,JEND,J3
 
2901
                     IF (KBND(JJ).NE.NB .OR.
 
2902
     1                   NSTR(JJ).LT.0) GO TO 132
 
2903
                     IF(DTYPE(JJ).EQ.'Y') THEN
 
2904
                        IF(KDIAPHRAGM.NE.-1 .AND.
 
2905
     1                    DIAPH(JJ).NE.DIAPH(J)) GOTO 132
 
2906
C                       fix this one, but do not set SKY.
 
2907
                        SIGNAL(J)=SIGNAL(J)-SIGNAL(JJ)
 
2908
C                       accumulate photon variances.
 
2909
                        PHVAR(J)=PHVAR(J)+PHVAR(JJ)
 
2910
                        IF (ESTER(J).NE.0.)
 
2911
     1                      ESTER(J)=SQRT(ESTER(J)**2 + ESTER(JJ)**2)
 
2912
                        GO TO 134
 
2913
                     END IF
 
2914
  132             CONTINUE
 
2915
                  CALL TV('No sky found! Quitting.')
 
2916
                  CALL STSEPI
 
2917
               ELSE
 
2918
                  GO TO 999
 
2919
               END IF
 
2920
C
 
2921
            ELSE
 
2922
C              probably normal case.  Check DIAPH:
 
2923
               IF (KDIAPHRAGM.NE.-1 .AND.
 
2924
     1                DIAPH(J).NE.DSKY) THEN
 
2925
                  CALL SPACE2
 
2926
                  CARD=STARS(NSTR(J))
 
2927
                  CARD(LWORD(CARD)+2:LWORD(CARD)+6)='at'
 
2928
                  WRITE(CARD(LWORD(CARD)+2:),
 
2929
     1                '(F7.4)')DJOBS(J)
 
2930
                  CALL TV(CARD)
 
2931
                  CALL TV(
 
2932
     1              'Sky and Star taken through DIFFERENT diaphragms.')
 
2933
                  CALL TVN('Sky subtraction impossible.')
 
2934
                  GO TO 999
 
2935
               END IF
 
2936
C              NORMAL case. Subtract sky:
 
2937
               SIGNAL(J)=SIGNAL(J)-SKY
 
2938
               PHVAR(J)=PHVAR(J)+PHNOISE
 
2939
               IF(ESTER(J).NE.0.) ESTER(J)=SQRT(ESTER(J)**2 + ERREST**2)
 
2940
            END IF
 
2941
C
 
2942
         END IF
 
2943
C
 
2944
  134 CONTINUE
 
2945
C
 
2946
C       Normal return.
 
2947
C
 
2948
      RETURN
 
2949
C
 
2950
C
 
2951
C       error return:
 
2952
C
 
2953
  999 CALL ASK('Do you want to try another sky-subtraction method?',A)
 
2954
      IF (A.EQ.'Y' .OR. A.EQ.'O') THEN
 
2955
          NERROR=1
 
2956
          RETURN
 
2957
      ELSE IF (A.EQ.'H') THEN
 
2958
                   CALL TV('The photometric system changes with')
 
2959
                   CALL TVN('diaphragm size, so you cannot combine')
 
2960
                   CALL TVN('data taken through different holes.')
 
2961
                   CALL RTNCON('Try the "Nearest" option.',25)
 
2962
                   NERROR=1
 
2963
                   RETURN
 
2964
      ELSE
 
2965
          CALL TV('Quitting.')
 
2966
          CALL STSEPI
 
2967
      END IF
 
2968
C
 
2969
      END
 
2970
      SUBROUTINE HALO(NB,DTYPE,KDIAPHRAGM,J,JBGN,JEND, SKYUSE)
 
2971
C
 
2972
C       Picks the NEAREST STAR sample to sky(J), and returns it in SKYUSE.
 
2973
C
 
2974
C  Arguments:
 
2975
C
 
2976
C       NB      is band number
 
2977
C       DTYPE   is 'Y' for sky, 'S' for star
 
2978
C       KDIAPHRAGM is column pointer for diaphragm data
 
2979
C       JBGN    is observation number for start of night
 
2980
C       JEND    is observation number for end of night
 
2981
C
 
2982
C
 
2983
      IMPLICIT NONE
 
2984
C
 
2985
C
 
2986
      INTEGER NB, KDIAPHRAGM, JBGN, JEND
 
2987
C
 
2988
      INCLUDE 'MID_REL_INCL:obs.inc'
 
2989
C
 
2990
      CHARACTER DTYPE(MXOBS)
 
2991
C
 
2992
C
 
2993
C
 
2994
      REAL SKY, SKY2, SKYAIR, SKYAZ, SKYTIM,   PI,TWOPI,
 
2995
     1   SKYAIR2, SKYAZ2, SKYTIM2, S1, S2, SKYUSE
 
2996
C
 
2997
      INTEGER J, JJ
 
2998
C
 
2999
C   Meaning of local variables:
 
3000
C
 
3001
C               Previous        Following
 
3002
C               --------        ---------
 
3003
C     Star        SKY             SKY2
 
3004
C     Airmass   SKYAIR          SKYAIR2
 
3005
C     Azimuth   SKYAZ           SKYAZ2
 
3006
C     Time      SKYTIM          SKYTIM2
 
3007
C     Diaphragm  DSKY            DSKY2
 
3008
C
 
3009
C
 
3010
      INCLUDE 'MID_REL_INCL:mstars.inc'
 
3011
C     PARAMETER (MSTARS=1650)
 
3012
C       MSTARS is max.number of star-catalog entries.
 
3013
C       commons for star catalog:
 
3014
      CHARACTER *32 STARS
 
3015
      COMMON /SCATA/ STARS(MSTARS)
 
3016
C
 
3017
      CHARACTER DSKY*4, DSKY2*4
 
3018
C
 
3019
      DATA PI/3.1415926535/
 
3020
C
 
3021
C
 
3022
C     *****  BEGIN  *****
 
3023
C
 
3024
      TWOPI=PI+PI
 
3025
      SKY=-3.E33
 
3026
      SKY2=-3.E33
 
3027
      DSKY=' '
 
3028
      DSKY2=' '
 
3029
      SKYAIR2 = 0.0
 
3030
      SKYAZ2  = 0.0
 
3031
      SKYTIM2 = 0.0
 
3032
C
 
3033
C     J is current sky datum in band NB.
 
3034
C
 
3035
      IF (DTYPE(J).EQ.'Y') THEN
 
3036
C        this is sky.
 
3037
         IF (KDIAPHRAGM.NE.-1) THEN
 
3038
C            save new diaphragm.
 
3039
             DSKY=DIAPH(J)
 
3040
         ELSE
 
3041
C            no diaphragm info.
 
3042
         END IF
 
3043
      ELSE
 
3044
         CALL TV('Called HALO with non-sky datum.')
 
3045
         RETURN
 
3046
      END IF
 
3047
C
 
3048
C     This is sky; look for PREVIOUS star.
 
3049
   20       IF (SKY.LT.0.) THEN
 
3050
C                No previous star.  Find one.
 
3051
                 DO 28 JJ=J-1,JBGN,-1
 
3052
                     IF (KBND(JJ).NE.NB .OR. NSTR(JJ).LT.0) GO TO 28
 
3053
                     IF(DTYPE(JJ).EQ.'S') THEN
 
3054
                        IF(KDIAPHRAGM.NE.-1 .AND.
 
3055
     1                    DIAPH(JJ).NE.DIAPH(J)) GOTO 28
 
3056
C                       OK; JJ is the previous star we seek.
 
3057
                        DSKY=DIAPH(JJ)
 
3058
                        SKY=SIGNAL(JJ)
 
3059
                        SKYAIR=AIRM(JJ)
 
3060
                        SKYAZ=AZIM(JJ)
 
3061
                        SKYTIM=DJOBS(JJ)
 
3062
                        GO TO 40
 
3063
                     END IF
 
3064
   28            CONTINUE
 
3065
C                No previous star.
 
3066
                 SKY=-3.E33
 
3067
                 DSKY=' '
 
3068
            ELSE
 
3069
C               probably normal case.  Check DIAPH:
 
3070
                IF (KDIAPHRAGM.NE.-1 .AND. DIAPH(J).NE.DSKY) THEN
 
3071
C                  Mismatch; force search for previous star.
 
3072
                   SKY=-3.E33
 
3073
                   GO TO 20
 
3074
                ELSE
 
3075
C                  NORMAL case. Existing star OK.
 
3076
                END IF
 
3077
            END IF
 
3078
C
 
3079
C        SKY is now valid previous value. Look for FOLLOWING value:
 
3080
C
 
3081
   40   IF (SKY2.LT.0.) THEN
 
3082
C           Look for next star.
 
3083
            DO 48 JJ=J+1,JEND
 
3084
                  IF (KBND(JJ).NE.NB .OR. NSTR(JJ).LT.0) GO TO 48
 
3085
                  IF(DTYPE(JJ).EQ.'S') THEN
 
3086
                        IF(KDIAPHRAGM.NE.-1 .AND.
 
3087
     1                    DIAPH(JJ).NE.DIAPH(J)) GOTO 48
 
3088
C                       OK; JJ is the following star we seek.
 
3089
                        DSKY2=DIAPH(JJ)
 
3090
                        SKY2=SIGNAL(JJ)
 
3091
                        SKYAIR2=AIRM(JJ)
 
3092
                        SKYAZ2=AZIM(JJ)
 
3093
                        SKYTIM2=DJOBS(JJ)
 
3094
                        GO TO 60
 
3095
                  END IF
 
3096
   48       CONTINUE
 
3097
C           No following star.
 
3098
            SKY2=-3.E33
 
3099
            DSKY2=' '
 
3100
        ELSE
 
3101
C           existing sky2 might still be OK. Check it:
 
3102
            IF (SKYTIM2.GT.DJOBS(J)) THEN
 
3103
C               Time is OK.  Check diaphragm:
 
3104
                IF (KDIAPHRAGM.NE.-1) THEN
 
3105
                    IF (DIAPH(J).EQ.DSKY2) THEN
 
3106
C                       we are OK; go on.
 
3107
                    ELSE
 
3108
C                       need a new SKY2.
 
3109
                        SKY2=-3.E33
 
3110
                        GO TO 40
 
3111
                    END IF
 
3112
                ELSE
 
3113
C                   No problem.  Go on.
 
3114
                END IF
 
3115
            ELSE
 
3116
C               We are past the old second star.  Move it back & get new one:
 
3117
                SKY=SKY2
 
3118
                DSKY=DSKY2
 
3119
                SKYAIR=SKYAIR2
 
3120
                SKYAZ=SKYAZ2
 
3121
                SKYTIM=SKYTIM2
 
3122
                SKY2=-3.E33
 
3123
                GO TO 40
 
3124
            END IF
 
3125
        END IF
 
3126
C
 
3127
C       Now compare to find "nearer" star:
 
3128
C
 
3129
   60   IF (SKY.GT.0. .AND. SKY2.GT.0.) THEN
 
3130
C           Everything is hunky-dory.  Find closer sample:
 
3131
            S1=ABS(SKYTIM-DJOBS(J))*20. + ABS(SKYAIR-AIRM(J))
 
3132
            IF (ABS(SKYAZ-AZIM(J)).GT.PI) THEN
 
3133
               S1=S1+ (SKYAIR+AIRM(J))*(TWOPI-ABS(SKYAZ-AZIM(J)))
 
3134
            ELSE
 
3135
               S1=S1+ (SKYAIR+AIRM(J))*ABS(SKYAZ-AZIM(J))
 
3136
            END IF
 
3137
            S2=ABS(SKYTIM2-DJOBS(J))*20. + ABS(SKYAIR2-AIRM(J))
 
3138
            IF (ABS(SKYAZ2-AZIM(J)).GT.PI) THEN
 
3139
               S2=S2+ (SKYAIR2+AIRM(J))*(TWOPI-ABS(SKYAZ2-AZIM(J)))
 
3140
            ELSE
 
3141
               S2=S2+ (SKYAIR2+AIRM(J))*ABS(SKYAZ2-AZIM(J))
 
3142
            END IF
 
3143
C
 
3144
            IF (S2.LT.S1) THEN
 
3145
                SKYUSE=SKY2
 
3146
                IF (S2.GT.0.1) THEN
 
3147
C                  complain.
 
3148
C                  CALL SKYFAR()
 
3149
                END IF
 
3150
            ELSE
 
3151
                SKYUSE=SKY
 
3152
                IF (S1.GT.0.1) THEN
 
3153
C                  complain.
 
3154
                END IF
 
3155
            END IF
 
3156
        ELSE IF (SKY.GT.0.) THEN
 
3157
C           SKY is the only good one.  Use it.
 
3158
            SKYUSE=SKY
 
3159
        ELSE IF (SKY2.GT.0.) THEN
 
3160
C           SKY2 is the only good one.  Use it.
 
3161
            SKYUSE=SKY2
 
3162
        ELSE
 
3163
C           NEITHER star is any good.
 
3164
C           set value to zero and return:
 
3165
            SKYUSE=0.
 
3166
            RETURN
 
3167
        END IF
 
3168
C
 
3169
C       OK, we have now rigged SKYUSE to be the value to use.  Report it.
 
3170
C
 
3171
C
 
3172
C       Normal return.
 
3173
C
 
3174
      RETURN
 
3175
C
 
3176
      END
 
3177
      SUBROUTINE SKYNBR(NB,DTYPE,KDIAPHRAGM,JBGN,JEND)
 
3178
C
 
3179
C       Picks the NEAREST sky sample, and subtracts it from star.
 
3180
C
 
3181
C  Arguments:
 
3182
C
 
3183
C       NB      is band number
 
3184
C       DTYPE   is 'Y' for sky
 
3185
C       KDIAPHRAGM is column pointer for diaphragm data
 
3186
C       JBGN    is observation number for start of night
 
3187
C       JEND    is observation number for end of night
 
3188
C
 
3189
C
 
3190
      IMPLICIT NONE
 
3191
C
 
3192
C
 
3193
      INTEGER NB, KDIAPHRAGM, JBGN, JEND
 
3194
C
 
3195
      INCLUDE 'MID_REL_INCL:obs.inc'
 
3196
C
 
3197
      CHARACTER DTYPE(MXOBS)
 
3198
C
 
3199
C
 
3200
C
 
3201
      REAL SKY, SKY2, SKYAIR, SKYAZ, SKYTIM,   PI,TWOPI,
 
3202
     1   PHNOISE, ERREST, SKYAIR2, SKYAZ2, SKYTIM2, 
 
3203
     2         PHN2, ERR2, S1, S2, SKYUSE, PHNUSE, ERRUSE
 
3204
C
 
3205
      INTEGER J, JJ
 
3206
C
 
3207
C   Meaning of local variables:
 
3208
C
 
3209
C               Previous        Following
 
3210
C               --------        ---------
 
3211
C     Sky         SKY             SKY2
 
3212
C     Airmass   SKYAIR          SKYAIR2
 
3213
C     Azimuth   SKYAZ           SKYAZ2
 
3214
C     Time      SKYTIM          SKYTIM2
 
3215
C     Phot.noisePHNOISE          PHN2
 
3216
C     Est.error ERREST           ERR2
 
3217
C     Diaphragm  DSKY            DSKY2
 
3218
C
 
3219
C
 
3220
      INCLUDE 'MID_REL_INCL:mstars.inc'
 
3221
C     PARAMETER (MSTARS=1650)
 
3222
C       MSTARS is max.number of star-catalog entries.
 
3223
C       commons for star catalog:
 
3224
      CHARACTER *32 STARS
 
3225
      COMMON /SCATA/ STARS(MSTARS)
 
3226
C
 
3227
      CHARACTER CARD*48, DSKY*4, DSKY2*4
 
3228
C
 
3229
      DATA PI/3.1415926535/
 
3230
C
 
3231
C
 
3232
      TWOPI=PI+PI
 
3233
      SKY=-3.E33
 
3234
      SKY2=-3.E33
 
3235
      DSKY=' '
 
3236
      DSKY2=' '
 
3237
C
 
3238
      DO 100 J=JBGN,JEND
 
3239
C
 
3240
         IF (KBND(J).NE.NB .OR. NSTR(J).LT.0) GO TO 100
 
3241
C        here if bands match.
 
3242
C
 
3243
         IF (DTYPE(J).EQ.'Y') THEN
 
3244
C           this is sky.
 
3245
            IF (KDIAPHRAGM.NE.-1) THEN
 
3246
C               save new diaphragm.
 
3247
                DSKY=DIAPH(J)
 
3248
            ELSE
 
3249
C               no diaphragm info.
 
3250
            END IF
 
3251
            SKY=SIGNAL(J)
 
3252
            SKYAIR=AIRM(J)
 
3253
            SKYAZ=AZIM(J)
 
3254
            SKYTIM=DJOBS(J)
 
3255
            PHNOISE=PHVAR(J)
 
3256
            ERREST=ESTER(J)
 
3257
            GO TO 100
 
3258
         ELSE
 
3259
C           this is star; look for PREVIOUS sky.
 
3260
   20       IF (SKY.LT.0.) THEN
 
3261
C                No previous sky.  Find one.
 
3262
                 DO 28 JJ=J-1,JBGN,-1
 
3263
                     IF (KBND(JJ).NE.NB .OR. NSTR(JJ).LT.0) GO TO 28
 
3264
                     IF(DTYPE(JJ).EQ.'Y') THEN
 
3265
                        IF(KDIAPHRAGM.NE.-1 .AND.
 
3266
     1                    DIAPH(JJ).NE.DIAPH(J)) GOTO 28
 
3267
C                       OK; JJ is the previous sky we seek.
 
3268
                        DSKY=DIAPH(JJ)
 
3269
                        SKY=SIGNAL(JJ)
 
3270
                        SKYAIR=AIRM(JJ)
 
3271
                        SKYAZ=AZIM(JJ)
 
3272
                        SKYTIM=DJOBS(JJ)
 
3273
                        PHNOISE=PHVAR(J)
 
3274
                        ERREST=ESTER(J)
 
3275
                        GO TO 40
 
3276
                     END IF
 
3277
   28            CONTINUE
 
3278
C                No previous sky.
 
3279
                 SKY=-3.E33
 
3280
                 DSKY=' '
 
3281
            ELSE
 
3282
C               probably normal case.  Check DIAPH:
 
3283
                IF (KDIAPHRAGM.NE.-1 .AND. DIAPH(J).NE.DSKY) THEN
 
3284
C                  Mismatch; force search for previous sky.
 
3285
                   SKY=-3.E33
 
3286
                   GO TO 20
 
3287
                ELSE
 
3288
C                  NORMAL case. Existing sky OK.
 
3289
                END IF
 
3290
            END IF
 
3291
         END IF
 
3292
C
 
3293
C        SKY is now valid previous value. Look for FOLLOWING value:
 
3294
C
 
3295
   40   IF (SKY2.LT.0.) THEN
 
3296
C           Look for next sky.
 
3297
            DO 48 JJ=J+1,JEND
 
3298
                  IF (KBND(JJ).NE.NB .OR. NSTR(JJ).LT.0) GO TO 48
 
3299
                  IF(DTYPE(JJ).EQ.'Y') THEN
 
3300
                        IF(KDIAPHRAGM.NE.-1 .AND.
 
3301
     1                    DIAPH(JJ).NE.DIAPH(J)) GOTO 48
 
3302
C                       OK; JJ is the following sky we seek.
 
3303
                        DSKY2=DIAPH(JJ)
 
3304
                        SKY2=SIGNAL(JJ)
 
3305
                        SKYAIR2=AIRM(JJ)
 
3306
                        SKYAZ2=AZIM(JJ)
 
3307
                        SKYTIM2=DJOBS(JJ)
 
3308
                        PHN2=PHVAR(JJ)
 
3309
                        ERR2=ESTER(JJ)
 
3310
                        GO TO 60
 
3311
                  END IF
 
3312
   48       CONTINUE
 
3313
C           No following sky.
 
3314
            SKY2=-3.E33
 
3315
            DSKY2=' '
 
3316
        ELSE
 
3317
C           existing sky2 might still be OK. Check it:
 
3318
            IF (SKYTIM2.GT.DJOBS(J)) THEN
 
3319
C               Time is OK.  Check diaphragm:
 
3320
                IF (KDIAPHRAGM.NE.-1) THEN
 
3321
                    IF (DIAPH(J).EQ.DSKY2) THEN
 
3322
C                       we are OK; go on.
 
3323
                    ELSE
 
3324
C                       need a new SKY2.
 
3325
                        SKY2=-3.E33
 
3326
                        GO TO 40
 
3327
                    END IF
 
3328
                ELSE
 
3329
C                   No problem.  Go on.
 
3330
                END IF
 
3331
            ELSE
 
3332
C               We are past the old second sky.  Move it back & get new one:
 
3333
                SKY=SKY2
 
3334
                DSKY=DSKY2
 
3335
                SKYAIR=SKYAIR2
 
3336
                SKYAZ=SKYAZ2
 
3337
                SKYTIM=SKYTIM2
 
3338
                PHNOISE=PHN2
 
3339
                ERREST=ERR2
 
3340
                SKY2=-3.E33
 
3341
                GO TO 40
 
3342
            END IF
 
3343
        END IF
 
3344
C
 
3345
C       Now compare to find "nearer" sky:
 
3346
C
 
3347
   60   IF (SKY.GT.0. .AND. SKY2.GT.0.) THEN
 
3348
C           Everything is hunky-dory.  Find closer sample:
 
3349
            S1=ABS(SKYTIM-DJOBS(J))*20. + ABS(SKYAIR-AIRM(J))
 
3350
            IF (ABS(SKYAZ-AZIM(J)).GT.PI) THEN
 
3351
               S1=S1+ (SKYAIR+AIRM(J))*(TWOPI-ABS(SKYAZ-AZIM(J)))
 
3352
            ELSE
 
3353
               S1=S1+ (SKYAIR+AIRM(J))*ABS(SKYAZ-AZIM(J))
 
3354
            END IF
 
3355
            S2=ABS(SKYTIM2-DJOBS(J))*20. + ABS(SKYAIR2-AIRM(J))
 
3356
            IF (ABS(SKYAZ2-AZIM(J)).GT.PI) THEN
 
3357
               S2=S2+ (SKYAIR2+AIRM(J))*(TWOPI-ABS(SKYAZ2-AZIM(J)))
 
3358
            ELSE
 
3359
               S2=S2+ (SKYAIR2+AIRM(J))*ABS(SKYAZ2-AZIM(J))
 
3360
            END IF
 
3361
C
 
3362
            IF (S2.LT.S1) THEN
 
3363
                SKYUSE=SKY2
 
3364
                PHNUSE=PHN2
 
3365
                ERRUSE=ERR2
 
3366
                IF (S2.GT.0.1) THEN
 
3367
C                  complain.
 
3368
C                  CALL SKYFAR()
 
3369
                END IF
 
3370
            ELSE
 
3371
                SKYUSE=SKY
 
3372
                PHNUSE=PHNOISE
 
3373
                ERRUSE=ERREST
 
3374
                IF (S1.GT.0.1) THEN
 
3375
C                  complain.
 
3376
                END IF
 
3377
            END IF
 
3378
        ELSE IF (SKY.GT.0.) THEN
 
3379
C           SKY is the only good one.  Use it.
 
3380
            SKYUSE=SKY
 
3381
            PHNUSE=PHNOISE
 
3382
            ERRUSE=ERREST
 
3383
        ELSE IF (SKY2.GT.0.) THEN
 
3384
C           SKY2 is the only good one.  Use it.
 
3385
            SKYUSE=SKY2
 
3386
            PHNUSE=PHN2
 
3387
            ERRUSE=ERR2
 
3388
        ELSE
 
3389
C           AARRRGHHH!!  NEITHER sky is any good!
 
3390
            CARD='Can''t find a sky sample to match '//STARS(NSTR(J))
 
3391
            CALL TV(CARD)
 
3392
            WRITE(CARD,'(''at '',F7.4)') DJOBS(J)
 
3393
            IF (KDIAPHRAGM.NE.-1) CARD(30:)='in diaphragm '//DIAPH(J)
 
3394
            CALL TVN(CARD)
 
3395
            CALL TV('This value will be REJECTED.')
 
3396
            CALL SPACE
 
3397
C           set value to zero and continue:
 
3398
            SKYUSE=SIGNAL(J)
 
3399
            PHVAR(J)=1.E10
 
3400
            ERRUSE=1.E10
 
3401
        END IF
 
3402
C
 
3403
C       OK, we have now rigged SKYUSE to be the value to subtract.  Do it.
 
3404
C
 
3405
        SIGNAL(J)=SIGNAL(J)-SKYUSE
 
3406
        PHVAR(J)=PHVAR(J)+PHNUSE
 
3407
        IF (ESTER(J).NE.0.) ESTER(J)=SQRT(ESTER(J)**2 +ERRUSE**2)
 
3408
C
 
3409
  100 CONTINUE
 
3410
C
 
3411
C       Normal return.
 
3412
C
 
3413
      RETURN
 
3414
C
 
3415
      END
 
3416
      SUBROUTINE REDSUB(BANDS,KMIN,KMAX,LASTK,MAXK,DTYPE)
 
3417
C
 
3418
C       Subtracts red-leak data from corresponding bands.
 
3419
C       Picks the NEAREST red-leak sample, and subtracts it from star.
 
3420
C
 
3421
C
 
3422
      IMPLICIT NONE
 
3423
C
 
3424
      REAL RLFACT, RL, RLVAR, ERVAR
 
3425
      INTEGER KMIN, KMAX, LASTK, MAXK, NBRL, K, KRL, JBGN, NIGHT, 
 
3426
     1         KK, J, JMIN, JMAX, JEND, ISTR, JOFF, J1, J2
 
3427
C
 
3428
      INCLUDE 'MID_REL_INCL:obs.inc'
 
3429
C
 
3430
      INCLUDE 'MID_REL_INCL:mstars.inc'
 
3431
C     PARAMETER (MSTARS=1650)
 
3432
C       MSTARS is max.number of star-catalog entries.
 
3433
C       commons for star catalog:
 
3434
      CHARACTER *32 STARS
 
3435
      COMMON /SCATA/ STARS(MSTARS)
 
3436
C
 
3437
      CHARACTER DTYPE(MXOBS)
 
3438
C
 
3439
      INCLUDE 'MID_REL_INCL:mbands.inc'
 
3440
C     PARAMETER (MBANDS=9)
 
3441
      INTEGER MXCOLR
 
3442
      PARAMETER (MXCOLR=3*MBANDS)
 
3443
      CHARACTER *8 BANDS(MXCOLR)
 
3444
C
 
3445
C       Common for red leaks:
 
3446
C
 
3447
      COMMON /REDLK/ NBRL(MXCOLR), RLFACT(MXCOLR)
 
3448
C
 
3449
C
 
3450
C       Useful   bands run from KMIN to LASTK.
 
3451
C       Measured bands run from KMIN to KMAX, including red leaks.
 
3452
C       MAXK  marks end of expected red-leak bands, starting at NBANDS+1.
 
3453
C
 
3454
C
 
3455
C    EXAMPLE of red-leak storage:
 
3456
C
 
3457
C       In UBVRI system, NBANDS = 5.  Suppose we measure only B,V,R, & BRL.
 
3458
C
 
3459
C               K     BAND(K)    NBRL(K)
 
3460
C               -     -------    -------
 
3461
C               1        U          0
 
3462
C               2        B          6    <-- KMIN = 2
 
3463
C               3        V          0
 
3464
C               4        R          0    <-- LASTK = 4
 
3465
C               5        I          0
 
3466
C               6       BRL         0    <-- KMAX = MAXK = 6
 
3467
C
 
3468
C
 
3469
C
 
3470
C
 
3471
      DO 1000 K=KMIN,LASTK
 
3472
          IF (NBRL(K).EQ.0) GO TO 1000
 
3473
         KRL=NBRL(K)
 
3474
         JBGN=1
 
3475
C
 
3476
      DO 900 NIGHT=1,NIGHTS
 
3477
         KK=0
 
3478
         DO 10 J=JBGN,NDATA
 
3479
C           get limits for current night & passband.
 
3480
            IF (NITE(J).NE.NIGHT) GO TO 20
 
3481
            IF (DTYPE(J).EQ.'Y') GO TO 10
 
3482
            KK=KK+1
 
3483
            IF (KK.EQ.1) JMIN=J
 
3484
            JMAX=J
 
3485
   10    CONTINUE
 
3486
         J=NDATA+1
 
3487
   20    JEND=J-1
 
3488
C
 
3489
C       JBGN, JEND index the first & last data of ANY kind for the night.
 
3490
C       JMIN, JMAX index the first & last STAR data for the night & band.
 
3491
C       KK counts star data for the night.
 
3492
C
 
3493
C
 
3494
      DO 100 J=JMIN,JMAX
 
3495
C
 
3496
         IF (DTYPE(J).EQ.'Y' .OR. NSTR(J).LT.0) GO TO 100
 
3497
C        here if datum is stellar.
 
3498
C
 
3499
         IF (KBND(J).EQ.K) THEN
 
3500
C
 
3501
C           this observation requires red-leak correction.
 
3502
            ISTR=NSTR(J)
 
3503
C           scan forward & back for nearest red-leak datum for same star:
 
3504
            DO 50 JOFF=1,50
 
3505
C               look ahead...
 
3506
                J1=J+JOFF
 
3507
                IF (J1.GT.JMAX) GO TO 40
 
3508
                IF (KBND(J1).NE.KRL .OR. NSTR(J1).NE.ISTR) GO TO 40
 
3509
                RL=SIGNAL(J1)
 
3510
                RLVAR=PHVAR(J1)
 
3511
                ERVAR=ESTER(J1)
 
3512
                GO TO 60
 
3513
   40           CONTINUE
 
3514
C               look back...
 
3515
                J2=J-JOFF
 
3516
                IF (J2.LT.JMIN) GO TO 50
 
3517
                IF (KBND(J2).NE.KRL .OR. NSTR(J2).NE.ISTR) GO TO 50
 
3518
                RL=SIGNAL(J2)
 
3519
                RLVAR=PHVAR(J2)
 
3520
                ERVAR=ESTER(J2)
 
3521
                GO TO 60
 
3522
   50       CONTINUE
 
3523
            CALL TV('No red-leak datum found for')
 
3524
            CALL TVN(STARS(ISTR))
 
3525
C
 
3526
   60       CONTINUE
 
3527
            IF (RL.LT.0.) THEN
 
3528
               RL=0.
 
3529
               CALL TV('Negative red-leak found for')
 
3530
               CALL TVN(STARS(NSTR(J)))
 
3531
               GO TO 100
 
3532
            END IF
 
3533
C
 
3534
C           Correct for red leak:
 
3535
            SIGNAL(J)=SIGNAL(J)-RL*RLFACT(K)
 
3536
            PHVAR(J)=PHVAR(J)+RLVAR*RLFACT(K)
 
3537
            IF(ESTER(J).NE.0.)ESTER(J)=SQRT(ESTER(J)**2+ERVAR*RLFACT(K))
 
3538
C
 
3539
        END IF
 
3540
C
 
3541
  100 CONTINUE
 
3542
C
 
3543
C     prepare for next pass.
 
3544
      JBGN=JEND+1
 
3545
  900 CONTINUE
 
3546
C
 
3547
 1000 CONTINUE
 
3548
C
 
3549
C       Normal return.
 
3550
C
 
3551
      RETURN
 
3552
C
 
3553
      END
 
3554
      SUBROUTINE NEED(LINES)
 
3555
C
 
3556
C       Tell it how many lines you need for a plot.  It reads the LOG
 
3557
C       keyword and adds spaces to start a new page if necessary.
 
3558
C
 
3559
C
 
3560
      IMPLICIT NONE
 
3561
C
 
3562
      INTEGER LINES, NGOT, LINE, IUNIT, NULLS, ISTAT, NLPP, I
 
3563
C
 
3564
C
 
3565
      CALL STKRDI('LOG',6,1, NGOT,LINE,IUNIT,NULLS,ISTAT)
 
3566
      IF (ISTAT.NE.0) CALL TERROR(9999,'Could not read Keyword LOG')
 
3567
      CALL STKRDI('LOG',7,1, NGOT,NLPP,IUNIT,NULLS,ISTAT)
 
3568
      IF (ISTAT.NE.0) CALL TERROR(9999,'Could not read Keyword LOG')
 
3569
      IF(LINE+LINES.GT.NLPP)THEN
 
3570
C        we must space to a new page.
 
3571
         DO 1 I=1,NLPP-LINE
 
3572
            CALL TVN(' ')
 
3573
    1    CONTINUE
 
3574
      ELSE
 
3575
C        we are OK.
 
3576
      END IF
 
3577
C
 
3578
      RETURN
 
3579
      END