#!/usr/bin/env python3 # written by Thomas Barends # v. minor edits by J. Beale + conversion to python3 """ # aim visualise preferential orientations of crystals processed by CrystFEL # usage python update-geom-from-lab6.py -f , -r , -s step-size # output creates 3 plots showing the orientations of the crystals along the 3 axes """ # modules import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import argparse import os def ProjectionPlot(X,Y,Z,C,title): f=plt.figure() ax1=f.add_subplot(221) ax1.scatter(X,Z,s=0.5,c=C) ax1.set_title(title+',XZ plane') ax1.set_xlabel('X ') ax1.set_ylabel('Z (along beam)') ax1.set_aspect('equal', 'box') ax2=f.add_subplot(222,projection='3d') ax2.scatter(X,Z,-Y,s=0.5,c=C) ax2.set_xlabel('X ') ax2.set_ylabel('Z (along beam)') ax2.set_zlabel('Y (along jet)') ax2.set_aspect('equal', 'box') ax3=f.add_subplot(223) ax3.scatter(X,-Y,c=C,s=0.5) ax3.set_title(title+',XY plane') ax3.set_xlabel('X ') ax3.set_ylabel('Y (along jet)') ax3.set_aspect('equal', 'box') ax4=f.add_subplot(224) ax4.scatter(Z,-Y,c=C,s=0.5) ax4.set_title(title+',ZY plane') ax4.set_xlabel('Z (along beam)') ax4.set_ylabel('Y (along jet)') ax4.set_aspect('equal', 'box') f.canvas.manager.set_window_title(title) f.set_size_inches(9,7) plt.tight_layout() plt.savefig(title+'.png') plt.show() def main( stream_file, reindex=False, step=25 ): # declare lists to read reciprocal vectors astar=[] bstar=[] cstar=[] # open stream file, read all lines and close again infile=open(stream_file,'r') inlines=infile.readlines() infile.close() # loop over lines and extract reciprocal cell axes for line in inlines: if 'astar' in line: elements=line.split() vector=[float(elements[2]),float(elements[3]),float(elements[4])] astar.append(vector) if 'bstar' in line: elements=line.split() vector=[float(elements[2]),float(elements[3]),float(elements[4])] bstar.append(vector) if 'cstar' in line: elements=line.split() vector=[float(elements[2]),float(elements[3]),float(elements[4])] cstar.append(vector) # turn all into numpy arrays astararray=np.asarray(astar) bstararray=np.asarray(bstar) cstararray=np.asarray(cstar) # get number of cells from shape of array s=np.shape(astararray) numcells=s[0] # declare lists for real-space cell vector directions (i.e. normalized vectors) adir=[] bdir=[] cdir=[] # declare lists for vector lengths alen=[] blen=[] clen=[] # loop over all cells for n in range(numcells): astar=astararray[n,:] bstar=bstararray[n,:] cstar=cstararray[n,:] Vstar=np.dot( astar , np.cross( bstar , cstar ) ) # reciprocal cell volume a=(np.cross(bstar,cstar) / Vstar ) # calculate real-space a b=(np.cross(cstar,astar) / Vstar ) # calculate real-space b c=(np.cross(astar,bstar) / Vstar ) # calculate real-space c al=np.linalg.norm(a) # calculate lengths bl=np.linalg.norm(b) cl=np.linalg.norm(c) if al