Google
 

Trailing-Edge - PDP-10 Archives - bb-x130a-sb - xlplot.for
There are 4 other files named xlplot.for in the archive. Click here to see a list.
! R Powell Nov 1982  /RBP
! R Powell Jan 1983  /RBP	added support of sending screens to printer
!				or other terminals for hardcopy

	Program xlplot			! Program to plot data points
					!from files produced by xlate.for

	Implicit integer (a - z)

	Parameter	input = 30,	! Unit for raw data input file
     +			output = 32,	! Unit for data output
     +			temp = 31,	! Unit for temporary file
     +			tty = 5,		! Unit for TTY: I/O
	1		uniplt=1,	! Unit for hardcopy of screen
     +	ttwid = 110,			!terminal width (change
     +					!format stmts if this changes)
     +	tthigh = 21,			!terminal plot height
     +	mxcsym=10			!max pos in CNTSYM to use.  Put a * in that slot
	Integer	matrix(ttwid,tthigh),		! Internal temporary storage for graph
     +		yaxis(55),		! Label for Y-axis
     +		commnt(16),		! Line of comments
     +		matln(ttwid)  		! line for printing 

	Real	x,			! x value
     +		y,			! y value
     +		xmin,			! Minimum x value
     +		xmax,			! Maximum x value
     +		ymin,			! Minimum y value
     +		ymax,			! Maximum x value
     +		xscale,			! Scaling factor for x
     +		yscale,			! Scaling factor for y
     +		yax,			! Temporary Y-ordinate
     +		xpoint(12),		! Display points on X-axis
     +		xxmin,			!minimum X value to select from input file
     +		xxmax			!maximum X value to select from input file


	Logical	xsel			! true if selecting ranges of
					! X values in input file
	logical	ploted			!we have plotted something so far
	logical	outtty			!true if output is to tty:
	logical pltopn			!true if PLT: is currently opened

	data outtty /.false./
	data ploted /.false./
	data xsel   /.false./
	data pltopn /.false./




10000	Format ($ ' input file: ')
10005	Format (16a5)
10006	FORMAT (a4,1x,55A1)
10015	Format (1x)
10020	Format (2f)
10025	Format (1x, a1 $)
10030   Format (/, ' Output to TTY:? (Y or N):  ',$)
10060	Format (/, ' Comment line: ')
11000	Format (1h1)
11010 	Format (1X,A1, f12.4, '!', 110a1)	!change if ttwid changes
11020	Format (1X,A1,12X, '!', 110a1)		!change if ttwid changes
11030	Format (1x,'Y=',a4,7x, '-',11('---------!'))	!change if ttwid changes
11040	Format (1x,'X=TIME' 12f10.2)
11050	Format (1h+, 18x, 110a1)		!change if ttwid changes
11060	FormaT (1X,A1, f12.4, '!')
11070 	Format (
	1	' DATE:  ',i2,'/',i2,'/',i2,
     +		15x, 16a5,$)
11080	Format (18x, '!')

11090	Format (/' Use all input file data, or select X-axis limits?',
     +	/,'  (ALL or SELECT):  ',$)

11092	Format (' Minimum X-value to extract from input file:  ',$)
11094	Format (' Maximum X-value to extract from input file:  ',$)

11098	Format (' Ymin='f,'  Ymax=',f,'  Yscale=',f,/,
     +	' Xmin=',f,'  Xmax=',f,'  Xscale=',f)

13001	format (a4,4f)
13002	format (/' What plots to graph?  Type:',/,
	1 '  "ALL" for all plots in input file, or',/,
	1 '  4-character TRACK name of desired plot:  ',$)
13003	format (' %No data found in file for plot "',
	1 a4,'"')
13004	format (' ?Sequence error.   YAXIS record is "',a4,'"',/,
	1 '  Scaling record is "',a4,'".  Aborting processing',/)
13005	format (a4,3(1x,i2) )		!reading date records
13006	format (a4,1x,8a5)		!reading comment records



