def main():
    """
    Prepare data with: ::
    
        be_average_logs_results --dir . --experiment camera_bgds_boot -v gray/GI_DI -v contrast/GS_DS
        be_average_logs_results --dir . --experiment camera_bgds_stats -v gray/GI_DI -v contrast/GS_DS
        

    Reads: ::
    
        out/average_logs_results/camera_bgds_boot.pickle
        out/average_logs_results/camera_bgds_stats.pickle
        
    Writes: ::
    
        out/camera_bgds_boot/report.html
        out/camera_bgds_boot/report.pickle
        out/camera_bgds_boot/<variant>:G.pickle 
        
    moreover, it calls camera_figures() that creates
    
         output_pattern = 'out/camera_figures/{variant}.tex'
     
        
    """
    input1 = 'out/average_logs_results/camera_bgds_boot.pickle'
    input2 = 'out/average_logs_results/camera_bgds_stats.pickle'
    variant_pattern = "out/camera_bgds_boot/{variant}:G.pickle"
    out_html = 'out/camera_bgds_boot/report.html'
    out_pickle = 'out/camera_bgds_boot/report.pickle'
    
    results = my_pickle_load(input1)
    print 'Found variants: %s' % results.keys()
    
    stats = my_pickle_load(input2)
    
    print 'Found variants: %s' % stats.keys()
    
    print "Creating report..."
    
    
    report = Node('camera_bgds_boot') 
    
    k = 1
    variants = sorted(results.keys())
    for variant_id in variants:
        variant = variant_id.replace('/', '_')
        print 'Considering %s' % variant
        data = results[variant_id] 
        data2 = stats[variant_id]
        print data2.keys()
        
        #if not variant in ['gray_GI_DI', 'contrast_GS_DS']:
        #    continue
        
        n = report.node(variant)
        f1 = n.figure('value')
        f2 = n.figure('sign')
        f3 = n.figure('abs')
        
        for variable, value in data.items():
            v = n.data(variable, value)
            if len(value.shape) == 3:
                f1.sub(variable, display='rgb')
            else:
                v.data('sign', numpy.sign(value), desc='sign of %s' % variable)
                v.data('abs', numpy.abs(value), desc='abs of %s' % variable)
                f1.sub(variable, display='posneg', skim=1)
                f2.sub('%s/sign' % variable, display='posneg')
                f3.sub('%s/abs' % variable, display='scale', min_value=0)
        
    
        f4 = n.figure('stats')

        for variable, value in data2.items():
            if len(value.shape) == 3:
                v = n.data(variable, value.astype('uint8'))
                f1.sub(variable, display='rgb')
            else:
                v = n.data(variable, value)
                #f4.sub(variable, display='scale', skim=1)
                f4.sub(variable, display='scale', skim=1, min_value=0)

        Gxl = data['Gxl']
        Gyl = data['Gyl']
        Gxa = data['Gxa']
        Gya = data['Gya'] 
        
        
        def set_zeros_to_one(x):
            x = x.copy()
            zeros, = nonzero(x.flat == 0)
            x.flat[zeros] = 1
            print "%d/%d of data were 0" % (len(zeros), len(x.flat))
            return x
        
        norm_gx = set_zeros_to_one (data2['gx_abs']) 
        norm_gy = set_zeros_to_one (data2['gy_abs'])  

        Gxl_norm = Gxl / norm_gx
        Gyl_norm = Gyl / norm_gy
        Gxa_norm = Gxa / norm_gx
        Gya_norm = Gya / norm_gy

        
        n.data('Gxl_norm', Gxl_norm)
        n.data('Gyl_norm', Gyl_norm)
        n.data('Gxa_norm', Gxa_norm)
        n.data('Gya_norm', Gya_norm)

        
        f5 = n.figure('normalized')
        display = {'display': 'posneg', 'skim': 2}
        f5.sub('Gxl_norm', **display)
        f5.sub('Gyl_norm', **display)
        f5.sub('Gxa_norm', **display)
        f5.sub('Gya_norm', **display)
        
        k += 1
        if k > 1:
            pass
        #   break # tmp
             
        if True:
            s = {'variant': variant,
                 'Gxl':Gxl_norm,
                 'Gyl':Gyl_norm,
                 'Gxa':Gxa_norm,
                 'Gya':Gya_norm }
            filename = variant_pattern.format(variant=variant)
            dir = os.path.dirname(filename)
            if not os.path.exists(dir):
                os.makedirs(dir)
            my_pickle_dump(s, filename)
            print 'Written on %s' % filename
            
    
    print "Writing on %s" % out_html
    report.to_html(out_html)
    #print "Writing on %s" % out_pickle
    my_pickle_dump(report, out_pickle) 
