def parse_one_file(input_data):
    # looking for cached results
    cache_filename = input_data.infile + '.cache'
    
    ## BRANCH: parsed infile already cached
    if ( USE_PCAP_CACHE and os.path.isfile(cache_filename) ):
        print "Reading cache:", cache_filename
        pickle_input = open(cache_filename, 'rb')
        senders = pickle.load(pickle_input)
        pickle_input.close()
    
    ## BRANCH: no cache
    else:
        ## * parse pcap file *
        senders = Pcap_Parser.parse(input_data.infile, PACKETS)  # 100000
    
        ## caching parser results
        if ( USE_PCAP_CACHE ):
            pickle_output = open(cache_filename, 'wb')
            pickle.dump(senders, pickle_output, pickle.HIGHEST_PROTOCOL)
            pickle_output.close()



    ##
#    types = (   Storage_Classes.Sender.TYPE.AP, \
#                Storage_Classes.Sender.TYPE.STATION, \
#                Storage_Classes.Sender.TYPE.UNKNOWN)
    types = (   Storage_Classes.Sender.TYPE.AP, )
            
#    ## FIXME at the moment "s.show(addr)" is important for proper functionality
    for t in types:
        for addr in senders:
            s = senders[addr]
            if ( s.type == t ):
#                s.show(addr)
                s.set_addr(addr)


    
    ## Visualization
#        Visualization.show_biggest_ap(senders)

    ## Units
    sender = get_biggest_ap(senders)
#    sender = get_biggest_ap(senders)
    print
    print "Using:"
    sender.show()

    # window sizes
#    UNIT_WINDOW = 0.1
    UNIT_WINDOW = 1.0
    DATA_POINT_WINDOW = 6.0
#    DATA_POINT_WINDOW = 5.0

#    SKIP_FRONT = 20
    SKIP_FRONT = 0
    
    OVERLAPPING = True
    
    
    ## Data Grouping ##
    units = Data_Grouping.build_units(sender, input_data.annotation, UNIT_WINDOW, SKIP_FRONT)
    print "created units:", len(units), "(" + str(len(units) * units[0].length) + "s)"
    parts = Data_Grouping.separation(units)

    part = parts[0]    
    part.windows = Data_Grouping.windowing(part, DATA_POINT_WINDOW, OVERLAPPING)
    part.features = Features.calculate_features(part)

#    ## XXX
#    for x in units:
#        print x.show()

    ## XXX    
#    for x in part.features:
#        if ( not x.invalid ):
#            print "|||", x
    print "new features:", len(part.features)
    


    

    ## plot into file
    prepare_dir(input_data.group.plot_base_dir)
    filename = input_data.group.plot_base_dir + "/" + os.path.splitext(os.path.basename(input_data.infile))[0] + ".pdf"
    
    
    ## XXX do pickles in the plot dir, too
    if ( PICKLE_FEATURES ):
        pick_path = input_data.group.plot_base_dir + "/" + os.path.splitext(os.path.basename(input_data.infile))[0] + "_features.pickle"
        pickle_output = open(pick_path, 'wb')
        pickle.dump(part, pickle_output, pickle.HIGHEST_PROTOCOL)
        pickle_output.close()

    
##    xlim = [units[0].start, 200]
#    xlim = [20, 200]
#    ylim = [-75, -15]
#    print ">>>>>>> Plotting into:", filename
#    Visualization.plot_mean_and_variance_into_file(units, xlim, ylim, filename)
#    Visualization.plot_min_max_rssi(units, xlim, ylim, filename)


    ## plot data_points into file
#    xlim = [0, 350]
#    ylim = [-5, 10]
    xlim = None
    ylim = None
#    Visualization.plot_data_points(data_points, xlim, ylim, filename)
#    Visualization.plot_data_points(merged_points, xlim, ylim, filename, invalid_points = invalid_points)
    Visualization.plot_data_points(part.features, xlim, ylim, filename)
#    ylim = [0, 2]
#    Visualization.plot_data_points(level_points, xlim, ylim, filename)

    ## XXX visualize raw rssi data (interactive)
    ##   -- BE CAREFUL: this will not work in parallel processing mode
    Visualization.plot_raw_rssi(sender)
    
    print "-----------------------------------------------------------------------"
    
    
    header = None
#    header = \
#'''Activity\tmean\tvariance\tdistance\tdiff\tsign\tlevels
#discrete\tcontinuous\tcontinuous\tcontinuous\tcontinuous\tdiscrete\tcontinuous
#class\t\t\t\t\t
#'''

#    orange_data = Orange_Export.Data_Collection(merged_points, header)
    orange_data = Orange_Export.Data_Collection(part.features, None)

    ## return
#    return units
    return orange_data