SUBROUTINE DIS2B(IHIS,IZMIN,IZMAX,IXMIN,IXMAX,IYMIN,IYMAX) C C SUBROUTINE TO PLOT HISTOGRAMS ON THE ADM3A DUMB TERMINAL C IHIS = HIST # C C IHIS =-100 RETRACE PLOT ONLY, DO NOT DO SCALES ETC. C IZMIN,IZMAX = SCALE FOR 1 OR 2 DIM HISTS C 0 = AUTO SCALE C 1 - 12 = 32 MAX - 64K C = ANY CONTOUR # FOR 2 DIM PLOT C BYTE IB(80) INTEGER*4 IN2,IXMIN,IXMAX,IYMIN,IYMAX,IZMIN,IZMAX,JZMIN,JZMAX REAL YORG,XORG,XSC,YSC COMMON /MSCAL/XORG,XSC,YORG,YSC COMMON /D2SAVE/IHS,IXSIZ,IYSIZ,IXS,IX0,IYS,IY0,ITYPE, 1 IJUMP,JXMIN,JXMAX,JYMIN,JYMAX,JZMIN,JZMAX,IX,IY, 2 ITIME(5) COMMON /SCRAT/IA(30),IC(30) INTEGER*4 ISTPA(25) EQUIVALENCE (IB,IA) DATA ISTPA/2,5,10,20,50,100,200,200,500,1000,2000,5000, 1 10000,20000,50000,50000,100000,200000,500000, 2 1000000,2000000,5000000,10000000,20000000,50000000/ DATA IBASE/32/,ITIC/16/ CALL DISCKP !DISABLE CHECKPOINT IF(IHIS .LE. -99 .AND. IXSIZ .NE. 0) GO TO 12 !RETRACE, NO SEARCHES IHS = IHIS CALL ERASE !ERASE SCREEN CALL CHAR(0,1023,'HIST#',5) !WRITE HIST# CALL NUMBER(-1,1023,IHS) DO 4 J = 1,30 4 IA(J) = ' ' CALL GTITL(IHS,IA,5) !GET 5 WORD TITLE CALL GTITL(0,IA(7),5) CALL TIME(IA(13)) !GET TIME CALL DATE(IA(19)) !GET DATE INTO ARRAY CALL CHAR(140,1023,IA,45) !WRITE DATE+ TIME CALL HSTAT(IHS,IXSIZ,IYSIZ,IXS,IX0,IYS,IY0,ITYPE) !GET SIZES,SCALES ITYPE = IAND("3,ITYPE) IJUMP = 2 IF(ITYPE .EQ. 1) IJUMP = 1 IF(IXSIZ .GT. 0) GO TO 1 !HIST EXISTS PLOT IT CALL HTITL(IHIS) !HIST TITLES ON SCREEN GO TO 900 !EXIT C C SECTION TO DETERMINE SCALES + RANGES C 1 CONTINUE JXMIN = (IXMIN-IX0)/IXS JXMAX = (IXMAX-IX0)/IXS JYMIN = (IYMIN-IY0)/IYS JYMAX = (IYMAX-IY0)/IYS IF(IYMIN .EQ. 0 .AND. IYMAX .EQ. 0) JYMIN = IYSIZ IF(JXMIN .LT. 0)JXMIN = 0 IF(JYMIN .LT. 0)JYMIN = 0 IF(JXMAX .GE. IXSIZ)JXMAX = IXSIZ-1 IF(JYMAY .GE. IYSIZ)JXMAX = IXSIZ-1 IF(JXMIN+5 .LT. JXMAX) GO TO 2 JXMIN = 0 JXMAX = IXSIZ-1 2 IF(JYMAX .GE. JYMIN) GO TO 3 JYMIN = 0 JYMAX = IYSIZ-1 3 CONTINUE IF(JXMAX .GT. JXMIN+1023) JXMAX = JXMIN+1023 IY = JYMAX-JYMIN !NUMBER OF SWEEPS IX = JXMAX-JXMIN JZMIN = IZMIN JZMAX = IZMAX IF(JZMIN .LT. JZMAX) GO TO 6 IF(JZMIN .GT. 0 .AND. IY .GT. 3) GO TO 400 JZMIN = 100000 JZMAX = 0 IN2 = 0 K = 1 !IF 2 D IGNORE OVERFLOW IF(IY .LE. 3) K = 0 !1D SO NO 2D OVERFLOW DO 5 I = JYMIN+K,JYMAX-K DO 5 J = JXMIN+1,JXMAX-1 CALL HGET(IHS,IN2,IJUMP*(I*IXSIZ+J)+1,IJUMP,ISZ) IF(IN2 .LT. JZMIN) JZMIN = IN2 IF(IN2 .GT. JZMAX) JZMAX = IN2 5 CONTINUE 6 IF(IY .GT. 3) JZMIN = JZMAX/2 12 IF(IY .GT. 3) GO TO 400 !DO 2 DIM HIST C C DO 1 DIMENSIONAL HIST C IN2 = 0 !START WITH ZERO IMULT = IY + 1 !NUMBER OF SWEEPS IBSTP = 740/IMULT DO 90 I = 1,2 TEMP = IMULT * (JZMAX - JZMIN) IF(TEMP .LT. 20.)TEMP = 20. !LIMIT MAX SCALE IS = ALOG(TEMP)/.69314718 - 2.4512111 !(ALOG(TEMP)-ALOG(700))/ALOG(2) + 7 IF(IS .GT. 25)IS = 25 JZMIN = JZMIN/ISTPA(IS) 90 JZMIN = JZMIN*ISTPA(IS) ISF = 6 - IS !NOW IS SHIFT FACTOR IXSTEP = 940/(IX+1) !STEPS/BIN IF(IXSTEP .LT. 3) IXSTEP = 1024/(IX+1) IXM = IXSTEP*(IX+1) DO 120 II = JYMIN,JYMAX IF(IHIS .GT. 0 .AND. IYSIZ .GT. 1) 1 CALL NUMBER(1023,IBASE+26,IY0+IYS*II) !Y SCALE IXP = 0 !X POSITION CALL PTPL(IXM,IBASE) !START PLOT AT RH MARGIN IA(1) = 0 !NEXT TO L HAND MARGIN IA(2) = 0 !L HAND MARGIN IC(1) = IBASE !BOTTOM MARGIN IC(2) = IBASE !DRAWS A BASE LINE IPOINT = 2 ICHAN = IJUMP * (JXMIN + II*IXSIZ) + 1 DO 100 I = JXMIN,JXMAX CALL HGET(IHS,IN2,ICHAN,IJUMP,ISZ) !GET VALUES DESIRED ICHAN = ICHAN + IJUMP IN2 = IN2 - JZMIN IF(IN2 .LT. 0)IN2 = 0 IN2 = ISHFT(IN2,ISF) + IBASE !Y VALUE IF(IN2 .GT. 800) IN2 = 800 IF(IN2 .EQ. IC(IPOINT))GO TO 50 IPOINT = IPOINT + 1 IA(IPOINT) = IXP IC(IPOINT) = IN2 IPOINT = IPOINT + 1 IC(IPOINT) = IN2 50 IXP = IXP + IXSTEP !NEXT X LOCATION IA(IPOINT) = IXP IF(IPOINT .LT.18) GO TO 100 IPOINT = IPOINT - 1 CALL VECT(IA,IC,IPOINT) IA(1) = IXP IC(1) = IN2 IPOINT = 1 100 CONTINUE IPOINT = IPOINT+1 IA(IPOINT) = IXP IC(IPOINT) = IBASE CALL VECT(IA,IC,IPOINT) 120 IBASE = IBASE + IBSTP C C SET UP DATA FOR X,Y SCALES C IBASE = 32 !Y OFFSET IYM = 690/IMULT YSTEP = ISTPA(IS) !STEP IYSTEP = YSTEP/2.**(IS-6) IMULT = IMULT - 1 YORG = JZMIN GO TO 600 C C DO 2 DIMENSIONAL HISTS HERE C 400 CONTINUE IF(IHIS .LE. 0) GO TO 401 CALL CHAR(800,1023,'CONTOUR ',0) CALL NUMBER(-1,1023,JZMIN) IF(JZMIN .LE. 0) JZMIN = 1 401 IYSTEP = 10 IF(IX .GT. 64) IX = 64 IF(IY .GT. 50) IY = 50 DO 500 IYP = 0,IY MAX = 0 MIN = 0 DO 490 IXP = 1,IX+1 I = JXMIN + IXP + (JYMIN + IYP)*IXSIZ I = IJUMP*(I-1) + 1 CALL HGET(IHS,IN2,I,IJUMP,ISZ) IB(IXP) = ' ' !DEFALUT PLOT BLANK IF(IN2 .LT. JZMIN) GO TO 490 IB(IXP) = '*' !POINT TO DISPLAY MAX = IXP !MAX POINT TO DISPLAY IF(MIN .EQ. 0) MIN = MAX !MIN POINT TO DISPLAY 490 CONTINUE IF(MIN .EQ. 0)GO TO 500 !IF, NO POINTS TO PLOT IXP = (MIN - 1)*14 I = IYP*14 + IBASE MAX = MAX - MIN + 1 CALL CHAR(IXP,I,IB(MIN),MAX) !PLOT 1 LINE 500 CONTINUE IYM = 14 * (IY + 1) IXM = 14 * (IX + 1) IYP = IBASE + IYM !TOP OF FRAME IA(1) = 0 !SET UP TO DRAW IA(2) = IXM !A FRAME AROUND IA(3) = IXM !THE 2 DIM HIST. IA(4) = 0 IA(5) = 0 IC(1) = IBASE IC(2) = IBASE IC(3) = IYP IC(4) = IYP IC(5) = IBASE CALL VECT(IA,IC,-5) !DRAW FRAME IXSTEP = 14 IYSTEP = 70 YORG = IY0 + JYMIN*IXS YSTEP = IYS * 5 IMULT = 0 C C NOW PUT UP THE X SCALE C 600 CONTINUE XORG = IX0 + JXMIN*IXS XSC = IXS/FLOAT(IXSTEP) YSC = YSTEP/FLOAT(IYSTEP) IF(IHIS .LT. 0) GO TO 900 !NO SCALES IF SIMPLE RETRACE IF(IX .GT. 200)GO TO 605 IXP = 0 DO 604 I = 0,IX,20 MAX = IX - I + 1 IF(MAX .GT. 20)MAX = 20 DO 603 J = 1,MAX IC(J) = IBASE - 4 IA(J) = IXP 603 IXP = IXP + IXSTEP CALL PTPL(IA,IC,MAX) 604 CONTINUE 605 DO 610 J = 1,10 ISTP = ISTPA(J) !TRY THIS FACTOR IF(ISTP*IXSTEP .GT. 100) GO TO 630 !IT IS CORRECT 610 CONTINUE 630 CONTINUE DO 650 I = 0,IX+1,ISTP IXP = I*IXSTEP !POSITION OF VERT LINE CALL PTPL(IXP,ITIC) CALL VECT(IXP,IBASE) IF(IXP .GT. 940) GO TO 650 IN2 = I IN2 = XORG + IN2*IXS CALL NUMBR2(IXP+6,0,IN2) !OUTPUT THE VALUE 650 CONTINUE 651 CONTINUE C C PUT UP Y SCALES C IF(IXM .GT. 1000) IXM = 1000 !STARTING PT. OF TICS DO 700 II = 0,IMULT IN2 = YORG DO 700 J = 0,IYM,IYSTEP IYP = J + IBASE + II*IBSTP CALL PTPL(IXM,IYP) CALL VECT(IXM+ITIC,IYP) !HORIZ TIC CALL NUMBR2(IXM+ITIC+6,IYP+6,IN2) !WRITE VALUE ON SCREEN 700 IN2 = IN2 + YSTEP !NEXT VALUE TO WRITE C C PUT UP MARKERS FOR CUTS C YORG = YORG - YSC*IBASE CALL MGETA(0,MMAX,AX) ! Get the number of markers DO 800 I = 1,MMAX ! Do all markers CALL MGETA(I,J,AX) !GET MARKER IF(ABS(J) .NE. IHS) GO TO 800 !IF NOT FOR THIS HIS 800 CALL MARKPL(I) 800 CONTINUE C C HERE THE PLOTTING IS TERMINATED C 900 CONTINUE CALL ENACKP !ENABLE CHECKPOINT END !EXIT FROM PROGRAM SUBROUTINE MARKPL(I) C C SUBROUTINE TO PLOT MARKERS ON SCREEN C COMMON /MSCAL/XORG,XSC,YORG,YSC CALL MGETA(I,J,VALUE) VAL = VALUE IF(J .GT. 0) VALUE = (VALUE - XORG)/XSC !LOCATION ON SCREEN OF CURSOR IF(J .LE. 0) VALUE = (VALUE - YORG)/YSC VALUE = VALUE + .01 IF(VALUE .LT. 0.)VALUE = 0 !LIMIT POSITION TO SCREN SIZE IF(VALUE .GT. 1023.)VALUE = 1023. !RIGHT HAND LIMIT IF(J .LT. 0) GO TO 780 IXP = VALUE !X POSITION OF VERT. TIC IYP = 730 CALL PTPL(IXP,32) !BOTTOM OF VERTICAL LINE GO TO 790 780 IYP = VALUE !DRAW A HORIZ MARKER IXP = 1023 CALL PTPL(0,IYP) !START HORIZ MARKER 790 CALL VECT(IXP,IYP) !TOP CALL NUMBER(IXP,IYP+4,I) !WRITE MARKER NUMBER END