73 SUBROUTINE hmpdef(ih,xa,xb,text) ! book, reset histogram
91 INTEGER,
INTENT(IN) :: ih
92 REAL,
INTENT(IN) :: xa
93 REAL,
INTENT(IN) :: xb
94 CHARACTER (LEN=*),
INTENT(IN) :: text
95 INTEGER,
PARAMETER :: numhis=15
96 INTEGER:: inhist(120,numhis)
97 INTEGER::jnhist(5,numhis)
98 INTEGER::khist(numhis)
99 REAL:: fnhist(120,numhis)
100 equivalence(inhist(1,1),fnhist(1,1))
101 INTEGER:: kvers(numhis)
103 DOUBLE PRECISION:: dl(2,numhis)
104 CHARACTER (LEN=60):: htext(numhis)
106 DATA khist/numhis*0/,lun/7/
108 IF(ih <= 0.OR.ih > numhis) return
119 IF(xa /= xb) xl(3,ih)=120.0/(xb-xa)
121 IF(khist(ih) == 0)
THEN
124 kvers(ih)=kvers(ih)+1
132 entry hmpldf(ih,text)
133 IF(ih <= 0.OR.ih > numhis) return
140 IF(khist(ih) == 0)
THEN
143 kvers(ih)=kvers(ih)+1
152 IF(ih <= 0.OR.ih > numhis) return
153 IF(khist(ih) /= 1) return
154 IF(jnhist(4,ih) >= 2147483647) return
155 jnhist(4,ih)=jnhist(4,ih)+1
156 IF(jnhist(4,ih) <= 120)
THEN
157 fnhist(jnhist(4,ih),ih)=x
158 IF(jnhist(4,ih) == 120)
THEN
159 CALL
hmpmak(inhist(1,ih),fnhist(1,ih),jnhist(1,ih), xl(1,ih),dl(1,ih))
167 i=int(1.0+xl(3,ih)*(x-xl(1,ih)))
171 jnhist(j,ih)=jnhist(j,ih)+1
172 xl(4,ih)=min(xl(4,ih),x)
173 xl(5,ih)=max(xl(5,ih),x)
175 inhist(i,ih)=inhist(i,ih)+1
176 dl(1,ih)=dl(1,ih)+ x-xl(6,ih)
177 dl(2,ih)=dl(2,ih)+(x-xl(6,ih))**2
181 IF(ih <= 0.OR.ih > numhis) return
182 IF(khist(ih) /= 2) return
183 IF(jnhist(1,ih) >= 2147483647) return
185 jnhist(1,ih)=jnhist(1,ih)+1
187 IF(jnhist(4,ih) == 0) jnhist(4,ih)=ix
188 IF(jnhist(5,ih) == 0) jnhist(5,ih)=ix
189 jnhist(4,ih)=min(jnhist(4,ih),ix)
190 jnhist(5,ih)=max(jnhist(5,ih),ix)
191 i=int(1.0+20.0*log10(
REAL(ix)))
195 IF(j == 2) inhist(i,ih)=inhist(i,ih)+1
196 jnhist(j,ih)=jnhist(j,ih)+1
205 IF(ih <= 0.OR.ih > numhis) return
210 IF(khist(ihc) /= 0)
THEN
211 IF(khist(ihc) == 1)
THEN
212 CALL
hmpmak(inhist(1,ihc),fnhist(1,ihc),jnhist(1,ihc), &
215 nn=jnhist(1,ihc)+jnhist(2,ihc)+jnhist(3,ihc)
216 IF(nn /= 0.OR.khist(ihc) == 3)
THEN
218 111 format(
' ______',2(
'______________________________'))
219 IF(kvers(ihc) == 1)
THEN
220 WRITE(*,*)
'Histogram',ihc,
': ',htext(ihc)
222 WRITE(*,*)
'Histogram',ihc,
'/',kvers(ihc),
': ',htext(ihc)
224 IF(khist(ihc) == 1)
THEN
225 WRITE(*,*)
' Out_low inside out_high = ', (jnhist(j,ihc),j=1,3)
226 ELSE IF(khist(ihc) == 2)
THEN
227 WRITE(*,*)
' 0_or_negative inside above_10^6 = ', &
228 (jnhist(j,ihc),j=1,3)
230 IF(khist(ihc) == 3)
THEN
231 CALL
pfvert(120,fnhist(1,ihc))
233 IF(jnhist(2,ihc) /= 0)
THEN
234 CALL
pivert(120,inhist(1,ihc))
235 IF(khist(ihc) == 1)
THEN
236 CALL
psvert(xl(1,ihc),xl(2,ihc))
237 ELSE IF(khist(ihc) == 2)
THEN
241 IF(khist(ihc) == 1)
THEN
242 WRITE(*,*)
' Min and Max are',xl(4,ihc),xl(5,ihc)
243 IF(jnhist(2,ihc) > 1)
THEN
244 xmean=
REAL(xl(6,ihc)+dl(1,ihc)/float(jnhist(2,ihc)))
245 xcent=0.5*(xl(1,ihc)+xl(2,ihc))
246 xsigm=
REAL((dl(2,ihc)-dl(1,ihc)**2/float(jnhist(2,ihc))))
247 xsigm=sqrt(xsigm/float(jnhist(2,ihc)-1))
248 WRITE(*,*)
' Mean and sigma are', xmean,
' +-',xsigm
250 ELSE IF(khist(ihc) == 2)
THEN
251 WRITE(*,*)
' Plot of log10 of entries. Min and Max are', &
252 jnhist(4,ihc),jnhist(5,ihc)
269 IF(ih <= 0.OR.ih > numhis) return
275 IF(khist(ihc) /= 0)
THEN
276 IF(khist(ihc) == 1)
THEN
277 CALL
hmpmak(inhist(1,ihc),fnhist(1,ihc),jnhist(1,ihc), &
282 WRITE(lun,201) ihc,kvers(ihc),khist(ihc)
283 WRITE(lun,204) htext(ihc)
284 IF (jnhist(1,ihc)+jnhist(2,ihc)+jnhist(3,ihc) == 0 &
285 .AND.xl(1,ihc) == xl(2,ihc))
THEN
289 WRITE(lun,202) nbin,xl(1,ihc)-0.001,xl(2,ihc)+0.001
291 WRITE(lun,202) nbin,xl(1,ihc),xl(2,ihc)
293 WRITE(lun,203) (jnhist(j,ihc),j=1,3)
294 WRITE(lun,204)
'bincontent'
295 IF(khist(ihc) == 1.OR.khist(ihc) == 2)
THEN
296 CALL
kprint(lun,inhist(1,ihc),nbin)
298 WRITE(lun,219) (fnhist(i,ihc),i=1,nbin)
301 IF(khist(ihc) == 1)
THEN
302 WRITE(lun,205) xl(4,ihc),xl(5,ihc)
303 ELSE IF(khist(ihc) == 2)
THEN
304 WRITE(lun,205) float(jnhist(4,ihc)),float(jnhist(5,ihc))
306 IF(khist(ihc) == 1)
THEN
307 IF(jnhist(2,ihc) > 1)
THEN
308 xmean=
REAL(xl(6,ihc)+dl(1,ihc)/float(jnhist(2,ihc)))
309 xcent=0.5*(xl(1,ihc)+xl(2,ihc))
310 xsigm=
REAL((dl(2,ihc)-dl(1,ihc)**2/float(jnhist(2,ihc))))
311 xsigm=sqrt(xsigm/float(jnhist(2,ihc)-1))
312 WRITE(lun,206) xmean,xsigm
315 WRITE(lun,204)
'end of histogram'
319 201 format(
'Histogram ',i4,10x,
'version ',i4,10x,
'type',i2)
320 202 format(10x,
' bins, limits ',i4,2g15.5)
321 203 format(10x,
'out-low inside out-high ',3i10)
323 205 format(
'minmax',2e15.7)
324 206 format(
'meansigma',2e15.7)
329 SUBROUTINE hmpmak(inhist,fnhist,jnhist,xl,dl) ! hist scale from data
339 INTEGER,
INTENT(OUT) :: inhist(120)
340 REAL,
INTENT(IN) :: fnhist(120)
341 INTEGER,
INTENT(IN OUT) :: jnhist(5)
342 REAL,
INTENT(IN OUT) :: xl(6)
343 DOUBLE PRECISION,
INTENT(OUT) :: dl(2)
352 IF(nn == 0.OR.jnhist(5) /= 0) return
358 CALL
heapf(cphist,nn)
359 IF(xl(3) == 0.0)
THEN
360 CALL
bintab(cphist,nn,xa,xb)
364 IF(xa /= xb) xl(3)=120.0/(xb-xa)
375 i=int(1.0+xl(3)*(x-xl(1)))
380 jnhist(j)=jnhist(j)+1
382 inhist(i)=inhist(i)+1
384 dl(2)=dl(2)+(x-xl(6))**2
392 SUBROUTINE bintab(tab,n,xa,xb) ! hist scale from data
410 REAL,
INTENT(IN) :: tab(n)
411 INTEGER,
INTENT(IN) :: n
412 REAL,
INTENT(OUT) :: xa
413 REAL,
INTENT(OUT) :: xb
416 DATA bin/1.0,1.5,2.0,3.0,4.0,5.0,8.0,10.0,15.0,20.0/
428 m1=int(1.0+0.05*float(n))
429 m2=int(1.0+0.16*float(n))
430 x1=tab(m1)-4.0*(tab(m2)-tab(m1))
431 IF(x1 < 0.0.AND.tab(1) >= 0.0) x1=tab(1)
432 x2=tab(n+1-m1)+4.0*(tab(n+1-m1)-tab(n+1-m2))
433 IF(x2 > 0.0.AND.tab(n) <= 0.0) x2=tab(n)
436 IF(x1*tab(1) <= 0.0) x1=0.0
437 IF(x2*tab(n) <= 0.0) x2=0.0
439 IF(x1*x2 < 0.0.AND.min(-x1,x2) > 0.6*max(-x1,x2))
THEN
443 ELSE IF(x1*x2 > 0.0.AND. &
444 abs(min(x1,x2)) < 0.4*abs(max(x1,x2)))
THEN
464 iexp=int(101.0+log10(dx)-log10(6.0*bin(i)))
470 IF(float(n1)*dd > x1) n1=n1-1
475 IF(float(n2)*dd < x2) n2=n2+1
477 10
IF(n2-n1 < 6)
THEN
479 IF(n2-n1 < 6.AND.n2 /= 0) n2=n2+1
483 xa=sign(float(n1)*dd,x1)
484 xb=sign(float(n2)*dd,x2)
486 IF((x2-x1)/(xb-xa) > rat)
THEN
494 SUBROUTINE kprint(lun,list,n) ! print integer array
505 INTEGER,
INTENT(IN OUT) :: lun
506 INTEGER,
INTENT(IN) :: list(n)
507 INTEGER,
INTENT(IN) :: n
509 DATA li/2,3,4,6,8,9,12/
522 IF(list(i) > lp.OR.list(i) < ln) go to 20
526 WRITE(lun,101) (list(i),i=ia,ib)
528 WRITE(lun,102) (list(i),i=ia,ib)
530 WRITE(lun,103) (list(i),i=ia,ib)
532 WRITE(lun,104) (list(i),i=ia,ib)
534 WRITE(lun,105) (list(i),i=ia,ib)
536 WRITE(lun,106) (list(i),i=ia,ib)
538 WRITE(lun,107) (list(i),i=ia,ib)
554 SUBROUTINE gmpdef(ig,ityp,text) ! book, reset XY storage
576 INTEGER,
INTENT(IN) :: ig
577 INTEGER,
INTENT(IN) :: ityp
578 CHARACTER (LEN=*),
INTENT(IN) :: text
579 INTEGER,
PARAMETER :: narr=1000
581 REAL::array4(4,narr/2)
582 REAL::array1(narr+narr)
584 equivalence(array(1,1),array4(1,1),array1(1))
585 INTEGER,
PARAMETER :: numgxy=10
586 INTEGER,
PARAMETER :: nlimit=500
587 INTEGER:: nstr(numgxy)
588 INTEGER::igtp(numgxy)
589 INTEGER::lvers(numgxy)
590 INTEGER::nst(3,numgxy)
591 REAL:: xyplws(10,numgxy)
592 INTEGER:: jflc(5,numgxy)
593 INTEGER::kflc(5,numgxy)
599 CHARACTER (LEN=60):: gtext(numgxy)
603 DATA start/.true./,lun/7/
617 IF(ig < 1.OR.ig > numgxy) return
618 IF(ityp < 1.OR.ityp > 5) return
619 IF(nstr(ig) == 0)
THEN
622 lvers(ig)=lvers(ig)+1
626 IF(jflc(1,ig) /= 0) CALL stmarm(jflc(1,ig))
627 IF(kflc(1,ig) /= 0) CALL stmarm(kflc(1,ig))
650 IF(ig < 1.OR.ig > numgxy) return
651 IF(igtp(ig) < 1.OR.igtp(ig) > 3) return
652 CALL stmapr(jflc(1,ig),x,y)
655 entry gmpxyd(ig,x,y,dx,dy)
656 IF(ig < 1.OR.ig > numgxy) return
657 IF(igtp(ig) /= 4) return
662 CALL stmadp(jflc(1,ig),four)
669 IF(ig < 1.OR.ig > numgxy) return
670 IF(igtp(ig) /= 5) return
673 IF(nst(1,ig) == 0)
THEN
676 IF(kflc(3,ig) == 0) xyplws(9,ig)=x
679 CALL stmapr(kflc(1,ig),y1,y)
680 IF(kflc(3,ig) >= kflc(5,ig))
THEN
681 CALL stmacp(kflc(1,ig),array,n)
682 CALL stmarm(kflc(1,ig))
684 CALL
rmesig(array,n,xyplws(2,ig),xyplws(4,ig))
685 nst(2,ig)=nst(2,ig)+1
686 IF(nst(2,ig) == 1) xyplws(7,ig)=xyplws(9,ig)
688 xyplws(5,ig)=xyplws(5,ig)+xyplws(2,ig)
689 xyplws(6,ig)=xyplws(6,ig)+xyplws(4,ig)
690 IF(nst(2,ig) == nst(3,ig))
THEN
691 xyplws(1,ig)=0.5*(xyplws(7,ig)+xyplws(8,ig))
692 xyplws(2,ig)=xyplws(5,ig)/float(nst(3,ig))
693 xyplws(3,ig)=0.5*(xyplws(8,ig)-xyplws(7,ig))
694 xyplws(4,ig)=xyplws(6,ig)/float(nst(3,ig))
698 CALL stmadp(jflc(1,ig),xyplws(1,ig))
699 IF(jflc(3,ig) >= jflc(5,ig))
THEN
700 CALL stmacp(jflc(1,ig),array4,n)
702 CALL stmarm(jflc(1,ig))
704 xyplws(7,ig)=array4(1,i )-array4(3, i)
705 xyplws(8,ig)=array4(1,i+1)+array4(3,i+1)
706 xyplws(1,ig)=0.5*(xyplws(7,ig)+xyplws(8,ig))
707 xyplws(2,ig)=0.5*(array4(2,i)+array4(2,i+1))
708 xyplws(3,ig)=0.5*(xyplws(8,ig)-xyplws(7,ig))
709 xyplws(4,ig)=0.5*(array4(4,i)+array4(4,i+1))
710 CALL stmadp(jflc(1,ig),xyplws(1,ig))
712 nst(3,ig)=nst(3,ig)+nst(3,ig)
724 IF(ig <= 0.OR.ig > numgxy) return
730 IF(igtp(igc) >= 1.AND.igtp(igc) <= 3)
THEN
732 WRITE(*,*)
'Store ',igc,
': ',gtext(igc)
733 IF(jflc(4,igc) == 0)
THEN
734 WRITE(*,*)
' stored n-tuples: ',jflc(3,igc)
736 WRITE(*,*)
' stored n-tuples, not-stored n-tuples: ', &
737 jflc(3,igc),
', ',jflc(4,igc)
740 CALL stmacp(jflc(1,igc),array,na)
743 WRITE(*,102) n, array(1,n),array(2,n)
746 ELSE IF(igtp(igc) == 4)
THEN
749 WRITE(*,*)
'Store ',igc,
': ',gtext(igc)
750 IF(jflc(4,igc) == 0)
THEN
751 WRITE(*,*)
' stored n-tuples: ',jflc(3,igc)
753 WRITE(*,*)
' stored n-tuples, not-stored n-tuples: ', &
754 jflc(3,igc),
', ',jflc(4,igc)
757 CALL stmacp(jflc(1,igc),array,na)
761 WRITE(*,102) n,(array4(j,n),j=1,4)
764 ELSE IF(igtp(igc) == 5)
THEN
766 CALL stmacp(kflc(1,igc),array,n)
767 CALL stmarm(kflc(1,igc))
769 IF(nst(1,igc) == 1)
THEN
775 xyplws(7,igc)=xyplws( 9,igc)
776 xyplws(8,igc)=xyplws(10,igc)
777 CALL
rmesig(array1,n,xyplws(2,igc),xyplws(4,igc))
778 wght=float(n)/float(nst(3,igc)*kflc(5,igc))
779 xyplws(5,igc)=xyplws(5,igc)+xyplws(2,igc)*wght
780 xyplws(6,igc)=xyplws(6,igc)+xyplws(4,igc)*wght
781 xyplws(2,igc)=xyplws(5,igc)/(float(nst(2,igc))+wght)
782 xyplws(4,igc)=xyplws(6,igc)/(float(nst(2,igc))+wght)
783 xyplws(1,igc)=0.5*(xyplws(7,igc)+xyplws(8,igc))
784 xyplws(3,igc)=0.5*(xyplws(8,igc)-xyplws(7,igc))
785 CALL stmadp(jflc(1,igc),xyplws(1,igc))
789 WRITE(*,*)
'Store ',igc,
': ',gtext(igc)
790 IF(jflc(4,igc) == 0)
THEN
791 WRITE(*,*)
' stored n-tuples: ',jflc(3,igc)
793 WRITE(*,*)
' stored n-tuples, not-stored n-tuples: ', &
794 jflc(3,igc),
', ',jflc(4,igc)
797 CALL stmacp(jflc(1,igc),array,na)
800 WRITE(*,102) n,(array4(j,n),j=1,4)
816 IF(ig <= 0.OR.ig > numgxy) return
821 IF(igtp(igc) == 5)
THEN
823 CALL stmacp(kflc(1,igc),array,n)
824 CALL stmarm(kflc(1,igc))
826 IF(nst(1,igc) == 1)
THEN
832 xyplws(7,igc)=xyplws( 9,igc)
833 xyplws(8,igc)=xyplws(10,igc)
834 CALL
rmesig(array1,n,xyplws(2,igc),xyplws(4,igc))
835 wght=float(n)/float(nst(3,igc)*kflc(5,igc))
836 xyplws(5,igc)=xyplws(5,igc)+xyplws(2,igc)*wght
837 xyplws(6,igc)=xyplws(6,igc)+xyplws(4,igc)*wght
838 xyplws(2,igc)=xyplws(5,igc)/(float(nst(2,igc))+wght)
839 xyplws(4,igc)=xyplws(6,igc)/(float(nst(2,igc))+wght)
840 xyplws(1,igc)=0.5*(xyplws(7,igc)+xyplws(8,igc))
841 xyplws(3,igc)=0.5*(xyplws(8,igc)-xyplws(7,igc))
842 CALL stmadp(jflc(1,igc),xyplws(1,igc))
846 IF(jflc(3,igc)+jflc(4,igc) /= 0)
THEN
848 WRITE(lun,201) igc,lvers(igc),igtp(igc)
849 WRITE(lun,204) gtext(igc)
850 WRITE(lun,203) jflc(3,igc)+jflc(4,igc)
851 CALL stmacp(jflc(1,igc),array,na)
852 IF(igtp(igc) >= 1.AND.igtp(igc) <= 3)
THEN
855 WRITE(lun,205) array(1,n),array(2,n)
857 ELSE IF(igtp(igc) == 4.OR.igtp(igc) == 5)
THEN
858 WRITE(lun,204)
'x-y-dx-dy'
861 WRITE(lun,205) (array4(j,n),j=1,4)
864 WRITE(lun,204)
'end of xy-data'
867 102 format(i12,4g15.7)
874 201 format(
'XY-Data ',i4,10x,
'version ',i4,10x,
'type',i2)
875 203 format(10x,
'stored not-stored ',2i10)
877 205 format(3x,4g15.7)
919 entry stmapr(jflc,x,y)
921 IF(ifre == 0.OR.jflc(3) >= jflc(5))
THEN
925 IF(jflc(1) == 0)
THEN
938 entry stmadp(jflc,four)
944 IF(ifreb == 0.OR.jflc(3) >= 2*jflc(5))
THEN
948 IF(jflc(1) == 0)
THEN
964 entry stmacp(jflc,array,n)
967 10
IF(ind == 0) return
982 SUBROUTINE rmesig(x,n,xloc,xsca) ! robust mean and sigma
990 REAL,
INTENT(IN OUT) :: x(n)
991 INTEGER,
INTENT(IN) :: n
992 REAL,
INTENT(OUT) :: xloc
993 REAL,
INTENT(OUT) :: xsca
1000 xloc=0.5*(x((n+1)/2)+x((n+2)/2))
1005 xsca=1.4826*0.5*(x((n+1)/2)+x((n+2)/2))