def make_crystal(fnam):
    from crappy_crystals import symmetry_operations
    import disorder
    
    # read the h5 file 
    kwargs = read_input_output_h5(fnam)

    config = kwargs['config_file']
    
    if 'solid_unit_retrieved' in kwargs.keys():
        print '\nsolid_unit = solid_unit_retrieved'
        solid_unit = kwargs['solid_unit_retrieved']
    elif 'solid_unit_init' in kwargs.keys():
        print '\nsolid_unit = solid_unit_init'
        solid_unit = kwargs['solid_unit_init']
    elif 'solid_unit' in kwargs.keys():
        print '\nsolid_unit = solid_unit'
        solid_unit = kwargs['solid_unit']
    
    if config['crystal']['space_group'] == 'P1':
        sym_ops = symmetry_operations 
        sym_ops_obj = sym_ops.P1(config['crystal']['unit_cell'], config['detector']['shape'])
    elif config['crystal']['space_group'] == 'P212121':
        sym_ops = symmetry_operations
        sym_ops_obj = sym_ops.P212121(config['crystal']['unit_cell'], config['detector']['shape'])
    
    Solid_unit = np.fft.fftn(solid_unit, config['detector']['shape'])
    solid_unit_expanded = np.fft.ifftn(Solid_unit)

    modes = sym_ops_obj.solid_syms_Fourier(Solid_unit)
    
    #N   = config['disorder']['n']
    #exp = disorder.make_exp(config['disorder']['sigma'], config['detector']['shape'])
    
    lattice = sym_ops.lattice(config['crystal']['unit_cell'], config['detector']['shape'])
    
    #diff  = N * exp * np.abs(lattice * np.sum(modes, axis=0)**2)
    #diff += (1. - exp) * np.sum(np.abs(modes)**2, axis=0)


    fourier_space_crystal = np.sum(modes, axis=0) * lattice
    real_space_crystal    = np.fft.ifftn(fourier_space_crystal)
    real_space_crystal    = np.fft.fftshift(real_space_crystal)

    return real_space_crystal
        
def parse_cmdline_args():
    import argparse
    import os
    parser = argparse.ArgumentParser(prog = 'display.py', description='display the contents of output.h5 in a GUI')
    parser.add_argument('path', type=str, \
                        help="path to output.h5 file")
    parser.add_argument('-i', '--isosurface', action='store_true', \
                        help="display the crystal in the field of view as an iso surface")
    args = parser.parse_args()

    # check that args.ini exists
    if not os.path.exists(args.path):
        raise NameError('output h5 file does not exist: ' + args.path)
    return args



if __name__ == '__main__':
    args = parse_cmdline_args()
    
    if args.isosurface :
        show_crystal(args.path)
    else :
        # read the h5 file 
        kwargs = read_input_output_h5(args.path)
        
        signal.signal(signal.SIGINT, signal.SIG_DFL)    # allow Control-C
        #app = QtGui.QApplication(sys.argv)
        ex  = Application(fnam = args.path, **kwargs)