10	Type 10000			! Ask for input file specs


	Open (	unit = input,		! Open the input file
     +		device = 'dsk',		!   default device is disk
     +		file = 'plot.dat',	!   default file name and extension
     +		mode = 'ascii',		!   raw input data is characters
     +		access = 'seqin',	!   this is a sequential input file
     +		dialog,			!   ask user for file name
     +		buffer count = 4)	!   set up 4 buffers for file

30	Type 10030			! Ask for output file specs
	Read (	tty,			! Read from tty
     +		10005,			! Output file specs string
     +		end = 999)		! Terminate on ^Z
	1			i	!get y or n

	if ( (i .eq. 'Y') .or.
	1    (i .eq. 'y') ) outtty='TTY:'

	if (outtty)
	1 open (unit=output,device='tty:',mode='ascii',
	1	access='seqout')

	if  (.not. outtty)
	1 	Open (	unit = output,
     +		device = 'dsk',
     +		file = 'outplt.dat',
     +		mode = 'ascii',
     +		access = 'seqout',
     +		dialog,
     +		record size = 130,
     +		buffer count = 2)


34	continue
	read (input,13005)i,iyr,imon,iday	!date record
	read (input,13006)i,(commnt(j),j=9,16)	!comment record

	Type 10060			! Get comment line
	Read (tty, 10005, end=999) (commnt(i),i=1,8)

	type 13002			!get name of desired plot
	accept 13001,namplt		!or 'ALL'
	if (namplt .eq. 'all')namplt='ALL'

37	type 11090			!see what he wants
	Read (tty, 10005),i
	If ( (i .ne. 'ALL') .and. (i .ne. 'all') .and.
     +		(i .ne. 'SELEC') .and. (i .ne. 'selec')) goto 37
	If ( (i .eq. 'ALL') .or. (i .eq. 'all') )goto 39	!no selection to do
	xsel=.true.
	Type 11092			!prompt for xxmin
	Read (tty,10020)xxmin
	Type 11094			!prompt for xxmax
	Read (tty,10020)xxmax

39	continue


!here to begin first/next plot
!read in y axis record, and skip until correct plot found (unless
!plotting everything)
41	continue
	read (input,10006,end=999)
	1	itype,yaxis
	if (namplt .eq. 'ALL') goto 45
	if (namplt .ne. itype) goto 41
45	continue

!read in scaling values

	read (input,13001)i,xmin,xmax,ymin,ymax
	if (i .ne. itype) goto 1100		!sequence error?

	if (.not. xsel) goto 50		!redefine min/max if selecting
	xmin=xxmin
	xmax=xxmax
50	continue

	mincnt = 0

	Xscale = (xmax - xmin)/ttwid	! Set scale factor
	Yscale = (ymax - ymin)/tthigh	!   Y-axis also

! NOW PLOT DATA FROM  FILE

	Do 70 i=1,ttwid			! Initialize matrix
	Do 70 j=1,tthigh
	  Matrix(i,j) = 0
70	Continue

80	Read (	input,13001)			! Input data file
     +		jtype,x,y			!

	if (jtype .eq. 'END') goto 90		!end of this graph
	rectot = rectot + 1 
	If (.not. xsel) goto 85		!selecting ranges of x-values?

	If ( (x .lt. xxmin) .or. (x .gt. xxmax) ) goto 80	!Ignore record

85	xloc = min0(int((x-xmin)/xscale),(ttwid-1)) + 1	!X matrix index
	yloc = min0(int((y-ymin)/yscale),(tthigh-1)) + 1	!Y matrix index
	matrix(xloc,yloc) = matrix (xloc,yloc) + 1
	If (mincnt .lt. matrix(xloc,yloc)) mincnt = mincnt + 1
	Go to 80

