def load_reference_intensites(ref_file):

    t_intens = (read_results.extract_value_from_h5(ref_file, "/data/data")).astype("float")
    intens_len = len(t_intens)
    qmax    = intens_len/2
    (q_low, q_high) = (15, int(0.9*qmax))
    qRange1 = numpy.arange(-q_high, q_high + 1)
    qRange2 = numpy.arange(-qmax, qmax + 1)
    qPos0   = numpy.array([[i,j,0] for i in qRange1 for j in qRange1 if numpy.sqrt(i*i+j*j) > q_low]).astype("float")
    qPos1   = numpy.array([[i,0,j] for i in qRange1 for j in qRange1 if numpy.sqrt(i*i+j*j) > q_low]).astype("float")
    qPos2   = numpy.array([[0,i,j] for i in qRange1 for j in qRange1 if numpy.sqrt(i*i+j*j) > q_low]).astype("float")
    qPos    = numpy.concatenate((qPos0, qPos1, qPos2))
    qPos_full = numpy.array([[i,j,k] for i in qRange2 for j in qRange2 for k in qRange2]).astype("float")
    return (qmax, t_intens, intens_len, qPos, qPos_full)
Exemplo n.º 2
0
def load_reference_intensites(ref_file):

    t_intens = (read_results.extract_value_from_h5(
        ref_file, "/data/data")).astype("float")
    intens_len = len(t_intens)
    qmax = intens_len / 2
    (q_low, q_high) = (15, int(0.9 * qmax))
    qRange1 = numpy.arange(-q_high, q_high + 1)
    qRange2 = numpy.arange(-qmax, qmax + 1)
    qPos0 = numpy.array([[i, j, 0] for i in qRange1 for j in qRange1
                         if numpy.sqrt(i * i + j * j) > q_low]).astype("float")
    qPos1 = numpy.array([[i, 0, j] for i in qRange1 for j in qRange1
                         if numpy.sqrt(i * i + j * j) > q_low]).astype("float")
    qPos2 = numpy.array([[0, i, j] for i in qRange1 for j in qRange1
                         if numpy.sqrt(i * i + j * j) > q_low]).astype("float")
    qPos = numpy.concatenate((qPos0, qPos1, qPos2))
    qPos_full = numpy.array([[i, j, k] for i in qRange2 for j in qRange2
                             for k in qRange2]).astype("float")
    return (qmax, t_intens, intens_len, qPos, qPos_full)
