def main():
    setDefaultSettings()
    #select_excecution_environment()
    if Settings.OPENCL == 1:
        [ctx, queue] = init_OpenCL()
    #test()
    [scene, collimators, leaf_array] = init_scene(Settings.PIECES)
    settingsList = define_settings(scene, leaf_array)
    oclu = OpenCLUtility.OpenCLUtility()

    if Settings.AUTOTUNE == 1:
        list = []
        list.append(Parameter("LINE_TRIANGLE_INTERSECTION_ALGORITHM", [2], True))
        list.append(Parameter("WG_LIGHT_SAMPLING_X", [1,2,4,8,16,32,64,128], False))
        list.append(Parameter("WG_LIGHT_SAMPLING_Y", [1,2,4,8,16,32,64,128], False))
        list.append(Parameter("WG_LIGHT_SAMPLING_Z", [1,2,4,8,16], False))
        list.append(Parameter("PIECES", [1,2,4,10,20], False))
        list.append(Parameter("RAY_AS", [0], True))
        list.append(Parameter("LEAF_AS", [1], True))
        list.append(Parameter("LEAF_DATA_AS", [2], True))
        list.append(Parameter("SCENE_AS", [2], True))
        list.append(Parameter("DEPTH_FIRST", [0], True))

        fluence_data = numpy.zeros(shape=(Settings.FLX,Settings.FLY), dtype=numpy.float32)
        intensities = numpy.zeros(shape=(Settings.FLX,Settings.FLY,Settings.LSAMPLESSQR), dtype=numpy.float32)

        at = Autotune(ParameterSet(list), run_OpenCL, (oclu, ctx, queue, scene, leaf_array, fluence_data, intensities, settingsList))

        at.findOptimizationParameters()

        #print at.getTable()
        at.saveCSV()

        [fluence_data_OpenCL, total_time_OpenCL, calculation_time_OpenCL, samplesPerSecond_OpenCL] = run_OpenCL(oclu, ctx, queue, scene, leaf_array, fluence_data, intensities, settingsList, at.best_parameters)
    else:
        fluence_data = numpy.zeros(shape=(Settings.FLX,Settings.FLY), dtype=numpy.float32)
        intensities = numpy.zeros(shape=(Settings.FLX,Settings.FLY,Settings.LSAMPLESSQR), dtype=numpy.float32)
        [fluence_data_OpenCL, total_time_OpenCL, calculation_time_OpenCL, samplesPerSecond_OpenCL] = run_OpenCL(oclu, ctx, queue, scene, leaf_array, fluence_data, intensities, settingsList, Settings.getDefaultOptimizationParameterList())

    if Settings.SHOW_PLOT == 1:
        if Settings.PYTHON == 1:
            show_plot(scene, fluence_data_Python, time_Python, samplesPerSecond_Python)
        if Settings.OPENCL == 1:
            show_plot(scene, fluence_data_OpenCL, total_time_OpenCL, samplesPerSecond_OpenCL)
    if Settings.SHOW_3D_SCENE == 1:
        show_3D_scene(scene, leaf_array, collimators)