C***********************************************************************
C   THIS ROUTINE IS A REVISION OF AN ORIGINAL ROUTINE WITH THE FOLLOWING
C   REF. ALGORITHM AS 45  APPLIED STATISTICS (J.R.STATIST.SOC C),
C        (1971) VOL.20, NO.3
C
C        GIVEN A VECTOR OF FREQUENCIES, OR A VECTOR OF RAW DATA, A
C        HISTOGRAM IS PLOTTED SHOWING THE FREQUENCY DISTRIBUTION
C***********************************************************************
      SUBROUTINE HISTGM (FREQ,MM,LENG,CUT)
C
C     DECLARATIONS
C
      INTEGER SCALE
      DIMENSION CUT(*), FREQ(MM)
      CHARACTER*1 BDY(80), IOUT(80), TIC, IBLANK, ISTAR, IDASH
C
C     DATA STATEMENTS
C
      DATA  TIC, IBLANK, ISTAR, IDASH /'+',' ','*','-'/
      DATA IWRITE /6/, ETA /1.0E-38/, IWIDTH /80/
C   INITIALIZE BDY
      DO 5 I=1,12
 5    BDY(I)=IDASH
      DO 6 I=13,80
 6    BDY(I)=IBLANK
C
C        CHECK VALUES OF INPUT PARAMETERS AND TYPE OF INPUT
C
      M=MM
      K=(IWIDTH-15)/5
      IF (M.GT.K) M=K
      LINE=M*5+15
      LENGTH=LENG-10
      IF (LENGTH.LE.0) LENGTH=50
      FM=FLOAT(M)
      WRITE (IWRITE,120) (INT(FREQ(I)),I=1,M)
      WRITE (IWRITE,130) (IDASH,I=1,LINE)
C
C        FIND LARGEST FREQUENCY AND SCALE IF NECESSARY
C
      MAX=0
      DO 10 I=1,M
      IF (FREQ(I).GT.MAX) MAX=FREQ(I)
   10 CONTINUE
      SCALE=1
      DIV=1
      IF (MAX.LE.LENGTH) GO TO 20
      SCALE=(MAX+LENGTH-1)/LENGTH
      WRITE (IWRITE,80) (ISTAR,II=1,4),SCALE
      DIV=1./FLOAT(SCALE)
C
C        CLEAR OUTPUT TO BLANKS
C
   20 M4=M*4
      DO 30 I=1,M4
   30 IOUT(I)=IBLANK
C
C        FOR EACH LINE OF PRINT, PLACE OUTPUT CHARACTERS IN THEIR
C        APPROPRIATE POSITION IN THE OUTPUT VECTOR
C
      MAX=FLOAT(MAX)*DIV+.5
      DO 60 I=1,MAX
      K=MAX+1-I
      DO 50 J=1,M
      INDEX=FREQ(J)*DIV+.5
      IF (INDEX.NE.K) GO TO 50
      IND=(J-1)*4+1
      IND1=IND+3
      DO 40 KK=IND,IND1
   40 IOUT(KK)=ISTAR
   50 CONTINUE
      L=K*SCALE
      M4=M*4
C
C         PRINT LINE OF FREQUENCIES
C
   60 WRITE (IWRITE,90) L,(IOUT(J),J=1,M4)
      DO 70 J=1,M
      IND=(J-1)*5+13
      BDY(IND)=TIC
      DO 70 I=1,4
      IND1=IND+I
   70 BDY(IND1)=IDASH
      BDY(LINE)=IDASH
      L1=LINE-1
      BDY(L1)=IDASH
      IND1=M*5+13
      BDY(IND1)=TIC
      WRITE (IWRITE,130) (BDY(I),I=1,LINE)
      WRITE (6,100) (CUT(J),J=1,M,2)
      WRITE (6,110) (CUT(J),J=2,M,2)
C
C     FORMAT STATEMENTS
C
      RETURN
C
   80 FORMAT (' Each ',4A1,' approximately equals',I4,' points'/)
   90 FORMAT (' ',I8,4X,20(1X,4A1))
  100 FORMAT (' Interval     ',10(1X,G9.3))
  110 FORMAT (' End-points 0.00    ',10(1X,G9.3))
  120 FORMAT ('0Frequency  ',20I5)
  130 FORMAT (' ',80A1)
      END