Exemplo n.º 3
0
def do_analysis(args):
    # Scan directories for reconstructions that were done.
    # Reference directory is the zeroth (or first) one.
    dirs = glob.glob(args.input_directory + "/")
    cwd = os.getcwd()
    curr_dir = dirs[0]
    curr_file = glob.glob(os.path.join(curr_dir, args.tmp_fn))[0]
    print "Will read default parameters from reconstruction in " + curr_file

    (qmax, t_intens, intens_len, qPos,
     qPos_full) = load_reference_intensites(curr_file)
    quats = load_quaternions(os.path.join(curr_dir, "quaternion.dat"))

    num_dirs = len(dirs)
    intens_stack = numpy.zeros((num_dirs, intens_len, intens_len, intens_len))
    intens_stack[0] = t_intens.copy()
    dir_ct = 1
    i_off = 1.E-7
    tt_intens = (t_intens > 0.) * t_intens
    tt_intens /= tt_intens.max()
    tt_intens = numpy.abs(numpy.log(tt_intens + i_off))

    if num_dirs > 1:
        for dir_ct in range(num_dirs):
            dir = dirs[dir_ct]
            t0 = time.time()
            curr_file = glob.glob(os.path.join(dir, args.tmp_fn))[0]
            c_intens = (read_results.extract_value_from_h5(
                curr_file, "/data/data")).astype("float")
            cc_intens = (c_intens > 0.) * c_intens
            cc_intens /= cc_intens.max()
            cc_intens = numpy.abs(numpy.log(cc_intens + i_off))
            scores = rotateIntens.orient_two_intensities(
                tt_intens.ravel(), cc_intens.ravel(), qPos.ravel(),
                quats.ravel(), intens_len)
            ml_quat = quats[(scores.argsort())[0]]
            out_intens = numpy.zeros_like(cc_intens)
            rotateIntens.interp_intensities(c_intens.ravel(),
                                            out_intens.ravel(),
                                            qPos_full.ravel(), ml_quat,
                                            intens_len)
            t1 = time.time()
            intens_stack[dir_ct] = out_intens.copy()
            print "Done orienting intensity %d of %d. Took %lf s." % (
                dir_ct, num_dirs, t1 - t0)

    # Save stack.
    h5 = h5py.File("3d_stack.h5", "w")
    h5.create_group("data")
    h5.create_dataset("data/oriented_diffraction_volumes", data=intens_stack)
    h5.close()
    # Make diagnostic images from individual reconstructions
    # only if make_diag_imgs option is true
    if args.make_diag_imgs:
        for dir in dirs:
            os.chdir(dir)
            tmp_file = glob.glob(args.tmp_fn)[0]
            print tmp_file
            print "=" * 80
            print "Making images for %s " % dir + "." * 20
            try:
                viewRecon.make_panel_of_intensity_slices(tmp_file, c_n=16)
            except:
                print "Making of intensity slices failed!"
            viewRecon.make_error_time_plot(tmp_file)
            try:
                viewRecon.make_mutual_info_plot(tmp_file)
            except:
                print "Making of mutual information plot failed!"
            print "=" * 80
            os.chdir(cwd)

        tarBallName = (os.getcwd().split('/')[-1]) + ".tgz"
        os.system("tar -czf  %s  " % tarBallName +
                  ''.join([s + "*.pdf " for s in dirs]))
        print "Images saved in %s" % tarBallName

    # Make images from merging individual reconstructions
    # only if merge_imgs option is true
    if args.merge_imgs:
        (rows, cols) = (3, max([2, num_dirs / 3 + 1]))
        matplotlib.rcParams.update({'font.size': 13})
        fig, ax = plt.subplots(rows,
                               cols,
                               sharex=True,
                               sharey=True,
                               figsize=(2.5 * cols, 2.5 * rows))
        fig.subplots_adjust(wspace=0.01)
        stack_ct = 0
        for r in range(rows):
            for c in range(cols):
                if stack_ct >= num_dirs:
                    break
                out_intens = intens_stack[stack_ct]
                im = ax[r, c].imshow(
                    numpy.log(numpy.abs(out_intens[qmax]) + 1.E-7),
                    cmap=plt.cm.coolwarm,
                    aspect='auto')
                plt.draw()
                stack_ct += 1

        cbar_ax = fig.add_axes([0.9, 0.1, 0.025, 0.8])
        fig.colorbar(im, cax=cbar_ax, label="log10(intensities)")
        (shx, shy) = t_intens[qmax].shape
        (h_shx, h_shy) = (shx / 2, shy / 2)
        xt = numpy.linspace(0.5 * h_shx, shx - .5 * h_shx - 1, 3).astype('int')
        xt_l = numpy.linspace(-0.5 * h_shx, 0.5 * h_shx, 3).astype('int')
        yt = numpy.linspace(0, shy - 1, 3).astype('int')
        yt_l = numpy.linspace(-1 * h_shy, h_shy, 3).astype('int')
        plt.setp(ax, xticks=xt, xticklabels=xt_l, yticks=yt, yticklabels=yt_l)
        img_name = "slices.pdf"
        plt.savefig(img_name, bbox_inches='tight')
        plt.close(fig)

        fig2, ax2 = plt.subplots(1, 1)
        im = ax2.imshow(
            numpy.log(
                numpy.abs((numpy.median(intens_stack, axis=0))[qmax]) + 1.E-7))
        fig2.subplots_adjust(wspace=0.01)
        cbar_ax2 = fig2.add_axes([0.9, 0.1, 0.025, 0.8])
        fig2.colorbar(im, cax=cbar_ax2, label="log10(intensities)")
        plt.setp(ax2, xticks=xt, xticklabels=xt_l, yticks=yt, yticklabels=yt_l)
        img_name = "merged.pdf"
        plt.savefig(img_name, bbox_inches='tight')
        plt.close(fig2)