def main():
    """
    Prepare data with:
    
        average_logs_results --dir . --experiment laser_bgds_boot
    
    """
    print "Loading first..."
    results = my_pickle_load('out/average_logs_results/laser_bgds_boot.pickle')

    report = Node('laser_bgds_boot')
    manual = my_figures(results)
    write_figures_for_paper(manual)
    report.add_child(manual)
    
    
    k = 1
    variants = sorted(results.keys())
    # FIXME: this was uncommented (Was I in a hurry?)
    # variants = []
    for variant in variants:
        data = results[variant] 
        G = data['G']
        B = data['B']
        
#        gy_mean = data['gy_mean']
#        y_mean = data['y_mean']
#        one_over_y_mean = data['one_over_y_mean']
        y_dot_var = data['y_dot_var']
        y_dot_svar = data['y_dot_svar']
        gy_var = data['gy_var']
        gy_svar = data['gy_svar']
        
        print 'Considering %s' % variant
        
        n = report.node(variant)
        
        #readings = range(360, G.shape[0])
        readings = range(0, G.shape[0])
        N = len(readings)
        
        G = G[readings, :]
        B = B[readings, :]
        y_dot_var = y_dot_var[readings]
        y_dot_svar = y_dot_svar[readings]
        gy_var = gy_var[readings]
        gy_svar = gy_svar[readings] 
        
        for k in [0, 2]:
            var = 'G[%s]' % k
            G_k = n.data(var, G[:, k])
            G_k_n = G[:, k] / gy_var
            with G_k.data_pylab('original') as pylab:
                pylab.plot(G[:, k])
                pylab.title(var + ' original')
                M = abs(G[:, k]).max()
                pylab.axis([0, N, -M, M])
                           
            with G_k.data_pylab('normalized') as pylab:
                pylab.plot(G_k_n)
                pylab.title(var + ' normalized')
                M = abs(G_k_n).max()
                pylab.axis([0, N, -M, M])            

        for k in [0, 2]:
            var = 'B[%s]' % k
            B_k = n.data(var, B[:, k])
            B_k_n = B[:, k] / gy_var
            
            with B_k.data_pylab('original') as pylab:
                pylab.plot(B[:, k])
                pylab.title(var + ' original')
                M = abs(B[:, k]).max()
                pylab.axis([0, N, -M, M])            

            with B_k.data_pylab('normalized') as pylab:
                pylab.plot(B_k_n)
                pylab.title(var + ' normalized')            
                M = abs(B_k_n).max()
                pylab.axis([0, N, -M, M])            


        n.figure('obtained', sub=['B[0]/normalized', 'B[2]/normalized',
        'G[0]/normalized', 'G[2]/normalized', ])


        n.figure('G', sub=['G[0]/original', 'G[0]/normalized',
        'G[2]/original', 'G[2]/normalized'])


        n.figure('B', sub=['B[0]/original', 'B[0]/normalized',
        'B[2]/original', 'B[2]/normalized']) 
        
        
        
        theta = linspace(0, 2 * math.pi, N) - math.pi / 2
        with n.data_pylab('B_v') as pylab:
            pylab.plot(-cos(theta))
            pylab.axis([0, N, -2, 2])
        with n.data_pylab('B_omega') as pylab:
            pylab.plot(0 * theta)
            pylab.axis([0, N, -2, 2])
        with n.data_pylab('G_v') as pylab:
            pylab.plot(-sin(theta))
            pylab.axis([0, N, -2, 2])
        with n.data_pylab('G_omega') as pylab:
            pylab.plot(numpy.ones((N)))
            pylab.axis([0, N, -2, 2])
            
        n.figure('expected', sub=['B_v', 'B_omega', 'G_v', 'G_omega'])
        
        norm = lambda x: x / x.max()
        #   norm = lambda x : x
        with n.data_pylab('y_dot_var') as pylab:
            pylab.plot(norm(y_dot_var), 'b', label='y_dot_var')
            pylab.plot(norm(y_dot_svar ** 2), 'g', label='y_dot_svar')
            
            pylab.axis([0, N, 0, 1])
            pylab.legend()

        with n.data_pylab('gy_var') as pylab:
            pylab.plot(norm(gy_var) , 'b', label='gy_var')
            pylab.plot(norm(gy_svar ** 2), 'g', label='gy_svar')
            
            pylab.axis([0, N, 0, 1])
            pylab.legend()
            
            
        f = n.figure('stats')
        f.sub('y_dot_var')
        f.sub('gy_var')
        
        for var in ['y_dot_mean', 'gy_mean', 'y_mean', 'y_var', 'one_over_y_mean']:
            with n.data_pylab(var) as pylab:
                pylab.plot(data[var][readings])
            f.sub(var)
            
        with n.data_pylab('y_mean+var') as pylab:
            y = data['y_mean'][readings]
            var = data['y_var'][readings]
            pylab.errorbar(range(0, N), y, yerr=3 * numpy.sqrt(var), fmt='ro')
                
        f.sub('y_mean+var')

        print variant
        
        if True: #variant == 'GS_DS':
            s = {'variant': variant,
                 'Gl':G[:, 0] / gy_var,
                 'Ga':G[:, 2] / gy_var,
                 'Bl':B[:, 0] / gy_var,
                 'Ba':B[:, 2] / gy_var }
            filename = "out/laser_bgds_boot/%s:GB.pickle" % variant.replace('/', '_')
            make_sure_dir_exists(filename)
            my_pickle_dump(s, filename)
            print 'Written on %s' % filename
        

    node_to_html_document(report, 'out/laser_bgds_boot/report.html')
