Aniso cutoff
Jump to navigation
Jump to search
A program to cut your data anisotropically is given below. To use it, save it as aniso_cutoff.f90 and compile&link with e.g.
gfortran -C aniso_cutoff.f90 -o aniso_cutoff
Then run it with ./aniso_cutoff
! program to impose elliptic resolution cutoff ! Kay Diederichs 2010-04-16 ! input file: INTEGRATE.HKL ! output file: INTEGRATE.HKL.modified - to be used for the CORRECT step ! user input: resolution cutoffs (in A) along a*, b* and c* (3 numbers) ! module cell_mod real as,bs,cs,cosgs,cosbs,cosas contains subroutine getcell(a,b,c,alf,bet,gam) implicit none real, intent(in) :: a,b,c,alf,bet,gam real cosa,cosb,cosg,sina,sinb,sing,vol cosa=cos(alf/57.2958) cosb=cos(bet/57.2958) cosg=cos(gam/57.2958) sina=sin(alf/57.2958) sinb=sin(bet/57.2958) sing=sin(gam/57.2958) cosas=(cosb*cosg-cosa)/(sinb*sing) cosbs=(cosa*cosg-cosb)/(sina*sing) cosgs=(cosa*cosb-cosg)/(sina*sinb) vol=a*b*c*sqrt(1.-cosa**2-cosb**2-cosg**2+2*cosa*cosb*cosg) as=b*c*sina/vol bs=a*c*sinb/vol cs=a*b*sing/vol end subroutine getcell ! subroutine getres(ih,ik,il,resol) implicit none integer, intent(in) :: ih,ik,il real, intent(out) :: resol real s2,stol s2=((ih*as)**2+(ik*bs)**2+(il*cs)**2+2.*ih*ik*as*bs*cosgs & +2.*ih*il*as*cs*cosbs+2.*ik*il*bs*cs*cosas)/4. stol = sqrt(s2) resol=1./(2.*stol) end subroutine getres end module cell_mod ! program main USE cell_mod implicit none real acut,bcut,ccut,a,b,c,alf,bet,gam,resol integer :: ih,ik,il,n1=0,n2=0 character line*160 ! open files open(1,file='INTEGRATE.HKL',status='OLD') open(2,file='INTEGRATE.HKL.modified',status='UNKNOWN') print*,'what is the resolution cutoff along a*, b*, c* (in Angstrom)?' print*,'for trigonal, hexagonal and tetragonal spacegroups, the first 2 numbers should be the same' print*,'for cubic spacegroups, all 3 numbers should be the same' read*,acut,bcut,ccut ! loop over lines of INTEGRATE.HKL do read(1,'(a)',end=99) line if (line(1:21)=='!UNIT_CELL_CONSTANTS=') then read(line(22:),*) a,b,c,alf,bet,gam print '(a,6f11.3)','!UNIT_CELL_CONSTANTS=',a,b,c,alf,bet,gam a=a/acut b=b/bcut c=c/ccut call getcell(a,b,c,alf,bet,gam) endif if (line(1:1)=='!') then write(2,'(a)') line(:len_trim(line)) else read(line,*) ih,ik,il call getres(ih,ik,il,resol) if (resol>=1.) then write(2,'(a)') line(:len_trim(line)) n2=n2+1 endif n1=n1+1 endif end do ! finish 99 print*,n1,'reflections found in INTEGRATE.HKL' print*,n2,'reflections written to INTEGRATE.HKL.modified' print*,'you should now enter these two commands:' print*,'mv INTEGRATE.HKL INTEGRATE.HKL.original' print*,'mv INTEGRATE.HKL.modified INTEGRATE.HKL' print*,'and then run the CORRECT job of XDS' close(1) close(2) end program main