def do_analysis(args):
    # Scan directories for reconstructions that were done.
    # Reference directory is the zeroth (or first) one.
    dirs        = glob.glob(args.input_directory+"/")
    cwd         = os.getcwd()
    curr_dir    = dirs[0]
    curr_file   = glob.glob(os.path.join(curr_dir, args.tmp_fn))[0]
    print "Will read default parameters from reconstruction in " + curr_file

    (qmax, t_intens, intens_len, qPos, qPos_full) = load_reference_intensites(curr_file)
    quats       = load_quaternions(os.path.join(curr_dir, "quaternion.dat"))

    num_dirs        = len(dirs)
    intens_stack    = numpy.zeros((num_dirs, intens_len, intens_len, intens_len))
    intens_stack[0] = t_intens.copy()
    dir_ct          = 1
    i_off           = 1.E-7
    tt_intens       = (t_intens>0.)*t_intens
    tt_intens       /= tt_intens.max()
    tt_intens       = numpy.abs(numpy.log(tt_intens+i_off))

    if num_dirs > 1:
        for dir_ct in range(num_dirs):
            dir         = dirs[dir_ct]
            t0          = time.time()
            curr_file   = glob.glob(os.path.join(dir, args.tmp_fn))[0]
            c_intens    = (read_results.extract_value_from_h5(curr_file, "/data/data")).astype("float")
            cc_intens   = (c_intens>0.)*c_intens
            cc_intens   /= cc_intens.max()
            cc_intens   = numpy.abs(numpy.log(cc_intens+i_off))
            scores      = rotateIntens.orient_two_intensities(tt_intens.ravel(), cc_intens.ravel(), qPos.ravel(), quats.ravel(), intens_len)
            ml_quat     = quats[(scores.argsort())[0]]
            out_intens  = numpy.zeros_like(cc_intens)
            rotateIntens.interp_intensities(c_intens.ravel(), out_intens.ravel(), qPos_full.ravel(), ml_quat, intens_len)
            t1          = time.time()
            intens_stack[dir_ct] = out_intens.copy()
            print "Done orienting intensity %d of %d. Took %lf s."%(dir_ct, num_dirs, t1-t0)

    # Save stack.
    h5 = h5py.File("3d_stack.h5", "w")
    h5.create_group("data")
    h5.create_dataset("data/oriented_diffraction_volumes", data=intens_stack )
    h5.close()
    # Make diagnostic images from individual reconstructions
    # only if make_diag_imgs option is true
    if args.make_diag_imgs:
        for dir in dirs:
            os.chdir(dir)
            tmp_file = glob.glob(args.tmp_fn)[0]
            print tmp_file
            print "="*80
            print "Making images for %s "%dir + "."*20
            try:
                viewRecon.make_panel_of_intensity_slices(tmp_file, c_n=16)
            except:
                print "Making of intensity slices failed!"
            viewRecon.make_error_time_plot(tmp_file)
            try:
                viewRecon.make_mutual_info_plot(tmp_file)
            except:
                print "Making of mutual information plot failed!"
            print "="*80
            os.chdir(cwd)

        tarBallName = (os.getcwd().split('/')[-1])+".tgz"
        os.system("tar -czf  %s  "%tarBallName + ''.join([s+"*.pdf " for s in dirs]))
        print "Images saved in %s" % tarBallName

    # Make images from merging individual reconstructions
    # only if merge_imgs option is true
    if args.merge_imgs:
        (rows, cols)= (3, max([2,num_dirs/3+1]))
        matplotlib.rcParams.update({'font.size': 13})
        fig, ax     = plt.subplots(rows, cols, sharex=True, sharey=True, figsize=(2.5*cols, 2.5*rows))
        fig.subplots_adjust(wspace=0.01)
        stack_ct    = 0
        for r in range(rows):
            for c in range(cols):
                if stack_ct >= num_dirs:
                    break
                out_intens  = intens_stack[stack_ct]
                im          = ax[r, c].imshow(numpy.log(numpy.abs(out_intens[qmax])+1.E-7), cmap=plt.cm.coolwarm, aspect='auto')
                plt.draw()
                stack_ct    += 1

        cbar_ax         = fig.add_axes([0.9, 0.1, 0.025, 0.8])
        fig.colorbar(im, cax=cbar_ax, label="log10(intensities)")
        (shx, shy)      = t_intens[qmax].shape
        (h_shx, h_shy)  = (shx/2, shy/2)
        xt              = numpy.linspace(0.5*h_shx, shx-.5*h_shx-1, 3).astype('int')
        xt_l            = numpy.linspace(-0.5*h_shx, 0.5*h_shx, 3).astype('int')
        yt              = numpy.linspace(0, shy-1, 3).astype('int')
        yt_l            = numpy.linspace(-1*h_shy, h_shy, 3).astype('int')
        plt.setp(ax, xticks=xt, xticklabels=xt_l, yticks=yt, yticklabels=yt_l)
        img_name        = "slices.pdf"
        plt.savefig(img_name, bbox_inches='tight')
        plt.close(fig)

        fig2, ax2       = plt.subplots(1, 1)
        im              = ax2.imshow(numpy.log(numpy.abs((numpy.median(intens_stack, axis=0))[qmax])+1.E-7))
        fig2.subplots_adjust(wspace=0.01)
        cbar_ax2        = fig2.add_axes([0.9, 0.1, 0.025, 0.8])
        fig2.colorbar(im, cax=cbar_ax2, label="log10(intensities)")
        plt.setp(ax2, xticks=xt, xticklabels=xt_l, yticks=yt, yticklabels=yt_l)
        img_name        = "merged.pdf"
        plt.savefig(img_name, bbox_inches='tight')
        plt.close(fig2)