def main():
    
    def find_in_path(path, pattern):
        for root, dirs, files in os.walk(path): #@UnusedVariable
            for f in files: 
                if fnmatch.fnmatch(f, pattern):
                    yield os.path.join(root, f)
               
    dir = 'Bicocca_2009-02-25a/out/camera_bgds_predict/gray_GI_DI/' 
    files = list(find_in_path(dir, '*.??.pickle*'))
    if not files:
        raise Exception('No files found.')
    

    for f in files:
        print 'Loading {0}'.format(f)
        data = my_pickle_load(f)
        basename = os.path.splitext(f)[0]
        out_html = basename + '/report.html'
        #out_pickle = basename + '/report.pickle'

        if not os.path.exists(basename):
            os.makedirs(basename)
        
        logdir = data['logdir']
        time = data['time']
        y = data['y']
        y_dot = data['y_dot']
        y_dot_pred = data['y_dot_pred']
        y_dot_s = data['y_dot_s']
        y_dot_pred_s = data['y_dot_pred_s']
        
        report = Node('{logdir}-{time:.2f}'.format(logdir=logdir, time=time))
        prod = -numpy.minimum(0, y_dot_s * y_dot_pred_s)
        
        report.data('y', y)
        report.data('y_dot', y_dot)
        report.data('y_dot_pred', y_dot_pred)
        report.data('y_dot_s', y_dot_s)
        report.data('y_dot_pred_s', y_dot_pred_s)
        report.data('prod', prod)
        
        f = report.figure('display') 
        f.sub('y', display='rgb')
        f.sub('y_dot', display='posneg')
        f.sub('y_dot_pred', display='posneg')
        f.sub('y_dot_s', display='posneg')
        f.sub('y_dot_pred_s', display='posneg')
        f.sub('prod', display='scale')
        
        zones = [
                 ('ZoneA', range(95, 181), range(55, 140)),
                 ('ZoneB', range(80, 111), range(480, 510)),
                 ('ZoneC', range(50, 181), range(330, 460))
                ]
        
        for zone in zones:
            name, y, x = zone
            
            zr = report.node(name)
            zf = zr.figure()
            for var in ['y', 'y_dot', 'y_dot_pred', 'y_dot_s', 'y_dot_pred_s',
                        'prod']:
                zd = data[var][y, :][:, x]
                zr.data(var, zd)
                
                if var == 'y':
                    disp = {'display': 'rgb'}
                elif var == 'prod':
                    disp = {'display': 'scale'}
                else:
                    disp = {'display': 'posneg'}

                zf.sub(var, **disp)
        
            outdir = basename + '/' + name 
            id = "%s:%.2f:%s" % (logdir, time, name)
            print id
        
            if not os.path.exists(outdir):
                os.makedirs(outdir)

            create_latex_frag(os.path.join(outdir, 'conf.tex'), outdir, zr, id, True)
            create_latex_frag(os.path.join(outdir, 'report.tex'), outdir, zr, id, False)
        
        print 'Writing on %s' % out_html
        node_to_html_document(report, out_html)