!here when end record seen for this graph's data - now plot it out
90	Continue
	write (output,11000)		!new page for new plot
	ploted=.true.			!and we have (almost) plotted something


	Do 120 i = 1,tthigh			! Loop over matrix lines
	Do 100 j=1,ttwid			! Convert matrix to symbols
	Matln(j) = ' '		!assume no point to plot
	IF (matrix(J,(tthigh+1)-I) .GT. 0) 
	1    Matln(j) = '*'	!   and replace matrix element
100	Continue
	  yax = Ymax - (yscale*(i-1))	! Value of Y-coordinate
	  If (mod(i-1,5).ne.0) 		! Print every 5th value
     +	    Go to 110
	Write (output, 11010, err=999)	! Print line of matrix
	1 YAXIS(I),
	1      Yax, (matln(j),j=1,ttwid)
	Go to 120
110	Write (output, 11020,err=999) 	! Line without ordinate value
	1 YAXIS(I),
	1	    (matln(j),j=1,ttwid)
120	Continue


	Write (output,11030)itype

	Do 130 i=1,12
	   Xpoint(13-i) = xmax - (i-1)*xscale*10
130	Continue

	Write (output,11040) (xpoint(i),i=1,12)  ! print X ordinates

	Write (output, 11070, err=999)
     +	  imon,iday,iyr,
     +	  (commnt(i),i=1,16)

	if (.not. outtty) goto 700

!here to see if terminal user wants to do hardcopy
150	continue
	ACCEPT 10005,IDUMMY		!PAUSE FOR A WHILE

	if (idummy .eq. ' ') goto 700			!skip if no output desired
	if ( (idummy .eq. 'e') .or. (idummy .eq. 'E') )
	1 goto 999				!user wants to exit
	if ( (idummy .eq. 'a') .or. (idummy .eq. 'a') )
	1 goto 9999				!user wants to abort

	if (.not. pltopn)
	1 	open(unit=uniplt,device='PLT',file='xlplot.plt',
	1 mode='ascii',access='append')
	pltopn=.true.				!to prevent further OPENs,
						!which imply CLOSEs, which
						!print each plot seperately
!	CALL SETWID(uniplt)		!SET TTY WIDTH TO 132

!now do the same thing again, but for device UNIPLT:


	Do 220 i = 1,tthigh			! Loop over matrix lines
	Do 200 j=1,ttwid			! Convert matrix to symbols
	Matln(j) = ' '		!assume no point to plot
	IF (matrix(J,(tthigh+1)-I) .GT. 0) 
	1    Matln(j) = '*'	!   and replace matrix element
200	Continue
	  yax = Ymax - (yscale*(i-1))	! Value of Y-coordinate
	  If (mod(i-1,5).ne.0) 		! Print every 5th value
     +	    Go to 210
	Write (uniplt, 11010, err=999)	! Print line of matrix
	1 YAXIS(I),
	1      Yax, (matln(j),j=1,ttwid)
	Go to 220
210	Write (uniplt, 11020,err=999) 	! Line without ordinate value
	1 YAXIS(I),
	1	    (matln(j),j=1,ttwid)
220	Continue


	Write (uniplt,11030)itype

	Do 230 i=1,12
	   Xpoint(13-i) = xmax - (i-1)*xscale*10
230	Continue

	Write (uniplt,11040) (xpoint(i),i=1,12)  ! print X ordinates

	Write (uniplt, 11070, err=999)
     +	  imon,iday,iyr,
     +	  (commnt(i),i=1,16)

	if ( (idummy .eq. 'll') .or. (idummy .eq. 'LL'))
	1 goto 150		!do it again




!output min/max info
700	continue
	Write (output, 11098, err=999)
     +	ymin,ymax,yscale,
     +	xmin,xmax,xscale

	go to 41					!plot next graph, if any



!here on eof
999	continue

	if (.not. ploted) type 13003,namplt	!warn if nothing ploted
	Close ( unit = output)		!close the output file
	close (unit=uniplt)
!here on an abort
9999	continue

	call exit


!here if sequence error seen (type field of scaling record not same
!as type field of preceeding yaxis label record)
1100	continue
	type 13004,itype,jtype
	goto 999

	End