C Adapted loosely from f2mtz.f
C 5/3/2004: Updated to show writing of crystals and datasets
C This program writes a basic MTZ file, using information
C in the DATA statements. Obviously, you will want to replace
C this with your own data.
C It should be run as "mtz_write HKLOUT foo.mtz"
PROGRAM WRITEMTZ
C Max number of labels
integer maxlab
parameter (maxlab = 200)
C Max number of symmetry operations
integer MAXSYM
parameter (MAXSYM = 192)
INTEGER I,J,MTZOUT,NLPRGO,NSYM,NSYMP,NSPGR,ISORT(5),NREFW
REAL WAVELENGTH,CELL(6),RSYM(4,4,MAXSYM),ADATA(MAXLAB),
+ COLUMNDATA1(MAXLAB),COLUMNDATA2(MAXLAB)
CHARACTER TITLE*80,CRYSTALNAME*20,PROJECTNAME*20,
+ DATASETNAME*20,
+ LSPRGO(MAXLAB)*30,CTPRGO(MAXLAB)*1,
+ XNAME(MAXLAB)*20,PNAME(MAXLAB)*20,DNAME(MAXLAB)*20,
+ LTYPE*1,SPGRNAM*10,PGNAM*10
C Example data from distributed toxd example
DATA TITLE /'From mtz_write'/
DATA CELL /73.582,38.733,23.189,90.000,90.000,90.000/
DATA WAVELENGTH /0.0/
DATA PROJECTNAME /'TOXD'/
DATA CRYSTALNAME /'NATIVE'/
DATA DATASETNAME /'NATIVE'/
DATA NLPRGO /5/
DATA LSPRGO /'H','K','L','F','SIGF',195*' '/
DATA CTPRGO /'H','H','H','F','Q',195*' '/
DATA NSPGR /19/
DATA LTYPE,SPGRNAM /'P','P212121'/
C Sort on H K L
DATA ISORT /1,2,3,0,0/
C Reflection data
DATA COLUMNDATA1 /0.0,0.0,2.0,626.00,112.00,195*0.0/
DATA COLUMNDATA2 /0.0,0.0,4.0,2853.00,59.00,195*0.0/
C CCP4 initialisations
call ccpfyp
C MTZ-specific initialisations
call mtzini
C Open mtz file
MTZOUT = 1
write(6,*)'pjx opening file'
call lwopen(MTZOUT,'HKLOUT')
write(6,*)'pjx back from lwopen'
C Write title to MTZ header
write(6,*)'pjx lwtitl'
call lwtitl (MTZOUT,TITLE,0)
write(6,*)'pjx back from lwtitl'
C Write cell to MTZ header
write(6,*)'pjx lwcell'
call lwcell(MTZOUT,CELL)
write(6,*)'pjx back from lwcell'
C *** For CCP4 5.0 libraries
C Store the crystal, project and dataset names plus
C associated data in the mtz header:
write(6,*)'pjx lwidx'
call lwidx(MTZOUT,PROJECTNAME,CRYSTALNAME,DATASETNAME,
+ CELL,WAVELENGTH)
write(6,*)'pjx back from lwidx'
C Alternatively:
C *** For CCP4 4.2 (and earlier)
C Store the project and dataset names
C call lwid(MTZOUT,PROJECTNAME,DATASETNAME)
C Store the column labels in the mtz header:
C Simpler alternative to LKYOUT/LWASSN
write(6,*)'pjx lwclab'
call lwclab(MTZOUT,LSPRGO,NLPRGO,CTPRGO,0)
write(6,*)'pjx back from lwclab'
C *** For CCP4 5.0 libraries
C Associate columns with crystals and datasets
do i=1,NLPRGO
xname(i) = CRYSTALNAME
dname(i) = DATASETNAME
enddo
write(6,*)'pjx lwidasx'
call lwidasx(MTZOUT,NLPRGO,XNAME,DNAME,0)
write(6,*)'pjx back from lwidasx'
C Alternatively:
C *** For CCP4 4.2 (and earlier)
C Associate columns with projects and datasets
C do i=1,NLPRGO
C pname(i) = PROJECTNAME
C dname(i) = DATASETNAME
C enddo
C call lwidas(MTZOUT,NLPRGO,PNAME,DNAME,0)
C Get symmetry info from file SYMOP (default set by ccp4.setup)
C on channel 24
CALL MSYMLB(24,NSPGR,SPGRNAM,PGNAM,NSYMP,NSYM,RSYM)
C Store the symmetry in the mtz header:
call lwsymm (MTZOUT,NSYM,NSYMP,RSYM,LTYPE,NSPGR,SPGRNAM,PGNAM)
C Store program details in history header:
call lwhstl (MTZOUT, ' ')
C Store sort order to be used
CALL LWSORT(MTZOUT,ISORT)
C Loop over ouput reflections
C Data for 2 reflections given here - normally calculated and
C lots more!
NREFW = 2
DO I = 1,NREFW
C Initialise ADATA with Missing Number Flags
CALL EQUAL_MAGIC(MTZOUT,ADATA,NLPRGO)
C Fill in data columns where possible (all in this simple e.g.)
do 31 J = 1,NLPRGO
if (i.eq.1) adata(J) = columndata1(J)
if (i.eq.2) adata(J) = columndata2(J)
31 continue
C Write out reflection
call lwrefl (MTZOUT, adata)
ENDDO
C Close mtz file, print full header:
call lwclos (MTZOUT, 3)
call ccperr(0,'Normal termination')
end