C Adapted from mtzmnf.f C This program reads a basic MTZ file, calculates a couple of new C columns based on the input data, and writes out a new file. C It should be run as: C C mtz_rw HKLIN foo1.mtz HKLOUT foo2.mtz <<eof C LABI F=filelabel SIGF=filelabel C LABO I=filelabel SIGI=filelabel C END C eof PROGRAM MTZRW C .. Parameters .. INTEGER MAXPAR PARAMETER (MAXPAR=200) INTEGER MCOLS PARAMETER (MCOLS=200) INTEGER MAXSYM PARAMETER (MAXSYM=96) INTEGER MINDX,MTZPRT,MTZERR,LOOKUP(MCOLS),NLPRGI,JDO40, + LENSTR,NLPRGO,IAPPND,NCOLX REAL ADATA(MCOLS),BDATA(MCOLS),S LOGICAL MTZEOF,LOGMSS(MCOLS) CHARACTER CTPRGI(MCOLS)*1,CTPRGO(MCOLS)*1,LSPRGI(MCOLS)*30, + LSPRGO(MCOLS)*30 C Parser variables REAL FVALUE(MAXPAR) INTEGER IBEG(MAXPAR),IDEC(MAXPAR),IEND(MAXPAR),ITYP(MAXPAR), + NTOK LOGICAL LEND CHARACTER KEY*4,LINE*400,CVALUE(MAXPAR)*4 DATA NLPRGI/5/ DATA LSPRGI/'H','K','L','F','SIGF',195*' '/ DATA CTPRGI/'H','H','H','F','Q',195*' '/ DATA LOOKUP/-1,-1,-1,-1,-1,195*0/ DATA NLPRGO/2/ DATA LSPRGO/'I','SIGI',198*' '/ DATA CTPRGO/'J','Q',198*' '/ C CCP4 initialisations call ccpfyp C MTZ-specific initialisations call mtzini C Open input and output files on same index MINDX = 1 MTZprt = 1 MTZERR = 0 CALL LROPEN(MINDX,'HKLIN',MTZPRT,MTZERR) CALL LWOPEN(MINDX,'HKLOUT') C Parse keyworded input 10 CONTINUE LINE = ' ' KEY = ' ' NTOK = MAXPAR C C *********************************************************** CALL PARSER(KEY,LINE,IBEG,IEND,ITYP,FVALUE,CVALUE,IDEC,NTOK,LEND, + .TRUE.) C *********************************************************** C End of file? IF (LEND) GO TO 50 IF (KEY.EQ.'LABI') THEN C Parse LABIN line CALL LKYIN(MINDX,LSPRGI,NLPRGI,NTOK,LINE,IBEG,IEND) ELSEIF (KEY.EQ.'LABO') THEN C Parse LABOUT line CALL LKYOUT(MINDX,LSPRGO,NLPRGO,NTOK,LINE,IBEG,IEND) ELSE IF (KEY.EQ.'END') THEN GO TO 50 ELSE WRITE (6,FMT=6022) LINE(1:LENSTR(LINE)) 6022 FORMAT (' Error: Key_Word line NOT Understood:-',/' ',A) GO TO 10 END IF GO TO 10 C End of keyworded input 50 CONTINUE C Return no. of columns in input file CALL LRNCOL(MINDX,NCOLX) C Assign input labels CALL LRASSN(MINDX,LSPRGI,NLPRGI,LOOKUP,CTPRGI) C Assign output labels, appended to input labels IAPPND = 1 CALL LWASSN(MINDX,LSPRGO,NLPRGO,CTPRGO,IAPPND) C---- Loop for reflections----------- C 100 CONTINUE C Read reflection data in file order CALL LRREFL(MINDX,S,ADATA,MTZEOF) IF (MTZEOF) GO TO 200 C Check for Missing Number Flags CALL LRREFM(MINDX,LOGMSS) C default is to leave columns unchanged DO 40 JDO40 = 1,MCOLS BDATA(JDO40) = ADATA(JDO40) 40 CONTINUE C If either F or SIGF columns missing, mark new columns as missing IF (LOGMSS(LOOKUP(4)) .OR. LOGMSS(LOOKUP(5))) THEN CALL EQUAL_MAGIC(MINDX,BDATA(NCOLX+1),2) C Else, write out new columns ELSE BDATA(NCOLX+1) = ADATA(LOOKUP(4))**2 BDATA(NCOLX+2) = (2.*ADATA(LOOKUP(5))*ADATA(LOOKUP(4)) + + ADATA(LOOKUP(5))*ADATA(LOOKUP(5))) ENDIF CALL LWREFL(MINDX,BDATA) C ...Return for next reflection GOTO 100 200 CONTINUE CALL LRCLOS(MINDX) CALL LWCLOS(MINDX,MTZPRT) CALL CCPERR(0,'Normal termination') END