1
C===========================================================================
2
C Copyright (C) 1995-2010 European Southern Observatory (ESO)
4
C This program is free software; you can redistribute it and/or
5
C modify it under the terms of the GNU General Public License as
6
C published by the Free Software Foundation; either version 2 of
7
C the License, or (at your option) any later version.
9
C This program is distributed in the hope that it will be useful,
10
C but WITHOUT ANY WARRANTY; without even the implied warranty of
11
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
C GNU General Public License for more details.
14
C You should have received a copy of the GNU General Public
15
C License along with this program; if not, write to the Free
16
C Software Foundation, Inc., 675 Massachusetts Ave, Cambridge,
19
C Correspondence concerning ESO-MIDAS should be addressed as follows:
20
C Internet e-mail: midas@eso.org
21
C Postal address: European Southern Observatory
22
C Data Management Division
23
C Karl-Schwarzschild-Strasse 2
24
C D 85748 Garching bei Muenchen
26
C===========================================================================
30
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
32
C.LANGUAGE: F77+ESOext
34
C.AUTHOR: J.D.Ponz, K. Banse
40
C display, table subsystem
43
C Display table positions in the overlay plane of the display window
44
C rows with coordinates falling outside the displayed image are skipped
45
C the no. of skipped rows is stored in OUTPUTI(11)
47
C INPUTI(20) serves as print flag: 99 = show skipped rows
48
C and show coord conversion per row
52
C LOAD/TABLE table column1 column2 [column3] [symbol [size [level]]]
55
C plot table entries as : square (0,2)
57
C triangle up (3), triangle down (4)
58
C cross (5), open cross (6)
61
C for squares, triangles, circles and diamonds exist a filled option (add 100)
62
C thus filled diamonds have value (107)
65
C the following keywords are used:
67
C.VERSION: 1.0 ESO-FORTRAN Conversion, AA 20:55 - 16 DEC 1987
72
C-------------------------------------------------------------------
79
INTEGER SELROW ! index for selected rows
80
INTEGER NROW,NSC,IAV,NVAL
81
INTEGER ISYMBOL,NODRAW,FILL
82
INTEGER NCOL,NACOL,NAROW
83
INTEGER INTEN,OVCON,MAXDL
84
INTEGER ICOL(6),INPAR(3)
85
INTEGER STAT,IMNO,PRFLAG
86
INTEGER CONN ! connection flag, P8
87
INTEGER TINULL, TID, KUN, KNUL
89
INTEGER IX(512),IY(512),NPOS(2),LASTP(2)
90
INTEGER COLSYM,COLSIZ,COLCOL
91
INTEGER SSX,SSY,LSX,LSY,SKIPD
93
REAL RBUF(6),XY1(2),XY2(2)
95
REAL TRNULL,RINFO(8),RDUM
97
DOUBLE PRECISION TDNULL
99
CHARACTER*80 FRAME,LINE,CTEST
101
CHARACTER*16 UNIT1,UNIT2
102
CHARACTER IFLAG*3,DLINE*40,LASTLINE*40,FORM*16
103
CHARACTER*30 COLUMN(6)
106
LOGICAL ISEL,IPLOT,NULL(3)
108
INCLUDE 'MID_INCLUDE:TABLES.INC/NOLIST'
109
INCLUDE 'MID_INCLUDE:IDIDEV.INC/NOLIST'
110
INCLUDE 'MID_INCLUDE:IDIMEM.INC/NOLIST'
114
INCLUDE 'MID_INCLUDE:TABLED.INC/NOLIST'
116
DATA LINE/' '/, DLINE /' '/
117
DATA LASTLINE/' '/, FRAME /' '/, TABLE /' '/
118
DATA PARM /'P2','P3','P4','P5','P6','P7'/
119
DATA LASTP /0,0/, MAXDL /40/
121
C initialize MIDAS + attach ImageDisplay
122
CALL STSPRO('TLOADTBL')
125
C get info for relevant memory board + scroll overlay channel
126
C accordingly then clear scroll values, so we also start
127
C plotting at the lower left corner
129
CALL STKRDI('DAZHOLD',13,1,IAV,OVCON,KUN,KNUL,STAT)
130
CALL DTGICH(QDSPNO,QIMCH,FRAME,RINFO,STAT)
131
IF (FRAME(1:1).EQ.' ')
132
+ CALL STETER(14,'We need an image in the display...!')
133
CALL STFOPN(FRAME,D_R4_FORMAT,0,F_IMA_TYPE,IMNO,STAT)
135
+ CALL DAZZSC(QDSPNO,QOVCH,ZOOMX,SCROLX,SCROLY,STAT)
137
C INPUTI(20) serves as printflag for debugging
138
CALL STKRDI('INPUTI',20,1,IAV,PRFLAG,KUN,KNUL,STAT)
139
CALL STKRDI('IDIMEMI',2,4,IAV,IX,KUN,KNUL,STAT)
140
SSX = IX(1) !1st screen x-pixel
141
SSY = IX(2) !1st screen y-pixel
142
LSX = SSX + IX(3) -1 !last screen x-pixel
143
LSY = SSY + IX(4) -1 !last screen y-pixel
147
CALL TBMNUL(TINULL,TRNULL,TDNULL)
148
CALL STKRDC('IN_A',1,1,80,IAV,TABLE,KUN,KNUL,STAT)
150
CALL STKRDC(PARM(I),1,1,30,IAV,COLUMN(I),KUN,KNUL,STAT)
153
IF (COLUMN(3)(1:1) .EQ. '+') THEN
154
IC = 2 !no IDENT column
157
CALL UPCAS(COLUMN(3),LINE) !check for NOdraw option
158
I = INDEX(LINE,',NO')
161
COLUMN(3)(I:) = ' ' !clean column label
165
IF ((COLUMN(4)(1:1).EQ.'#').OR.(COLUMN(4)(1:1).EQ.':')) THEN
166
COLSYM = 1 !variable symbol from column
168
COLSYM = 0 !constant symbol
169
CALL GENCNV(COLUMN(4),1,1,INPAR(1),RDUM,RDUM,IAV)
170
IF (IAV.NE.1) INPAR(1) = 0
171
IF (INPAR(1).GE.100) THEN
173
INPAR(1) = INPAR(1) - 100
175
ISYMBOL = INPAR(1) + 1
177
IF ((COLUMN(5)(1:1).EQ.'#').OR.(COLUMN(5)(1:1).EQ.':')) THEN
178
COLSIZ = 1 !variable size from column
180
COLSIZ = 0 !constant size
181
CALL GENCNV(COLUMN(5),1,1,INPAR(2),RDUM,RDUM,IAV)
182
IF (IAV.NE.1) INPAR(2) = 3
184
IF ((COLUMN(6)(1:1).EQ.'#').OR.(COLUMN(6)(1:1).EQ.':')) THEN
185
COLCOL = 1 !variable color from column
187
COLCOL = 0 !constant color
188
CALL TSCOLR(COLUMN(6),INTEN) !color string -> color no.
191
CALL STKRDI('INPUTI',1,1,IAV,CONN,KUN,KNUL,STAT)
192
! this will put P8 into CONN
196
CALL TBTOPN(TABLE,F_I_MODE,TID,STAT)
197
CALL TBIGET(TID,NCOL,NROW,NSC,NACOL,NAROW,STAT)
198
DO 20, I=1,IC !search for x, y, ident cols
199
CALL TBCSER(TID,COLUMN(I),ICOL(I),STAT)
200
IF (ICOL(I).EQ.-1) CALL STETER(11,'Column not present')
202
IF (IC .EQ. 3) THEN ! if there is an ident col ...
203
CALL TBFGET(TID,ICOL(3),FORM,ILEN,TYPE,STAT) ! get type, format
204
IF (PRFLAG.EQ.99) WRITE(*,40090) TYPE,FORM
206
CALL TBUGET(TID,ICOL(1),UNIT1,STAT)
207
CALL TBUGET(TID,ICOL(2),UNIT2,STAT)
208
CALL UPCAS(UNIT1,UNIT1)
209
I = INDEX(UNIT1,'PIX') !that catches also "Frame Pixels"
210
CALL UPCAS(UNIT2,UNIT2)
211
J = INDEX(UNIT2,'PIX')
212
IF ((I.GT.0).AND.(J.GT.0)) THEN
217
IF (COLSYM.EQ.1) THEN
218
CALL TBCSER(TID,COLUMN(4),ICOL(4),STAT)
219
IF (ICOL(4).EQ.-1) CALL STETER(11,'Symbol column not present')
221
IF (COLSIZ.EQ.1) THEN
222
CALL TBCSER(TID,COLUMN(5),ICOL(5),STAT)
223
IF (ICOL(5).EQ.-1) CALL STETER(11,'Size column not present')
225
IF (COLCOL.EQ.1) THEN
226
CALL TBCSER(TID,COLUMN(6),ICOL(6),STAT)
227
IF (ICOL(6).EQ.-1) CALL STETER(11,'Color column not present')
231
CALL PIXXCV('INIT',IMNO,RBUF,STAT)
233
+ CALL STETER(12,'PIXXCV initialization failed...')
239
SKIPD = 0 !no. of skipped rows
241
DO 100, I=1,NROW !step through all rows
242
CALL TBSGET(TID,I,ISEL,STAT) !read row selection flag
243
CALL TBRRDR(TID,I,2,ICOL,VALUE,NULL,STAT)
244
IPLOT = ISEL .AND. ( .NOT. NULL(1)) .AND. ( .NOT. NULL(2))
247
IF (COLSYM.EQ.1) THEN
249
CALL TBRRDI(TID,I,1,ICOL(4),INPAR(1),NULL,STAT)
250
IF (INPAR(1).GT.100) THEN
252
INPAR(1) = INPAR(1) - 100
254
ISYMBOL = INPAR(1) + 1
257
+ CALL TBRRDI(TID,I,1,ICOL(5),INPAR(2),NULL,STAT)
259
+ CALL TBRRDI(TID,I,1,ICOL(6),INTEN,NULL,STAT)
263
CALL PIXXCV(IFLAG,0,RBUF,STAT)
265
IF (PRFLAG.EQ.99) WRITE(*,10077) I
267
GOTO 100 !coord conversion failed - skip this row
269
IF (PRFLAG.EQ.99) WRITE(*,10078) (RBUF(J),J=1,6)
271
C test, if we'd draw outside the display...
273
J = NINT(RBUF(5)) !screen x-pixel
274
IF ((J.LT.SSX).OR.(J.GT.LSX)) KUN = KUN + 1
275
J = NINT(RBUF(6)) !screen y-pixel
276
IF ((J.LT.SSY).OR.(J.GT.LSY)) KUN = KUN + 10
278
IF (PRFLAG.EQ.99) THEN
281
ELSE IF (KUN.EQ.10) THEN
288
GOTO 100 !screen pixels outside - skip this row
292
IF (CONN.EQ.1) THEN !yes, connect the symbols
294
IF (NVAL.GT.512) THEN !flush line buffer
295
CALL IIGPLY(QDSPNO,QOVCH,IX,IY,512,INTEN,1,STAT)
300
IX(NVAL) = NINT(RBUF(5))
301
IY(NVAL) = NINT(RBUF(6))
304
IF (ISYMBOL.GT.0) THEN
305
XY1(1) = RBUF(5) - INPAR(2)
306
XY1(2) = RBUF(6) - INPAR(2)
307
XY2(1) = RBUF(5) + INPAR(2)
308
XY2(2) = RBUF(6) + INPAR(2)
309
CALL DRAWME(ISYMBOL,FILL,XY1,XY2,INTEN)
312
IF (IC.EQ.3) THEN ! yes, there is a third column as ident
313
IF (TYPE .EQ. D_C_FORMAT) THEN !type is character
314
CALL TBERDC(TID,I,ICOL(3),CTEST,NULL(3),STAT)
315
CALL FT_EOS(CTEST,80,LINE,STAT)
316
NBYTE = INDEX(LINE,' ') - 1
317
IF (NBYTE.GT.39) NBYTE = 39 !DLINE is 40 chars.
318
DLINE(1:) = LINE(1:NBYTE)
319
ELSE !type of 3rd column is not char..
320
CALL TBERDR(TID,I,ICOL(3),VALUE(3),NULL(3),STAT)
321
IF ((TYPE .EQ. D_I1_FORMAT) .OR.
322
+ (TYPE .EQ. D_I2_FORMAT) .OR.
323
+ (TYPE .EQ. D_I4_FORMAT)) THEN !integer type
330
CALL W1FORM(FORM,IAV,MY,VALUE(3),TDNULL,DLINE)
332
MY = MAXDL - 1 !avoid overrun of DLINE
333
35 IF (DLINE(1:1) .EQ. ' ') THEN !remove leading blanks
336
DLINE(1:) = DLINE(2:)
345
NBYTE = INDEX(DLINE,' ') - 1
348
40 DLINE(NBYTE+1:) = '^' !mark the end
349
NPOS(1) = NINT(RBUF(5)) + 5
350
NPOS(2) = NINT(RBUF(6))
352
IF (CONN.NE.0) THEN ! connection flag P8 is +1 or -1
354
+ CALL IIGTXT(QDSPNO,QOVCH,DLINE(1:NBYTE),
355
+ NPOS(1),NPOS(2),0,0,INTEN,0,STAT)
357
ELSE ! CONN (P8) is zero (default)
358
IF (SELROW.EQ.1) THEN ! in first row of table
361
LASTLINE(1:) = DLINE(1:) !LASTLINE set to DLINE
364
IF (LASTLINE.EQ.DLINE) THEN !true, at least for first row
366
IF (NVAL.GT.512) THEN !flush line buffer
367
CALL IIGPLY(QDSPNO,QOVCH,IX,IY,512,INTEN,1,STAT)
372
ELSE !LASTLINE not equal DLINE
374
+ CALL IIGPLY(QDSPNO,QOVCH,IX,IY,NVAL,
377
NBYTE = INDEX(LASTLINE,'^') - 1
378
IF ((NBYTE.GT.0).AND.(NODRAW.EQ.0))
379
+ CALL IIGTXT(QDSPNO,QOVCH,LASTLINE(1:NBYTE),
380
+ LASTP(1),LASTP(2),0,0,INTEN,0,STAT)
381
LASTLINE(1:) = DLINE(1:)
386
IX(NVAL) = NINT(RBUF(5))
387
IY(NVAL) = NINT(RBUF(6))
395
IF ((CONN.NE.-1) .AND. (NODRAW.EQ.0)) THEN
396
NBYTE = INDEX(LASTLINE,'^') - 1
397
CALL IIGTXT(QDSPNO,QOVCH,LASTLINE(1:NBYTE),
398
+ LASTP(1),LASTP(2),0,0,INTEN,0,STAT)
403
CALL IIGPLY(QDSPNO,QOVCH,IX,IY,NVAL,INTEN,1,STAT)
406
C write no. of skipped rows into OUTPUTI(11)
407
CALL STKWRI('OUTPUTI',SKIPD,11,1,KUN,STAT)
411
CALL TBTCLO(TID,STAT)
413
C refresh the overlay:
418
10077 FORMAT('row no.',I5,' contains bad coord(s) - we skip ...')
419
10078 FORMAT('RBUF(1-6)',6F10.4)
420
10090 FORMAT('screen x-pixel outside - skip row no. ',I5)
421
10091 FORMAT('screen y-pixel outside - skip row no. ',I5)
422
10092 FORMAT('screen x- and y-pixel outside - skip row no. ',I5)
423
40090 FORMAT('refcolumn: type = ',I3,', format = ',A)
426
SUBROUTINE DRAWME(FLAG,FILL,XY1,XY2,INTENS)
431
INTEGER INTENS,N,NOP,IK,SW,N1,N2,M(2),IX,IY
432
INTEGER XFIG(513),YFIG(513)
433
INTEGER FLAG,FILL,RADIUS,RADX,RADY,NCX,NCY
437
REAL CONST,ANGLE,FACTO,AA
439
INCLUDE 'MID_INCLUDE:IDIDEV.INC/NOLIST'
440
INCLUDE 'MID_INCLUDE:IDIMEM.INC/NOLIST'
442
C branch according to flag
443
GO TO (100,200,100,500,600,700,800,900,1000),FLAG
445
C construct coordinates for a rectangle
446
100 IF (FILL.NE.1) THEN
449
XFIG(2) = XFIG(1) !move up
451
XFIG(3) = XY2(1) !move right
453
XFIG(4) = XFIG(3) !move down
468
SW = 3 - SW !oscillate between 1 and 2
478
C construct coordinates of a circle
479
200 CENTER(1) = NINT((XY1(1)+XY2(1))*0.5)
480
CENTER(2) = NINT((XY1(2)+XY2(2))*0.5)
481
RADX = ABS(XY1(1)-CENTER(1))
482
RADY = ABS(XY1(2)-CENTER(2))
483
RADIUS = NINT((RADX+RADY)*0.5) !get no. of points to draw
484
NOP = MIN(512,6*RADIUS)
486
FACTO = 0.017453 !Pi / 180.
488
C construct points on circle
492
XFIG(N) = CENTER(1) + NINT(RADIUS*COS(ANGLE))
493
YFIG(N) = CENTER(2) + NINT(RADIUS*SIN(ANGLE))
497
M(1) = CENTER(2) - RADIUS !low y
498
M(2) = CENTER(2) + RADIUS !high y
504
SW = -900 !start at -90 degs */
509
IF (SW.GT.900) GOTO 355 !avoid infinite loop
511
IY = NINT(RADIUS*SIN(ANGLE))
512
N1 = NCY + IY !test y-value of circle
513
IF (N1.LT.N) GOTO 330
515
IX = NINT(RADIUS*COS(ANGLE))
520
YFIG(IK) = YFIG(IK-1)
523
YFIG(IK) = YFIG(IK-1)
532
C construct coordinates of a triangle
533
500 IF (FILL.NE.1) THEN
536
CENTER(1) = NINT((XY1(1)+XY2(1))*0.5)
547
C construct coordinates of a triangle
550
CENTER(1) = NINT((XY1(1)+XY2(1))*0.5)
560
C construct coordinates of a cross
561
700 CENTER(1) = NINT((XY1(1)+XY2(1))*0.5)
562
CENTER(2) = NINT((XY1(2)+XY2(2))*0.5)
576
C construct coordinates of an open cross
577
800 CENTER(1) = NINT((XY1(1)+XY2(1))*0.5)
578
CENTER(2) = NINT((XY1(2)+XY2(2))*0.5)
579
IK = (XY2(1) - CENTER(1))/2
584
XFIG(2) = CENTER(1) - IK
587
CALL IIGPLY(QDSPNO,QOVCH,XFIG,YFIG,NOP,INTENS,1,N)
588
XFIG(1) = CENTER(1) + IK
590
CALL IIGPLY(QDSPNO,QOVCH,XFIG,YFIG,NOP,INTENS,1,N)
594
YFIG(2) = CENTER(2) - IK
595
CALL IIGPLY(QDSPNO,QOVCH,XFIG,YFIG,NOP,INTENS,1,N)
596
YFIG(1) = CENTER(2) + IK
598
CALL IIGPLY(QDSPNO,QOVCH,XFIG,YFIG,NOP,INTENS,1,N)
601
C construct coordinates of a diamond
602
900 CENTER(1) = NINT((XY1(1)+XY2(1))*0.5)
603
CENTER(2) = NINT((XY1(2)+XY2(2))*0.5)
617
C construct coordinates of an X shaped cross
618
1000 XFIG(1) = XY1(1)
623
CALL IIGPLY(QDSPNO,QOVCH,XFIG,YFIG,NOP,INTENS,1,N)
627
CALL IIGPLY(QDSPNO,QOVCH,XFIG,YFIG,NOP,INTENS,1,N)
631
10000 CALL IIGPLY(QDSPNO,QOVCH,XFIG,YFIG,NOP,INTENS,1,N)