program raxer4 structure /header/ union map byte bline(4096) end map map INTEGER*2 iline(4096) end map map character*10 device character*10 version character*20 crystal character*12 cry_sys real*4 cell(6) character*12 space real*4 mosaic character*80 memo integer*4 res1(21) character*12 date character*20 operator character*4 target real*4 wave character*20 monochro !mon name real*4 mono_2 !monoch 2theta dgr character*20 collimator character*4 filter real*4 camera_len !mm real*4 kvma(2) !X-ray power integer*4 res2(39) character*4 axis(2) real*4 phi0 !phi0 real*4 phist !phistart real*4 phiend !phiend integer*4 osc real*4 ex_time real*4 xray(2) !x,z - xray beam pos. num of pixels real*4 circle(3) !omega, chi 2theta dgr integer*4 res3(52) integer*4 pix_num(2) !x z number of pixels real*4 pix_size(2) !x z pix size (mm) integer*4 record(2) !rec length and number integer*4 read_start integer*4 ip_num real*4 ratio !hi/lo ratio real*4 fading(2) integer*4 res4(53) end map end union end structure record /header/ header DIMENSION NXYZ(3),MXYZ(3),NXYZST(3) CHARACTER DAT*12,TIM*12 CHARACTER*80 TITLE CHARACTER*50 INFILE,OUTFILE CHARACTER*50 FILENAME CHARACTER*40 FNAME,ASTRING,outfilmx CHARACTER*1 OUTSTRING(3800),HSTRING(16),BOXFLAG LOGICAL EFLG integer*2 h,k,l DATA HSTRING/'0','1','2','3','4','5','6','7','8','9','A','B','C', - 'D','E','F'/ DATA NXYZST/3*0/, CNV/57.29578/ R64K=256*256 R32K=128*256 WRITE(6,1000) 1000 FORMAT(//' RAXIS-2 TO POSTSCRIPT IMAGE FILE CONVERSION . PROGRAM Version 930824'/' To print image: PLW "OUTPUT".ps') 5001 WRITE(6,1100) 1100 FORMAT(/'$Input filename (CR to quit): ') READ(5,1200) INFILE 1200 FORMAT(A) IF (INFILE(:5).EQ.' ') STOP INQUIRE(FILE=INFILE, NAME=FILENAME,EXIST=EFLG) IF (EFLG) GOTO 5 write(6,11001) 11001 format(/' FILE DOES NOT EXIST ') 5 OPEN (UNIT=2,FILE=INFILE,STATUS='OLD') TYPE *,'Enter source for coordinates of boxes around spots:' TYPE *,'CR-no boxes. D-denzo outfile.' READ(5,'(A1)')BOXFLAG IF (BOXFLAG.EQ.' ') GOTO 335 IF (BOXFLAG.EQ.'d') BOXFLAG='D' 330 TYPE *,'ENTER FILENAME FOR BOX COORD FILE:' 340 FORMAT (A40) read(5,'(a)') fname 335 WRITE(6,1600) 1600 FORMAT('$Output filename: ') READ(5,1200) outfilmx !!!VS07/07 file name instead Marxer.ps OPEN (UNIT=3,FILE=outfilmx,STATUS='NEW',recl=1900, & CARRIAGECONTROL='LIST') 1400 write(6,*)'Enter window (pixels; xmin,xmax,ymin,ymax;', . ' 0 0 0 0 for default):' read(5,*) i1,i2,j1,j2 WRITE(6,*)'Enter density limits (min,max) or 0,0 to autoscale' WRITE(6,*)'Density autoscaling requires two passes through the file.' READ(5,*)X0,XM WRITE(3,'(A)')'%!PS-Adobe-'//CHAR(4) write(3,'(A)')'/Times-Roman findfont 9 scalefont setfont' write(3,'(A)') & '/cshow {dup stringwidth pop 2 div neg 0 rmoveto show} def' CALL DATE(DAT) CALL TIME(TIM) write(3,'(A)') '50 772 moveto'// & ' (Image File: '//FILENAME//' Printed:'//DAT//TIM//') show' C read HEADER into bline, encode into titles: READ(2,155) (header.BLINE(ii),ii=1,2048) 155 FORMAT (4096A1) TYPE *,'TIME: ',header.DATE TYPE *,'DISTANCE: ',header.CAMERA_len TYPE *,'LAMBDA: ',header.wave TYPE *,'PHI_START: ',header.PHIST TYPE *,'PHI_END: ',header.PHIEND TYPE *,'pix_X: ',header.PIX_NUM(1) TYPE *,'Pix_Z: ',header. PIX_NUM(2) DMEAN=0 DMAX=-1E32 DMIN=1E32 NXYZ(1)=HEADER.PIX_NUM(1) NXYZ(2)=HEADER.PIX_NUM(2) NX=HEADER.PIX_NUM(1) NZ=HEADER.PIX_NUM(2) NXYZ(3)=1 ENCODE(80,6739,TITLE) HEADER.DATE 6739 FORMAT(' R-AXIS image of: ',A12) PIX=HEADER.PIX_size(1) 72 FORMAT(' ',A80) WRITE(6,72)TITLE write(3,'(A)') '50 752 moveto ('//title//') show' ENCODE(80,6745,TITLE) HEADER.EX_TIME 6745 FORMAT(' EXPOSURE TIME (MIN)',F7.2) WRITE(6,72)TITLE write(3,'(A)') '50 732 moveto ('//title//') show' ENCODE(80,6741,TITLE) HEADER.WAVE,HEADER.CAMERA_len, 1 HEADER.PHIST,HEADER.PHIEND 6741 FORMAT('LAMBDA: ',F11.4,' DISTANCE:',F9.2,' PHI:',2F9.2) WRITE (6,72)TITLE write(3,'(A)') '50 742 moveto ('//title//') show' c Save lambda, distance for calculating resolution: wl=HEADER.WAVE dist = HEADER.CAMERA_len IF (XM.GT.0) GOTO 87 TYPE *,'READING IMAGE. FIRST PASS: FINDING MIN, MAX DENSITY' DO 85 IZ = 1,NZ DO 85 IY = 1,NX READ(2,155,end=985) (HEADER.BLINE(II),II=1,3800) DO 80 IX=1,NX X=header.ILINE(IX) IF (X.LT.0)X=X+R64K DMEAN=DMEAN+X IF (X.GT.DMAX) DMAX=X 80 IF (X.LT.DMIN) DMIN=X 85 CONTINUE nyt=NX CLOSE(UNIT=2) c use only number of record read in computing average 870 TYPE *,'DMIN=',DMIN,' DMAX=',DMAX,' DMEAN=',DMEAN, 1 ' nz=',nz,' nyt=',nyt DMEAN=DMEAN/(NYt*NZ) ENCODE(80,6750,TITLE) DMIN,DMAX,DMEAN 6750 FORMAT('RAXER V930824: Min/Max/mean density = ',2f8.0,f8.2) write(3,'(A)') '50 712 moveto ('//title//') show' OPEN (UNIT=2,FILE=INFILE,STATUS='OLD') C SKIP OVER HEADER FOR NOW: READ(2,155) (header.BLINE(II),II=1,2048) X0=DMEAN/2 XM=DMEAN*3 87 SCALE=(XM-X0)/16 if (j2.eq.0) then I1=1 I2=1898 J1=1 J2=1898 else n=i1 if (n.eq.(2*int(n/2))) then i1=i1+1 endif n=i2 if (n.ne.(2*int(n/2))) then i2=i2-1 endif n=j1 if (n.eq.(2*int(n/2))) then j1=j1+1 endif n=j2 if (n.ne.(2*int(n/2))) then j2=j2-1 endif endif if (I1.gt.1897) I1=1897 if (I2.gt.1898) I2=1898 if (J1.gt.1897) J1=1897 if (J2.gt.1898) J2=1898 in=1+i2-i1 jn=1+j2-j1 nmax=in if (jn.gt.nmax) nmax=jn ENCODE(80,6742,TITLE) X0,XM,I1,I2,J1,J2 6742 FORMAT('Density Limits:',2F8.1, . ' Selected Map Limits (X,Y)=',4I5) WRITE (6,72)TITLE write(3,'(A)') '50 762 moveto ('//title//') show' ENCODE(80,6743,TITLE) float(nmax)/20.,pix*float(nmax)/20. 6743 FORMAT('Scale: 1 cm=',F8.2,' pixels =',f8.3, . ' mm on imaging plate') WRITE (6,72)TITLE write(3,'(A)') '50 722 moveto ('//title//') show' C write(3,'(A)') '583 363.6 translate -90 rotate' C write(3,'(A)') '0 4 moveto (TOP (view from source)) cshow' C WRITE POSTSCRIPT PRELUDE: WRITE(3,'(A)')'gsave initgraphics %0.24 0.24 scale' WRITE(3,'(A)')' {1 exch sub} settransfer' n=jn J3=J2 c if (n.ne.(2*int(n/2))) then c n=jn+1 c J3=J2+1 c endif n=in i3=i2 c if (n.ne.(2*int(n/2))) then c n=in+1 c i3=i2+1 c endif WRITE(3,76) n 76 format (' /imline ',i4,' string def') write(3,77) jn,in,nmax,nmax 77 format (' /drawimage {',2i5,' 4 [',i5,' 0 0 ',i5,' 0 0 ',']') WRITE(3,'(A)')' {currentfile imline readhexstring pop} image} def' c scale for unit square = 20 cm square write(3,'(A)')'18 75 translate 566.9 dup scale' c write(3,'(A)')'105 314 translate 2340 2340 scale' WRITE(3,'(A)')'drawimage' c note i1,i2,in refer to dimension across records. c MRC considers this Y, mars X c j1,j2,jn refer to dimension along one record. MRC X, mars Y. DO 88 IY = 1,I1-1 88 READ(2,155,end=980) (header.BLINE(II),II=1,3800) DO 95 IY = I1,I3 READ(2,155,end=980) (header.BLINE(II),II=1,3800) DO 90 IX=J1,J3 X=header.ILINE(IX) IF (X.LT.0)X=X+XM JX=INT((X-X0)/SCALE) IF (JX.GT.15) JX=15 IF (JX.LT.0) JX=0 90 OUTSTRING(IX)=HSTRING(JX+1) 95 WRITE(3,156)(OUTSTRING(IX),IX=J1,J3) 156 FORMAT(125A1) goto 990 980 iyt=iy do 97 ix=j1,j3 97 outstring(ix)=hstring(1) do 98 iy=iyt,i3 98 WRITE(3,156)(OUTSTRING(IX),IX=J1,J3) 990 CLOSE(UNIT=2) C WRITE OUT REST OF POSTSCRIPT: WRITE(3,'(A)')'0 0 moveto 0 1 lineto 1 1 lineto 1 0 lineto 0 0 lineto' WRITE(3,'(A)')'0.000855 setlinewidth closepath clip' WRITE(3,'(A)')'{} settransfer stroke' z=1/float(nmax) c Scale for 1 unit = 1 pixel (before 1 unit = nmax pixels) WRITE(3,343) z,z 343 FORMAT(' 0 1 translate -90 rotate ',2F10.7 ' scale') c Should be -i1, -j1 translate, but denzo spots centered with 1 added. WRITE(3,344) 1-i1,1-j1 344 format(2i6,' translate ') WRITE(3,'(A)') '0 setlinewidth 0 setgray {} settransfer' IF (FNAME(:3).EQ.' ') GOTO 501 IF (BOXFLAG.EQ.' ') GOTO 501 IF (BOXFLAG.NE.'D') GOTO 501 c***************************** WRITE(3,'(A)') '/cir { r 0 360 arc stroke} def' WRITE(3,'(A)') '/sqr {moveto r dup neg dup rmoveto 2 mul dup 0 exch' WRITE(3,'(A)') ' rlineto dup 0 rlineto neg dup 0 exch rlineto' WRITE(3,'(A)') ' 0 rlineto closepath stroke} def' WRITE(3,'(A)') '/r 6 def' TYPE *,'READING DENZO OUTPUT FILE for spot locations' OPEN(UNIT=2,FILE=FNAME,STATUS='OLD') DO 345 I=1,5 345 READ (2,350)ASTRING TYPE*, ASTRING 350 FORMAT (A40) N1=0 N2=0 C 355 READ (2,360)X 360 FORMAT (F7.4) 370 READ(2,101,END=500)H,K,L,J,X1,X2,X,S,X,X,Y,PL,X3 N1=N1+1 101 FORMAT (I4,2I4,I2,F8.1,F8.1,F7.2,F6.1,F6.3,F7.1,F7.1,F6.3,F8.1) C IGNORE LOW-INTENSITY SPOTS C IF (X1.LT.100) GOTO 370 C Ignore offscale spots: c type *, ' **' c**** if ((x.lt.i1).or.(x.gt.i2)) goto 370 c**** if ((y.lt.j1).or.(y.gt.j2)) goto 370 IF (J.EQ.1) then C PUT CIRCLE AROUND PARTIAL WRITE(3,371) X,Y 371 FORMAT(2F7.1,' cir') else C PUT SQUARE AROUND FULLY RECORDED 380 WRITE(3,381) X,Y 381 FORMAT(2F7.1,' sqr') endif GOTO 370 500 CLOSE (UNIT=2) write(3,'(A)')' stroke' C501 write(6,*)'Enter beam center x,y, wl, and distance; or 0,0,0,0', C & ' to not draw circles:' C write(6,*)'(beam center and distance in mm, wl in A.U.)' C read(5,*)beamx,beamy,wl,dist c501 write(6,*)'Enter beam center in mm: x,y; or 0,0 to not draw ', c & 'circles:' c read(5,*)beamx,beamy c if (beamx.eq.0) goto 505 cc convert to pixels: c beamx=beamx/pix c beamy=beamy/pix c write(6,*)'Enter resolution in angstroms at which to draw circle:' c write(6,*)'Enter 0 after last circle' c501 write(6,*)'Enter beam center in mm: x,y; or 0,0 to not draw ', c & 'circles:' c read(5,*)beamx,beamy c if (beamx.eq.0) goto 505 c convert to pixels: c beamx=beamx/PIX c beamy=beamy/PIX 501 WRITE(6,*)' For now center will be assumed 900,900 pixels!' BEAMX=900 BEAMY=900 write(6,*)'Enter resolution in angstroms at which to draw circle:' write(6,*)'Enter 0 to draw no (more) circles' 502 read(5,*)resol if (resol.eq.0) goto 505 c calc radius in mm x=wl/(2*resol) theta=ASIN(x) radius=dist*TAN(2*theta) c convert to pixels: radius=radius/pix write(6,*)beamx,beamy,radius write(3,504) beamx,beamy,radius 504 format (' ',3f8.2,' 0 360 arc stroke') goto 502 505 WRITE(3,'(A)')' showpage grestore' CLOSE (UNIT=3) TYPE *,'NUMBER OF SPOTS REPORTED:',N1,' NUMBER USED:',N2 c!!! write(6,*)'PLW-ing marxer.ps' c!!! J=LIB$SPAWN('PLW MARXER.ps') !eliminated PLWing C J=LIB$SPAWN('DEL MARXER.TMP;*') c write(6,*)'purging marxer.ps' c J=LIB$SPAWN('PURGE MARXER.ps') GOTO 5001 985 CLOSE(UNIT=2) 860 nyt=ix-1 go to 870 end