def main(args): assert args.cs.endswith('.cs'), "Input file must be a .cs file" assert args.o.endswith('.pkl'), "Output CTF parameters must be .pkl file" metadata = np.load(args.cs) N = len(metadata) log('{} particles'.format(N)) ctf_params = np.zeros((N, 9)) ctf_params[:,0] = metadata['blob/shape'][0][0] fields = ('blob/psize_A','ctf/df1_A','ctf/df2_A','ctf/df_angle_rad','ctf/accel_kv','ctf/cs_mm','ctf/amp_contrast','ctf/phase_shift_rad') for i,f in enumerate(fields): ctf_params[:,i+1] = metadata[f] if f in ('ctf/df_angle_rad', 'ctf/phase_shift_rad'): # convert to degrees ctf_params[:,i+1] *= (180/np.pi) ctf.print_ctf_params(ctf_params[0]) log('Saving {}'.format(args.o)) with open(args.o,'wb') as f: pickle.dump(ctf_params.astype(np.float32), f) if args.png: import matplotlib.pyplot as plt ctf.plot_ctf(int(ctf_params[0,0]), ctf_params[0,1], ctf_params[0,2:]) plt.savefig(args.png) log(args.png)
def main(args): assert args.star.endswith('.star'), "Input file must be .star file" assert args.o.endswith('.pkl'), "Output CTF parameters must be .pkl file" if args.relion31: # TODO: parse the data_optics block assert args.kv is not None, "--kv must be set manually with RELION 3.1 file format" assert args.cs is not None, "--cs must be set manually with RELION 3.1 file format" assert args.w is not None, "-w must be set manually with RELION 3.1 file format" s = starfile.Starfile.load(args.star, relion31=args.relion31) N = len(s.df) log('{} particles'.format(N)) overrides = {} if args.kv is not None: log(f'Overriding accerlating voltage with {args.kv} kV') overrides[HEADERS[3]] = args.kv if args.cs is not None: log(f'Overriding spherical abberation with {args.cs} mm') overrides[HEADERS[4]] = args.cs if args.w is not None: log(f'Overriding amplitude contrast ratio with {args.w}') overrides[HEADERS[5]] = args.w if args.ps is not None: log(f'Overriding phase shift with {args.ps}') overrides[HEADERS[6]] = args.ps ctf_params = np.zeros((N, 9)) ctf_params[:, 0] = args.D ctf_params[:, 1] = args.Apix for i, header in enumerate([ '_rlnDefocusU', '_rlnDefocusV', '_rlnDefocusAngle', '_rlnVoltage', '_rlnSphericalAberration', '_rlnAmplitudeContrast', '_rlnPhaseShift' ]): ctf_params[:, i + 2] = s.df[ header] if header not in overrides else overrides[header] log('CTF parameters for first particle:') ctf.print_ctf_params(ctf_params[0]) log('Saving {}'.format(args.o)) with open(args.o, 'wb') as f: pickle.dump(ctf_params.astype(np.float32), f) if args.png: import matplotlib.pyplot as plt assert args.D, 'Need image size to plot CTF' ctf.plot_ctf(args.D, args.Apix, ctf_params[0, 2:]) plt.savefig(args.png) log(args.png)
def main(args): assert args.cs.endswith('.cs'), "Input file must be a .cs file" assert args.o.endswith('.pkl'), "Output CTF parameters must be .pkl file" metadata = np.load(args.cs) N = len(metadata) log('{} particles'.format(N)) # sometimes blob/shape, blob/psize_A are missing from the .cs file try: D = metadata['blob/shape'][0][0] Apix = metadata['blob/psize_A'] except ValueError: assert args.D, "Must provide image size with -D" assert args.Apix, "Must provide pixel size with --Apix" D = args.D Apix = args.Apix ctf_params = np.zeros((N, 9)) ctf_params[:, 0] = D ctf_params[:, 1] = Apix fields = ('ctf/df1_A', 'ctf/df2_A', 'ctf/df_angle_rad', 'ctf/accel_kv', 'ctf/cs_mm', 'ctf/amp_contrast', 'ctf/phase_shift_rad') for i, f in enumerate(fields): ctf_params[:, i + 2] = metadata[f] if f in ('ctf/df_angle_rad', 'ctf/phase_shift_rad'): # convert to degrees ctf_params[:, i + 2] *= (180 / np.pi) ctf.print_ctf_params(ctf_params[0]) log('Saving {}'.format(args.o)) with open(args.o, 'wb') as f: pickle.dump(ctf_params.astype(np.float32), f) if args.png: import matplotlib.pyplot as plt ctf.plot_ctf(int(ctf_params[0, 0]), ctf_params[0, 1], ctf_params[0, 2:]) plt.savefig(args.png) log(args.png)