![]() |
Millepede-II
V04-00-00
|
00001 00002 ! Code converted using TO_F90 by Alan Miller 00003 ! Date: 2012-03-16 Time: 11:07:45 00004 00070 00071 ! *************************** Histograms ****************************** 00072 00073 SUBROUTINE hmpdef(ih,xa,xb,text) ! book, reset histogram 00074 IMPLICIT NONE 00075 INTEGER:: i 00076 INTEGER:: iha 00077 INTEGER:: ihb 00078 INTEGER:: ihc 00079 INTEGER:: ix 00080 INTEGER:: j 00081 INTEGER:: lun 00082 INTEGER:: lunw 00083 INTEGER:: nbin 00084 INTEGER:: nn 00085 REAL:: x 00086 REAL:: xcent 00087 REAL:: xmean 00088 REAL:: xsigm 00089 ! book millepede histogram, 120 bins 00090 00091 INTEGER, INTENT(IN) :: ih 00092 REAL, INTENT(IN) :: xa 00093 REAL, INTENT(IN) :: xb 00094 CHARACTER (LEN=*), INTENT(IN) :: text 00095 INTEGER, PARAMETER :: numhis=15 00096 INTEGER:: inhist(120,numhis) 00097 INTEGER::jnhist(5,numhis) 00098 INTEGER::khist(numhis) 00099 REAL:: fnhist(120,numhis) 00100 EQUIVALENCE (inhist(1,1),fnhist(1,1)) 00101 INTEGER:: kvers(numhis) 00102 REAL:: xl(6,numhis) 00103 DOUBLE PRECISION:: dl(2,numhis) 00104 CHARACTER (LEN=60):: htext(numhis) 00105 SAVE 00106 DATA khist/numhis*0/,lun/7/ 00107 ! ... 00108 IF(ih <= 0.OR.ih > numhis) RETURN 00109 ! IF(XA.EQ.XB) RETURN 00110 DO i=1,120 00111 inhist(i,ih)=0 00112 END DO 00113 DO j=1,5 00114 jnhist(j,ih)=0 00115 END DO 00116 xl(1,ih)=xa 00117 xl(2,ih)=xb 00118 xl(3,ih)=0.0 00119 IF(xa /= xb) xl(3,ih)=120.0/(xb-xa) 00120 xl(6,ih)=0.5*(xa+xb) ! center 00121 IF(khist(ih) == 0) THEN 00122 kvers(ih)=0 00123 ELSE 00124 kvers(ih)=kvers(ih)+1 00125 END IF 00126 khist(ih)=1 ! flt.pt. (lin) 00127 htext(ih)=text 00128 dl(1,ih)=0.0D0 00129 dl(2,ih)=0.0D0 00130 RETURN 00131 00132 ENTRY hmpldf(ih,text) ! book, reset log histogram 00133 IF(ih <= 0.OR.ih > numhis) RETURN 00134 DO i=1,120 00135 inhist(i,ih)=0 00136 END DO 00137 DO j=1,5 00138 jnhist(j,ih)=0 00139 END DO 00140 IF(khist(ih) == 0) THEN 00141 kvers(ih)=0 00142 ELSE 00143 kvers(ih)=kvers(ih)+1 00144 END IF 00145 khist(ih)=2 ! integer log 00146 htext(ih)=text 00147 xl(1,ih)=0.0 00148 xl(2,ih)=6.0 00149 RETURN 00150 00151 ENTRY hmpent(ih,x) ! entry flt.pt. 00152 IF(ih <= 0.OR.ih > numhis) RETURN 00153 IF(khist(ih) /= 1) RETURN 00154 IF(jnhist(4,ih) >= 2147483647) RETURN 00155 jnhist(4,ih)=jnhist(4,ih)+1 ! count 00156 IF(jnhist(4,ih) <= 120) THEN 00157 fnhist(jnhist(4,ih),ih)=x ! store value 00158 IF(jnhist(4,ih) == 120) THEN 00159 CALL hmpmak(inhist(1,ih),fnhist(1,ih),jnhist(1,ih), xl(1,ih),dl(1,ih)) 00160 END IF 00161 RETURN 00162 END IF 00163 ! IF(JNHIST(1,IH)+JNHIST(2,IH)+JNHIST(3,IH).EQ.0) THEN 00164 ! XL(4,IH)=X 00165 ! XL(5,IH)=X 00166 ! END IF 00167 i=INT(1.0+xl(3,ih)*(x-xl(1,ih))) ! X - Xmin 00168 j=2 00169 IF(i < 1) j=1 00170 IF(i > 120) j=3 00171 jnhist(j,ih)=jnhist(j,ih)+1 00172 xl(4,ih)=MIN(xl(4,ih),x) 00173 xl(5,ih)=MAX(xl(5,ih),x) 00174 IF(j /= 2) RETURN 00175 inhist(i,ih)=inhist(i,ih)+1 00176 dl(1,ih)=dl(1,ih)+ x-xl(6,ih) 00177 dl(2,ih)=dl(2,ih)+(x-xl(6,ih))**2 00178 RETURN 00179 00180 ENTRY hmplnt(ih,ix) ! entry integer 00181 IF(ih <= 0.OR.ih > numhis) RETURN 00182 IF(khist(ih) /= 2) RETURN 00183 IF(jnhist(1,ih) >= 2147483647) RETURN 00184 IF(ix <= 0) THEN 00185 jnhist(1,ih)=jnhist(1,ih)+1 00186 ELSE 00187 IF(jnhist(4,ih) == 0) jnhist(4,ih)=ix 00188 IF(jnhist(5,ih) == 0) jnhist(5,ih)=ix 00189 jnhist(4,ih)=MIN(jnhist(4,ih),ix) 00190 jnhist(5,ih)=MAX(jnhist(5,ih),ix) 00191 i=INT(1.0+20.0*LOG10(REAL(ix))) 00192 j=2 00193 IF(i < 1) j=1 00194 IF(i > 120) j=3 00195 IF(j == 2) inhist(i,ih)=inhist(i,ih)+1 00196 jnhist(j,ih)=jnhist(j,ih)+1 00197 END IF 00198 RETURN 00199 00200 ENTRY hmprnt(ih) ! print, content vert 00201 IF(ih == 0) THEN 00202 iha=1 00203 ihb=numhis 00204 ELSE 00205 IF(ih <= 0.OR.ih > numhis) RETURN 00206 iha=ih 00207 ihb=ih 00208 END IF 00209 DO ihc=iha,ihb 00210 IF(khist(ihc) /= 0) THEN 00211 IF(khist(ihc) == 1) THEN 00212 CALL hmpmak(inhist(1,ihc),fnhist(1,ihc),jnhist(1,ihc), & 00213 xl(1,ihc),dl(1,ihc)) 00214 END IF 00215 nn=jnhist(1,ihc)+jnhist(2,ihc)+jnhist(3,ihc) 00216 IF(nn /= 0.OR.khist(ihc) == 3) THEN 00217 WRITE(*,111) 00218 111 FORMAT(' ______',2('______________________________')) 00219 IF(kvers(ihc) == 1) THEN 00220 WRITE(*,*) 'Histogram',ihc,': ',htext(ihc) 00221 ELSE 00222 WRITE(*,*) 'Histogram',ihc,'/',kvers(ihc),': ',htext(ihc) 00223 END IF 00224 IF(khist(ihc) == 1) THEN 00225 WRITE(*,*) ' Out_low inside out_high = ', (jnhist(j,ihc),j=1,3) 00226 ELSE IF(khist(ihc) == 2) THEN 00227 WRITE(*,*) ' 0_or_negative inside above_10^6 = ', & 00228 (jnhist(j,ihc),j=1,3) 00229 END IF 00230 IF(khist(ihc) == 3) THEN 00231 CALL pfvert(120,fnhist(1,ihc)) 00232 END IF 00233 IF(jnhist(2,ihc) /= 0) THEN ! integer content 00234 CALL pivert(120,inhist(1,ihc)) 00235 IF(khist(ihc) == 1) THEN 00236 CALL psvert(xl(1,ihc),xl(2,ihc)) 00237 ELSE IF(khist(ihc) == 2) THEN 00238 CALL psvert(0.0,6.0) 00239 END IF 00240 END IF 00241 IF(khist(ihc) == 1) THEN 00242 WRITE(*,*) ' Min and Max are',xl(4,ihc),xl(5,ihc) 00243 IF(jnhist(2,ihc) > 1) THEN 00244 xmean=REAL(xl(6,ihc)+dl(1,ihc)/FLOAT(jnhist(2,ihc))) 00245 xcent=0.5*(xl(1,ihc)+xl(2,ihc)) 00246 xsigm=REAL((dl(2,ihc)-dl(1,ihc)**2/FLOAT(jnhist(2,ihc)))) 00247 xsigm=SQRT(xsigm/FLOAT(jnhist(2,ihc)-1)) 00248 WRITE(*,*) ' Mean and sigma are', xmean,' +-',xsigm 00249 END IF 00250 ELSE IF(khist(ihc) == 2) THEN 00251 WRITE(*,*) ' Plot of log10 of entries. Min and Max are', & 00252 jnhist(4,ihc),jnhist(5,ihc) 00253 END IF 00254 END IF 00255 END IF 00256 END DO 00257 RETURN 00258 00259 ENTRY hmplun(lunw) ! unit for output 00260 lun=lunw 00261 RETURN 00262 00263 ENTRY hmpwrt(ih) ! write histogram text file 00264 IF(lun <= 0) RETURN 00265 IF(ih == 0) THEN 00266 iha=1 00267 ihb=numhis 00268 ELSE 00269 IF(ih <= 0.OR.ih > numhis) RETURN 00270 iha=ih 00271 ihb=ih 00272 END IF 00273 00274 DO ihc=iha,ihb ! histogram loop 00275 IF(khist(ihc) /= 0) THEN 00276 IF(khist(ihc) == 1) THEN 00277 CALL hmpmak(inhist(1,ihc),fnhist(1,ihc),jnhist(1,ihc), & 00278 xl(1,ihc),dl(1,ihc)) 00279 END IF 00280 nbin=120 00281 WRITE(lun,204) ' ' 00282 WRITE(lun,201) ihc,kvers(ihc),khist(ihc) 00283 WRITE(lun,204) htext(ihc) 00284 IF (jnhist(1,ihc)+jnhist(2,ihc)+jnhist(3,ihc) == 0 & 00285 .AND.xl(1,ihc) == xl(2,ihc)) THEN 00286 ! hist is empty and hist range makes no sense 00287 ! - cause: hist with 'variable edges' was never filled 00288 ! - workaround: make lower and upper edge of hist differ in output 00289 WRITE(lun,202) nbin,xl(1,ihc)-0.001,xl(2,ihc)+0.001 00290 ELSE 00291 WRITE(lun,202) nbin,xl(1,ihc),xl(2,ihc) 00292 END IF 00293 WRITE(lun,203) (jnhist(j,ihc),j=1,3) 00294 WRITE(lun,204) 'bincontent' 00295 IF(khist(ihc) == 1.OR.khist(ihc) == 2) THEN 00296 CALL kprint(lun,inhist(1,ihc),nbin) 00297 ELSE 00298 WRITE(lun,219) (fnhist(i,ihc),i=1,nbin) 00299 END IF 00300 00301 IF(khist(ihc) == 1) THEN 00302 WRITE(lun,205) xl(4,ihc),xl(5,ihc) 00303 ELSE IF(khist(ihc) == 2) THEN 00304 WRITE(lun,205) FLOAT(jnhist(4,ihc)),FLOAT(jnhist(5,ihc)) 00305 END IF 00306 IF(khist(ihc) == 1) THEN 00307 IF(jnhist(2,ihc) > 1) THEN 00308 xmean=REAL(xl(6,ihc)+dl(1,ihc)/FLOAT(jnhist(2,ihc))) 00309 xcent=0.5*(xl(1,ihc)+xl(2,ihc)) 00310 xsigm=REAL((dl(2,ihc)-dl(1,ihc)**2/FLOAT(jnhist(2,ihc)))) 00311 xsigm=SQRT(xsigm/FLOAT(jnhist(2,ihc)-1)) 00312 WRITE(lun,206) xmean,xsigm 00313 END IF 00314 END IF 00315 WRITE(lun,204) 'end of histogram' 00316 END IF 00317 END DO 00318 00319 201 FORMAT('Histogram ',i4,10X,'version ',i4,10X,'type',i2) 00320 202 FORMAT(10X,' bins, limits ',i4,2G15.5) 00321 203 FORMAT(10X,'out-low inside out-high ',3I10) 00322 204 FORMAT(a) 00323 205 FORMAT('minmax',2E15.7) 00324 206 FORMAT('meansigma',2E15.7) 00325 00326 219 FORMAT(4E15.7) 00327 END SUBROUTINE hmpdef 00328 00329 SUBROUTINE hmpmak(inhist,fnhist,jnhist,xl,dl) ! hist scale from data 00330 IMPLICIT NONE 00331 INTEGER:: i 00332 INTEGER:: j 00333 INTEGER:: k 00334 INTEGER:: nn 00335 REAL:: x 00336 REAL:: xa 00337 REAL:: xb 00338 00339 INTEGER, INTENT(OUT) :: inhist(120) 00340 REAL, INTENT(IN) :: fnhist(120) 00341 INTEGER, INTENT(IN OUT) :: jnhist(5) 00342 REAL, INTENT(IN OUT) :: xl(6) 00343 DOUBLE PRECISION, INTENT(OUT) :: dl(2) 00344 REAL:: cphist(120) 00345 00346 00347 00348 SAVE 00349 ! ... 00350 nn=jnhist(4) 00351 ! WRITE(*,*) 'HMPMAK: NN,JNHIST(5)',NN,JNHIST(5) 00352 IF(nn == 0.OR.jnhist(5) /= 0) RETURN 00353 jnhist(5)=1 00354 DO i=1,nn 00355 ! WRITE(*,*) 'copy ',I,FNHIST(I) 00356 cphist(i)=fnhist(i) 00357 END DO 00358 CALL heapf(cphist,nn) 00359 IF(xl(3) == 0.0) THEN 00360 CALL bintab(cphist,nn,xa,xb) 00361 xl(1)=xa 00362 xl(2)=xb 00363 xl(3)=0.0 00364 IF(xa /= xb) xl(3)=120.0/(xb-xa) 00365 xl(6)=0.5*(xa+xb) ! center 00366 END IF 00367 xl(4)=cphist( 1) 00368 xl(5)=cphist(nn) 00369 ! WRITE(*,*) 'XL ',XL 00370 DO i=1,nn 00371 inhist(i)=0 00372 END DO 00373 DO k=1,nn 00374 x=cphist(k) 00375 i=INT(1.0+xl(3)*(x-xl(1))) ! X - Xmin 00376 ! WRITE(*,*) 'K,I,X ',K,I,X 00377 j=2 00378 IF(i < 1) j=1 00379 IF(i > 120) j=3 00380 jnhist(j)=jnhist(j)+1 00381 IF(j == 2) THEN 00382 inhist(i)=inhist(i)+1 00383 dl(1)=dl(1)+ x-xl(6) 00384 dl(2)=dl(2)+(x-xl(6))**2 00385 END IF 00386 END DO 00387 END SUBROUTINE hmpmak 00388 00389 00390 00391 00392 SUBROUTINE bintab(tab,n,xa,xb) ! hist scale from data 00393 IMPLICIT NONE 00394 REAL:: dd 00395 REAL:: dx 00396 INTEGER:: i 00397 INTEGER:: iexp 00398 INTEGER:: ii 00399 INTEGER:: j 00400 INTEGER:: m1 00401 INTEGER:: m2 00402 INTEGER:: n1 00403 INTEGER:: n2 00404 REAL:: rat 00405 REAL:: x1 00406 REAL:: x2 00407 REAL:: xx 00408 ! Bin limits XA and XB from TAB(N) 00409 00410 REAL, INTENT(IN) :: tab(n) 00411 INTEGER, INTENT(IN) :: n 00412 REAL, INTENT(OUT) :: xa 00413 REAL, INTENT(OUT) :: xb 00414 00415 REAL:: bin(10) 00416 DATA bin/1.0,1.5,2.0,3.0,4.0,5.0,8.0,10.0,15.0,20.0/ 00417 SAVE 00418 ! ... 00419 00420 CALL heapf(tab,n) ! reduced statistic 00421 ! WRITE(*,*) ' ' 00422 ! WRITE(*,*) 'Sorted ',(TAB(I),I=1,N) 00423 IF(n < 100) THEN 00424 x1=tab(1) 00425 x2=tab(n) 00426 ! WRITE(*,*) 'reduced statistic X1 X2 ',X1,X2 00427 ELSE ! large statistic 00428 m1=INT(1.0+0.05*FLOAT(n)) 00429 m2=INT(1.0+0.16*FLOAT(n)) 00430 x1=tab(m1)-4.0*(tab(m2)-tab(m1)) 00431 IF(x1 < 0.0.AND.tab(1) >= 0.0) x1=tab(1) 00432 x2=tab(n+1-m1)+4.0*(tab(n+1-m1)-tab(n+1-m2)) 00433 IF(x2 > 0.0.AND.tab(n) <= 0.0) x2=tab(n) 00434 ! WRITE(*,*) 'large statistic ',X1,X2 00435 ! WRITE(*,*) 'min und max ',TAB(1),TAB(N) 00436 IF(x1*tab(1) <= 0.0) x1=0.0 00437 IF(x2*tab(n) <= 0.0) x2=0.0 00438 ! WRITE(*,*) 'large statistic zero ',X1,X2 00439 IF(x1*x2 < 0.0.AND.MIN(-x1,x2) > 0.6*MAX(-x1,x2)) THEN 00440 xx=MAX(-x1,x2) ! symmetry 00441 x1=-xx 00442 x2=+xx 00443 ELSE IF(x1*x2 > 0.0.AND. & ! include zero ? 00444 ABS(MIN(x1,x2)) < 0.4*ABS(MAX(x1,x2))) THEN 00445 IF(x1 < 0.0) THEN 00446 x2=0.0 00447 ELSE 00448 x1=0.0 00449 END IF 00450 END IF 00451 ! WRITE(*,*) 'large statistic ',X1,X2 00452 END IF 00453 IF(x1 == x2) THEN 00454 x1=x1-1.0 00455 x2=x2+1.0 00456 END IF 00457 dx=x2-x1 00458 ! WRITE(*,*) 'X1,X2,DX ',X1,X2,DX 00459 rat=0.0 00460 ii=1 00461 DO j=1,11 00462 i=j 00463 IF(j == 11) i=ii 00464 iexp=INT(101.0+LOG10(dx)-LOG10(6.0*bin(i))) 00465 iexp=iexp-100 00466 dd=bin(i)*10.0**iexp 00467 00468 n1=INT(ABS(x1)/dd) 00469 IF(x1 < 0.0) n1=-n1 00470 IF(FLOAT(n1)*dd > x1) n1=n1-1 00471 ! WRITE(*,*) 'Bin ',I,N1,N1*DD,X1 00472 00473 n2=INT(ABS(x2)/dd) 00474 IF(x2 < 0.0) n2=-n2 00475 IF(FLOAT(n2)*dd < x2) n2=n2+1 00476 ! WRITE(*,*) 'Bin ',I,N2,N2*DD,X2 00477 10 IF(n2-n1 < 6) THEN 00478 IF(n1 /= 0) n1=n1-1 00479 IF(n2-n1 < 6.AND.n2 /= 0) n2=n2+1 00480 GO TO 10 00481 END IF 00482 ! WRITE(*,*) 'corrected N1 N2 ',N1,N2 00483 xa=SIGN(FLOAT(n1)*dd,x1) 00484 xb=SIGN(FLOAT(n2)*dd,x2) 00485 ! WRITE(*,*) J,' resulting limits XA XB ',XA,XB 00486 IF((x2-x1)/(xb-xa) > rat) THEN 00487 ii=i 00488 rat=(x2-x1)/(xb-xa) 00489 END IF 00490 END DO 00491 ! WRITE(*,*) J,' resulting limits XA XB ',XA,XB 00492 END SUBROUTINE bintab 00493 00494 SUBROUTINE kprint(lun,list,n) ! print integer array 00495 IMPLICIT NONE 00496 INTEGER:: i 00497 INTEGER:: ia 00498 INTEGER:: ib 00499 INTEGER:: k 00500 INTEGER:: ln 00501 INTEGER:: lp 00502 INTEGER:: np 00503 ! print integer array LIST(N) 00504 00505 INTEGER, INTENT(IN OUT) :: lun 00506 INTEGER, INTENT(IN) :: list(n) 00507 INTEGER, INTENT(IN) :: n 00508 INTEGER:: li(7) 00509 DATA li/2,3,4,6,8,9,12/ ! number of characters 00510 SAVE 00511 ! ... 00512 ib=0 00513 10 ia=ib+1 00514 IF(ia > n) RETURN 00515 DO k=1,7 00516 np=72/li(k) 00517 ib=MIN(ia-1+np,n) 00518 IF(k <= 6) THEN 00519 lp=10**(li(k)-1)-1 ! maximum positive 00520 ln=-lp/10 ! minimum negative 00521 DO i=ia,ib 00522 IF(list(i) > lp.OR.list(i) < ln) GO TO 20 00523 END DO 00524 END IF 00525 IF(k == 1) THEN 00526 WRITE(lun,101) (list(i),i=ia,ib) 00527 ELSE IF(k == 2) THEN 00528 WRITE(lun,102) (list(i),i=ia,ib) 00529 ELSE IF(k == 3) THEN 00530 WRITE(lun,103) (list(i),i=ia,ib) 00531 ELSE IF(k == 4) THEN 00532 WRITE(lun,104) (list(i),i=ia,ib) 00533 ELSE IF(k == 5) THEN 00534 WRITE(lun,105) (list(i),i=ia,ib) 00535 ELSE IF(k == 6) THEN 00536 WRITE(lun,106) (list(i),i=ia,ib) 00537 ELSE IF(k == 7) THEN 00538 WRITE(lun,107) (list(i),i=ia,ib) 00539 END IF 00540 GO TO 10 00541 20 CONTINUE 00542 END DO 00543 101 FORMAT(36I2) 00544 102 FORMAT(24I3) 00545 103 FORMAT(18I4) 00546 104 FORMAT(12I6) 00547 105 FORMAT( 9I8) 00548 106 FORMAT( 8I9) 00549 107 FORMAT( 6I12) 00550 END SUBROUTINE kprint 00551 00552 ! ***************************** XY data **************************** 00553 00554 SUBROUTINE gmpdef(ig,ityp,text) ! book, reset XY storage 00555 IMPLICIT NONE 00556 REAL:: dx 00557 REAL:: dy 00558 INTEGER:: i 00559 INTEGER:: iga 00560 INTEGER:: igb 00561 INTEGER:: igc 00562 INTEGER:: j 00563 INTEGER:: lun 00564 INTEGER:: lunw 00565 INTEGER:: n 00566 INTEGER:: na 00567 REAL:: wght 00568 REAL:: x 00569 REAL:: y 00570 REAL:: y1 00571 ! ITYP = 1 X,Y as dots 00572 ! = 2 X,Y as line 00573 ! = 3 X,Y as line and dots 00574 ! = 4 X,Y, DX,DY symbols 00575 00576 INTEGER, INTENT(IN) :: ig 00577 INTEGER, INTENT(IN) :: ityp 00578 CHARACTER (LEN=*), INTENT(IN) :: text 00579 INTEGER, PARAMETER :: narr=1000 00580 REAL:: array(2,narr) 00581 REAL::array4(4,narr/2) 00582 REAL::array1(narr+narr) 00583 REAL::four(4) 00584 EQUIVALENCE (array(1,1),array4(1,1),array1(1)) 00585 INTEGER, PARAMETER :: numgxy=10 00586 INTEGER, PARAMETER :: nlimit=500 00587 INTEGER:: nstr(numgxy) 00588 INTEGER::igtp(numgxy) 00589 INTEGER::lvers(numgxy) 00590 INTEGER::nst(3,numgxy) 00591 REAL:: xyplws(10,numgxy) 00592 INTEGER:: jflc(5,numgxy) 00593 INTEGER::kflc(5,numgxy) 00594 ! JFLC(1,.) = first used index 00595 ! JFLC(2,.) = last used index 00596 ! JFLC(3,.) = counter of used places 00597 ! JFLC(4,.) = counter of ignored 00598 ! JFLC(5,.) = limit for JFLC(3) 00599 CHARACTER (LEN=60):: gtext(numgxy) 00600 00601 LOGICAL:: start 00602 SAVE 00603 DATA start/.TRUE./,lun/7/ 00604 DATA nstr/numgxy*0/ ! by GF 00605 ! ... 00606 IF(start) THEN 00607 start=.FALSE. 00608 CALL stmars ! initialize storage 00609 DO i=1,numgxy 00610 DO j=1,5 00611 jflc(j,i)=0 00612 kflc(j,i)=0 00613 END DO 00614 END DO 00615 END IF 00616 00617 IF(ig < 1.OR.ig > numgxy) RETURN 00618 IF(ityp < 1.OR.ityp > 5) RETURN 00619 IF(nstr(ig) == 0) THEN 00620 lvers(ig)=0 00621 ELSE 00622 lvers(ig)=lvers(ig)+1 00623 END IF 00624 nstr(ig)=1 ! by GF 00625 ! remove stored elements 00626 IF(jflc(1,ig) /= 0) CALL stmarm(jflc(1,ig)) 00627 IF(kflc(1,ig) /= 0) CALL stmarm(kflc(1,ig)) 00628 igtp(ig)=ityp 00629 gtext(ig)=text 00630 DO j=1,5 00631 jflc(j,ig)=0 00632 END DO 00633 jflc(5,ig)=nlimit 00634 IF(ityp == 5) THEN 00635 DO j=1,5 00636 kflc(j,ig)=0 00637 END DO 00638 jflc(5,ig)=128 ! maximum of 128 values 00639 kflc(5,ig)=narr 00640 nst(1,ig)=0 00641 nst(2,ig)=0 00642 nst(3,ig)=1 00643 DO j=1,10 00644 xyplws(j,ig)=0.0 00645 END DO 00646 END IF 00647 RETURN 00648 00649 ENTRY gmpxy(ig,x,y) ! add (X,Y) pair 00650 IF(ig < 1.OR.ig > numgxy) RETURN ! check argument IG 00651 IF(igtp(ig) < 1.OR.igtp(ig) > 3) RETURN ! check type 00652 CALL stmapr(jflc(1,ig),x,y) 00653 RETURN 00654 00655 ENTRY gmpxyd(ig,x,y,dx,dy) ! add (X,Y,DX,DY) 00656 IF(ig < 1.OR.ig > numgxy) RETURN ! check argument IG 00657 IF(igtp(ig) /= 4) RETURN 00658 four(1)=x 00659 four(2)=y 00660 four(3)=dx 00661 four(4)=dy 00662 CALL stmadp(jflc(1,ig),four) 00663 RETURN 00664 00665 ENTRY gmpms(ig,x,y) ! mean sigma(X) from Y 00666 ! mean sigma from Y, as a function of X 00667 ! WRITE(*,*) 'GMPMS ',IG,X,Y 00668 00669 IF(ig < 1.OR.ig > numgxy) RETURN ! check argument IG 00670 IF(igtp(ig) /= 5) RETURN 00671 00672 xyplws(10,ig)=x ! last X coordinate 00673 IF(nst(1,ig) == 0) THEN 00674 y1=y 00675 nst(1,ig)=1 00676 IF(kflc(3,ig) == 0) xyplws(9,ig)=x ! start coordinate 00677 ELSE 00678 nst(1,ig)=0 00679 CALL stmapr(kflc(1,ig),y1,y) ! store pair 00680 IF(kflc(3,ig) >= kflc(5,ig)) THEN 00681 CALL stmacp(kflc(1,ig),array,n) ! get data 00682 CALL stmarm(kflc(1,ig)) ! remove data 00683 n=n+n 00684 CALL rmesig(array,n,xyplws(2,ig),xyplws(4,ig)) 00685 nst(2,ig)=nst(2,ig)+1 00686 IF(nst(2,ig) == 1) xyplws(7,ig)=xyplws(9,ig) 00687 xyplws(8,ig)=x ! end coordinate 00688 xyplws(5,ig)=xyplws(5,ig)+xyplws(2,ig) 00689 xyplws(6,ig)=xyplws(6,ig)+xyplws(4,ig) 00690 IF(nst(2,ig) == nst(3,ig)) THEN 00691 xyplws(1,ig)=0.5*(xyplws(7,ig)+xyplws(8,ig)) 00692 xyplws(2,ig)=xyplws(5,ig)/FLOAT(nst(3,ig)) 00693 xyplws(3,ig)=0.5*(xyplws(8,ig)-xyplws(7,ig)) 00694 xyplws(4,ig)=xyplws(6,ig)/FLOAT(nst(3,ig)) 00695 xyplws(5,ig)=0.0 00696 xyplws(6,ig)=0.0 00697 nst(2,ig)=0 00698 CALL stmadp(jflc(1,ig),xyplws(1,ig)) 00699 IF(jflc(3,ig) >= jflc(5,ig)) THEN 00700 CALL stmacp(jflc(1,ig),array4,n) ! get data 00701 n=n/2 00702 CALL stmarm(jflc(1,ig)) ! remove data 00703 DO i=1,n,2 ! average 00704 xyplws(7,ig)=array4(1,i )-array4(3, i) 00705 xyplws(8,ig)=array4(1,i+1)+array4(3,i+1) 00706 xyplws(1,ig)=0.5*(xyplws(7,ig)+xyplws(8,ig)) 00707 xyplws(2,ig)=0.5*(array4(2,i)+array4(2,i+1)) 00708 xyplws(3,ig)=0.5*(xyplws(8,ig)-xyplws(7,ig)) 00709 xyplws(4,ig)=0.5*(array4(4,i)+array4(4,i+1)) 00710 CALL stmadp(jflc(1,ig),xyplws(1,ig)) 00711 END DO 00712 nst(3,ig)=nst(3,ig)+nst(3,ig) 00713 END IF 00714 END IF 00715 END IF 00716 END IF 00717 RETURN 00718 00719 ENTRY gmprnt(ig) ! print XY data 00720 IF(ig == 0) THEN 00721 iga=1 00722 igb=numgxy 00723 ELSE 00724 IF(ig <= 0.OR.ig > numgxy) RETURN 00725 iga=ig 00726 igb=ig 00727 END IF 00728 DO igc=iga,igb 00729 00730 IF(igtp(igc) >= 1.AND.igtp(igc) <= 3) THEN 00731 WRITE(*,*) ' ' 00732 WRITE(*,*) 'Store ',igc,': ',gtext(igc) 00733 IF(jflc(4,igc) == 0) THEN 00734 WRITE(*,*) ' stored n-tuples: ',jflc(3,igc) 00735 ELSE 00736 WRITE(*,*) ' stored n-tuples, not-stored n-tuples: ', & 00737 jflc(3,igc),', ',jflc(4,igc) 00738 END IF 00739 00740 CALL stmacp(jflc(1,igc),array,na) ! get all data 00741 00742 DO n=1,na 00743 WRITE(*,102) n, array(1,n),array(2,n) 00744 END DO 00745 00746 ELSE IF(igtp(igc) == 4) THEN 00747 00748 WRITE(*,*) ' ' 00749 WRITE(*,*) 'Store ',igc,': ',gtext(igc) 00750 IF(jflc(4,igc) == 0) THEN 00751 WRITE(*,*) ' stored n-tuples: ',jflc(3,igc) 00752 ELSE 00753 WRITE(*,*) ' stored n-tuples, not-stored n-tuples: ', & 00754 jflc(3,igc),', ',jflc(4,igc) 00755 END IF 00756 00757 CALL stmacp(jflc(1,igc),array,na) ! get all data 00758 na=na/2 00759 00760 DO n=1,na 00761 WRITE(*,102) n,(array4(j,n),j=1,4) 00762 END DO 00763 00764 ELSE IF(igtp(igc) == 5) THEN 00765 00766 CALL stmacp(kflc(1,igc),array,n) ! get data 00767 CALL stmarm(kflc(1,igc)) ! remove data 00768 n=n+n 00769 IF(nst(1,igc) == 1) THEN 00770 n=n+1 00771 array1(n)=y1 00772 nst(1,igc)=0 ! reset 00773 END IF 00774 IF(n /= 0) THEN 00775 xyplws(7,igc)=xyplws( 9,igc) 00776 xyplws(8,igc)=xyplws(10,igc) 00777 CALL rmesig(array1,n,xyplws(2,igc),xyplws(4,igc)) 00778 wght=FLOAT(n)/FLOAT(nst(3,igc)*kflc(5,igc)) 00779 xyplws(5,igc)=xyplws(5,igc)+xyplws(2,igc)*wght 00780 xyplws(6,igc)=xyplws(6,igc)+xyplws(4,igc)*wght 00781 xyplws(2,igc)=xyplws(5,igc)/(FLOAT(nst(2,igc))+wght) 00782 xyplws(4,igc)=xyplws(6,igc)/(FLOAT(nst(2,igc))+wght) 00783 xyplws(1,igc)=0.5*(xyplws(7,igc)+xyplws(8,igc)) 00784 xyplws(3,igc)=0.5*(xyplws(8,igc)-xyplws(7,igc)) 00785 CALL stmadp(jflc(1,igc),xyplws(1,igc)) 00786 END IF 00787 00788 WRITE(*,*) ' ' 00789 WRITE(*,*) 'Store ',igc,': ',gtext(igc) 00790 IF(jflc(4,igc) == 0) THEN 00791 WRITE(*,*) ' stored n-tuples: ',jflc(3,igc) 00792 ELSE 00793 WRITE(*,*) ' stored n-tuples, not-stored n-tuples: ', & 00794 jflc(3,igc),', ',jflc(4,igc) 00795 END IF 00796 00797 CALL stmacp(jflc(1,igc),array,na) ! get all data 00798 na=na/2 00799 DO n=1,na 00800 WRITE(*,102) n,(array4(j,n),j=1,4) 00801 END DO 00802 END IF 00803 END DO 00804 RETURN 00805 00806 ENTRY gmplun(lunw) ! unit for output 00807 lun=lunw 00808 RETURN 00809 00810 ENTRY gmpwrt(ig) ! write XY text file 00811 IF(lun <= 0) RETURN 00812 IF(ig == 0) THEN 00813 iga=1 00814 igb=numgxy 00815 ELSE 00816 IF(ig <= 0.OR.ig > numgxy) RETURN 00817 iga=ig 00818 igb=ig 00819 END IF 00820 DO igc=iga,igb 00821 IF(igtp(igc) == 5) THEN 00822 00823 CALL stmacp(kflc(1,igc),array,n) ! get data 00824 CALL stmarm(kflc(1,igc)) ! remove data 00825 n=n+n 00826 IF(nst(1,igc) == 1) THEN 00827 n=n+1 00828 array1(n)=y1 00829 nst(1,igc)=0 ! reset 00830 END IF 00831 IF(n /= 0) THEN 00832 xyplws(7,igc)=xyplws( 9,igc) 00833 xyplws(8,igc)=xyplws(10,igc) 00834 CALL rmesig(array1,n,xyplws(2,igc),xyplws(4,igc)) 00835 wght=FLOAT(n)/FLOAT(nst(3,igc)*kflc(5,igc)) 00836 xyplws(5,igc)=xyplws(5,igc)+xyplws(2,igc)*wght 00837 xyplws(6,igc)=xyplws(6,igc)+xyplws(4,igc)*wght 00838 xyplws(2,igc)=xyplws(5,igc)/(FLOAT(nst(2,igc))+wght) 00839 xyplws(4,igc)=xyplws(6,igc)/(FLOAT(nst(2,igc))+wght) 00840 xyplws(1,igc)=0.5*(xyplws(7,igc)+xyplws(8,igc)) 00841 xyplws(3,igc)=0.5*(xyplws(8,igc)-xyplws(7,igc)) 00842 CALL stmadp(jflc(1,igc),xyplws(1,igc)) 00843 END IF 00844 00845 END IF 00846 IF(jflc(3,igc)+jflc(4,igc) /= 0) THEN 00847 WRITE(lun,204) ' ' 00848 WRITE(lun,201) igc,lvers(igc),igtp(igc) 00849 WRITE(lun,204) gtext(igc) 00850 WRITE(lun,203) jflc(3,igc)+jflc(4,igc) 00851 CALL stmacp(jflc(1,igc),array,na) ! get all data 00852 IF(igtp(igc) >= 1.AND.igtp(igc) <= 3) THEN 00853 WRITE(lun,204) 'x-y' 00854 DO n=1,na 00855 WRITE(lun,205) array(1,n),array(2,n) 00856 END DO 00857 ELSE IF(igtp(igc) == 4.OR.igtp(igc) == 5) THEN 00858 WRITE(lun,204) 'x-y-dx-dy' 00859 na=na/2 00860 DO n=1,na 00861 WRITE(lun,205) (array4(j,n),j=1,4) 00862 END DO 00863 END IF 00864 WRITE(lun,204) 'end of xy-data' 00865 END IF 00866 END DO 00867 102 FORMAT(i12,4G15.7) 00868 ! 103 FORMAT(' Index ___X___ ___Y___ '/ 00869 ! + ' ----- -------------- --------------') 00870 ! 104 FORMAT(' Index ___X___ ___Y___ ', 00871 ! + ' ___DX__ ___DY__ '/ 00872 ! + ' ----- -------------- --------------', 00873 ! + ' -------------- --------------') 00874 201 FORMAT('XY-Data ',i4,10X,'version ',i4,10X,'type',i2) 00875 203 FORMAT(10X,'stored not-stored ',2I10) 00876 204 FORMAT(a) 00877 205 FORMAT(3X,4G15.7) 00878 END SUBROUTINE gmpdef 00879 00880 00881 SUBROUTINE stmars ! init/reset storage 00882 IMPLICIT NONE 00883 INTEGER:: i 00884 INTEGER:: ifre 00885 INTEGER:: ifrea 00886 INTEGER:: ifreb 00887 INTEGER:: ind 00888 INTEGER:: j 00889 INTEGER:: n 00890 INTEGER:: ndim 00891 REAL:: x 00892 REAL:: y 00893 PARAMETER (ndim=5000) ! storage dimension, should be NUMGXY*NLIMIT 00894 REAL:: tk(2,ndim) ! pair storage for data pairs 00895 INTEGER:: next(ndim) ! pointer 00896 INTEGER:: iflc1 ! first and last index of free pairs 00897 INTEGER::iflc2 ! first and last index of free pairs 00898 SAVE 00899 00900 REAL:: four(4) ! double_pair, copy array 00901 REAL::array(2,*) ! double_pair, copy array 00902 INTEGER:: jflc(5) ! user array 00903 ! JFLC(1) = first used index 00904 ! JFLC(2) = last used index 00905 ! JFLC(3) = counter of used places 00906 ! JFLC(4) = counter of ignored 00907 ! JFLC(5) = limit for JFLC(3) 00908 ! ... 00909 DO i=1,ndim 00910 next(i)=i+1 ! pointer to next free location 00911 tk(1,i)=0.0 ! reset 00912 tk(2,i)=0.0 00913 END DO 00914 next(ndim)=0 ! ... and end pointer 00915 iflc1=1 ! index first free pair 00916 iflc2=ndim ! index last free pair 00917 RETURN 00918 00919 ENTRY stmapr(jflc,x,y) ! store pair (X,Y) 00920 ifre=iflc1 ! index of free place 00921 IF(ifre == 0.OR.jflc(3) >= jflc(5)) THEN ! overflow 00922 jflc(4)=jflc(4)+1 00923 ELSE 00924 iflc1=next(ifre) ! pointer to new free location 00925 IF(jflc(1) == 0) THEN ! first item 00926 jflc(1)=ifre 00927 ELSE 00928 next(jflc(2))=ifre 00929 END IF 00930 next(ifre)=0 00931 jflc(2)=ifre ! last index 00932 jflc(3)=jflc(3)+1 ! counter 00933 tk(1,ifre)=x 00934 tk(2,ifre)=y 00935 END IF 00936 RETURN 00937 00938 ENTRY stmadp(jflc,four) ! store double pair 00939 ifrea=iflc1 ! index of 1. free place 00940 IF(ifrea == 0) THEN ! overflow 00941 jflc(4)=jflc(4)+1 00942 ELSE 00943 ifreb=next(iflc1) ! index of 2. free place 00944 IF(ifreb == 0.OR.jflc(3) >= 2*jflc(5)) THEN ! overflow 00945 jflc(4)=jflc(4)+1 00946 ELSE 00947 iflc1=next(ifreb) ! pointer to new free location 00948 IF(jflc(1) == 0) THEN ! first item 00949 jflc(1)=ifrea 00950 ELSE 00951 next(jflc(2))=ifrea 00952 END IF 00953 next(ifreb)=0 00954 jflc(2)=ifreb ! last index 00955 jflc(3)=jflc(3)+1 ! counter 00956 tk(1,ifrea)=four(1) 00957 tk(2,ifrea)=four(2) 00958 tk(1,ifreb)=four(3) 00959 tk(2,ifreb)=four(4) 00960 END IF 00961 END IF 00962 RETURN 00963 00964 ENTRY stmacp(jflc,array,n) ! copy (cp) all pairs to array 00965 n=0 00966 ind=jflc(1) 00967 10 IF(ind == 0) RETURN 00968 n=n+1 00969 array(1,n)=tk(1,ind) 00970 array(2,n)=tk(2,ind) 00971 ind=next(ind) 00972 GO TO 10 00973 00974 ENTRY stmarm(jflc) ! remove (rm) stored paiirs 00975 next(iflc2)=jflc(1) ! connect to free space 00976 iflc2=jflc(2) ! new last free index 00977 DO j=1,4 00978 jflc(j)=0 00979 END DO 00980 END SUBROUTINE stmars ! init/ 00981 00982 SUBROUTINE rmesig(x,n,xloc,xsca) ! robust mean and sigma 00983 IMPLICIT NONE 00984 INTEGER:: i 00985 ! robust determination of location and scale parameter, 00986 ! for Gaussian data: location=mean and scale=standard deviation 00987 ! XLOC = median of X_i (N values in array X(N)) 00988 ! XCSA = median of | X_i - XLOC |, times 1.4826 00989 00990 REAL, INTENT(IN OUT) :: x(n) ! input array, modified 00991 INTEGER, INTENT(IN) :: n 00992 REAL, INTENT(OUT) :: xloc 00993 REAL, INTENT(OUT) :: xsca 00994 SAVE 00995 ! ... 00996 xloc=0.0 00997 xsca=0.0 00998 IF(n <= 0) RETURN 00999 CALL heapf(x,n) ! sort 01000 xloc=0.5*(x((n+1)/2)+x((n+2)/2)) ! location 01001 DO i=1,n 01002 x(i)=ABS(x(i)-xloc) 01003 END DO 01004 CALL heapf(x,n) ! sort 01005 xsca=1.4826*0.5*(x((n+1)/2)+x((n+2)/2)) ! dispersion 01006 END SUBROUTINE rmesig 01007 01008 01009