def exp(Experiment_name, hyp_param, df):
    PHASE = "training"
    Basline_Name = "AB3DMOT"
    DATASET_NAME = "kitti"
    debug_level = paraser_args.debug_level
    SCRIPT_DIR = "/usr/stud/kaddah/ciwt_gd"
    DATASET_DIR = "/usr/stud/kaddah/storage/datasets/"
    DATASET = DATASET_DIR + DATASET_NAME + "/{}".format(PHASE)
    PREPROC = DATASET_DIR + DATASET_NAME + "/{}/preproc".format(PHASE)
    OUT_DIR = DATASET_DIR + DATASET_NAME + "/{}/{}".format(
        PHASE, paraser_args.tracking_output)
    # Possible modes: 'detection', 'detection_shape'
    # The latter is considered obsolete; this option is still here for eval purposes
    MODE = "detection"  # detection_shape
    CIWT = "/usr/stud/kaddah/ciwt_gd/build/apps/CIWTApp"

    # Specify detectors (should correspond to detector dir names and config names)
    # DETS=['det_02_regionlets', 'det_02_3DOP', 'pointrcnn']
    DETS = ['pointrcnn']

    if DATASET_NAME == "kitti":
        if PHASE == "training" or PHASE == "validation":
            end_frames = [
                "153", "446", "232", "143", "313", "296", "269", "799", "389",
                "802", "293", "372", "77", "339", "105", "375", "208", "144",
                "338", "1058", "836"
            ]
            SEQUENCES = [2, 6, 7, 8, 10, 13, 14, 16, 18]

        else:
            end_frames = [
                "464", "146", "242", "256", "420", "808", "113", "214", "164",
                "348", "1175", "773", "693", "151", "849", "700", "509", "304",
                "179", "403", "172", "202", "435", "429", "315", "175", "169",
                "84", "174"
            ]
            SEQUENCES = range(29)
    # Path to your binary
    # e.sequence_name
    # ['0002', '0006', '0007', '0008', '0010', '0013', '0014', '0016', '0018']
    # e.n_frames
    # [233, 270, 800, 390, 294, 340, 106, 209, 339]

    # Exec tracker for each detection set
    for DET in DETS:
        # Exec tracker for each sequence
        for SEQ in SEQUENCES:
            SEQNAME = "%04d" % (SEQ)
            print("Process: {}".format(SEQNAME))

            IM_LEFT = "{}/image_02/{}/%06d.png".format(DATASET, SEQNAME)
            IM_RIGHT = "{}/image_03/{}/%06d.png".format(DATASET, SEQNAME)
            DISP = "{}/disparity/disp_{}/%06d_left.png".format(
                PREPROC, SEQNAME)
            END_FRAME = end_frames[SEQ]
            CALIB = "{}/calib/{}.txt".format(DATASET, SEQNAME)
            PROP = "{}/cached_proposals/{}/%06d.bin".format(PREPROC, SEQNAME)
            OUT_DIR_DET = "{}/{}".format(OUT_DIR, DET)
            DETPATH = "{}/detection/{}/{}/%06d.txt".format(
                PREPROC, DET, SEQNAME)
            DETCFG = "{}/cfg/{}.cfg".format(SCRIPT_DIR, DET)

            if os.path.exists(SCRIPT_DIR + "/results/" + Experiment_name):
                shutil.rmtree(SCRIPT_DIR + "/results/" + Experiment_name)
            shutil.copytree(SCRIPT_DIR + "/results/ready_results_baseline",
                            SCRIPT_DIR + "/results/" + Experiment_name)

            args = [
                "--config",
                str(DETCFG), "--left_image_path",
                str(IM_LEFT), "--end_frame",
                str(END_FRAME), "--right_image_path",
                str(IM_RIGHT), "--left_disparity_path",
                str(DISP), "--calib_path",
                str(CALIB), "--object_proposal_path",
                str(PROP), "--detections_path",
                str(DETPATH), "--output_dir",
                str(OUT_DIR_DET), "--tracking_mode",
                str(MODE), "--sequence_name",
                str(SEQNAME), "--debug_level",
                str(debug_level), "--is_oriented",
                str(1), "--enable_coupling",
                str(1), "--check_exit_to2D_projeciton",
                str(0), "--association_score_is_3DIoU",
                str(1), "--association_appearance_model_weight",
                str(hyp_param["association_appearance_model_weight"]),
                "--IoU3D_model_weight",
                str(hyp_param["IoU3D_model_weight"]),
                "--association_weight_distance_from_camera_param",
                str(hyp_param["association_weight_distance_from_camera_param"]
                    ), "--gaiting_appearance_threshold",
                str(hyp_param["gaiting_appearance_threshold"]),
                "--gaiting_IOU_threshold",
                str(hyp_param["gaiting_IOU_threshold"]),
                "--gaiting_mh_distance_threshold",
                str(hyp_param["gaiting_mh_distance_threshold"]),
                "--gaiting_min_association_score",
                str(hyp_param["gaiting_min_association_score"]),
                "--gaiting_size_2D",
                str(hyp_param["gaiting_size_2D"]), "--tracking_e1",
                str(hyp_param["tracking_e1"]), "--tracking_e3",
                str(hyp_param["tracking_e3"]), "--tracking_e4",
                str(hyp_param["tracking_e4"]),
                "--id_handling_overlap_threshold",
                str(hyp_param["id_handling_overlap_threshold"]),
                "--tracking_exp_decay",
                str(hyp_param["tracking_exp_decay"]), "--max_hole_size",
                str(hyp_param["max_hole_size"]),
                "--tracking_temporal_window_size",
                str(hyp_param["tracking_temporal_window_size"]),
                "--hole_penalty_decay_parameter",
                str(hyp_param["hole_penalty_decay_parameter"]),
                "--min_observations_needed_to_init_hypothesis",
                str(hyp_param["min_observations_needed_to_init_hypothesis"]),
                "--tracking_single_detection_hypo_threshold",
                str(hyp_param["tracking_single_detection_hypo_threshold"])
                # ,

                # "--kf_2d_observation_noise", str(hpy["kf_2d_observation_noise"]) ,
                # "--kf_2d_initial_variance", str(hpy["kf_2d_initial_variance"]) ,
                # "--kf_2d_system_noise", str(hpy["kf_2d_system_noise"]) ,
                # "--kf_3d_observation_noise", str(hpy["kf_3d_observation_noise"]) ,
                # "--kf_3d_initial_variance",str(hpy["kf_3d_initial_variance"]) ,
                # "--kf_3d_system_noise",str(hpy["kf_3d_system_noise"]) ,
                # "--kf_system_pos_variance_car_x",str(hpy["kf_system_pos_variance_car_x"]) ,
                # "--kf_system_pos_variance_car_z",str(hpy["kf_system_pos_variance_car_z"]) ,
                # "--kf_system_velocity_variance_car_x",str(hpy["kf_system_velocity_variance_car_x"]) ,
                # "--kf_system_velocity_variance_car_z",str(hpy["kf_system_velocity_variance_car_z"]) ,
                # "--kf_orientation_obs_noise",str(hpy["kf_orientation_obs_noise"])
            ]
            subprocess.run([CIWT] + args)
    for DET in DETS:
        shutil.move(
            OUT_DIR + "/" + DET + "/data", SCRIPT_DIR + "/results" + "/" +
            Experiment_name + "/CIWT_Pointrcnn/val/")

    PHASE = "training"
    # Determine sequences here
    if PHASE == "training":
        #     SEQUENCES = [0,1,3,4,5,9,11,12,15,17,19,20]
        # elif PHASE == "validation":
        SEQUENCES = [2, 6, 7, 8, 10, 13, 14, 16, 18]
    else:
        SEQUENCES = range(29)
    # settings = open(SCRIPT_DIR+"/evaluation/evaluate_tracking.seqmap.val",'w')
    # for SEQ in SEQUENCES:
    #     settings.write("%04d empty 000000 %06d \n"%(SEQ,int(end_frames[SEQ])))
    # settings.close()
    seqs_frames = [SEQUENCES, [int(end_frames[s]) + 1 for s in SEQUENCES]]
    argv = []
    tracked = 'car'
    argv.append("{}_3d_det_val".format(tracked))
    argv.append(Experiment_name)
    argv.append('3D')
    argv.append(df)
    # remove '*' if the trajectories are for each objects are separated in different subfolders
    argv.append("CIWT_Pointrcnn" + '*')
    argv.append(seqs_frames)
    # argv.append(PHASE)
    print("start evaluation")
    mota, motp, df = run(*argv)
    return mota, motp, df
def exp(Experiment_name, hyp_param, df, PHASE, index =-1):
    Basline_Name="AB3DMOT"
    DATASET_NAME="kitti"
    debug_level=3

    DATASET=DATASET_DIR+DATASET_NAME+"/{}".format("training")
    PREPROC=DATASET_DIR+DATASET_NAME+"/{}/preproc".format("training")
    OUT_DIR=DATASET_DIR+DATASET_NAME+"/{}/{}".format("training",Experiment_name)
    # Possible modes: 'detection', 'detection_shape'
    # The latter is considered obsolete; this option is still here for eval purposes
    MODE="detection" # detection_shape
    CIWT="/usr/stud/kaddah/ciwt_gd/build/apps/CIWTApp"

    # Specify detectors (should correspond to detector dir names and config names)
    # DETS=['det_02_regionlets', 'det_02_3DOP', 'pointrcnn']
    DETS=['pointrcnn']
    end_frames=["153", "446", "232", "143", "313", "296", "269", "799", "389", "802", "293", "372", "77", "339", "105", "375", "208", "144", "338", "1058", "836"]


    if DATASET_NAME=="kitti":
        if PHASE=="training":
            SEQUENCES = [2, 6, 7, 8, 10, 13, 14, 16, 18]

        elif PHASE=="validation":
            SEQUENCES = [0,1,3,4,5,9,11,12,15,17,19,20]

    if not os.path.exists(SCRIPT_DIR+"/results/"+Experiment_name):
        if PHASE == "validation":
            shutil.copytree(SCRIPT_DIR+"/results/ready_results_baseline_val",SCRIPT_DIR+"/results/"+Experiment_name)
        else:
            shutil.copytree(SCRIPT_DIR+"/results/ready_results_baseline",SCRIPT_DIR+"/results/"+Experiment_name)
    # Exec tracker for each detection set
    for DET in DETS:
        # Exec tracker for each sequence
        for SEQ in SEQUENCES:
            SEQNAME="%04d"%(SEQ) 
            print("Process: {}".format(SEQNAME))

            IM_LEFT="{}/image_02/{}/%06d.png".format(DATASET,SEQNAME)
            IM_RIGHT="{}/image_03/{}/%06d.png".format(DATASET,SEQNAME)
            DISP="{}/disparity/disp_{}/%06d_left.png".format(PREPROC,SEQNAME)
            END_FRAME=end_frames[SEQ]
            CALIB="{}/calib/{}.txt".format(DATASET,SEQNAME)
            PROP="{}/cached_proposals/{}/%06d.bin".format(PREPROC,SEQNAME)
            OUT_DIR_DET="{}/{}".format(OUT_DIR,DET)
            DETPATH="{}/detection/{}/{}/%06d.txt".format(PREPROC,DET,SEQNAME)
            DETCFG="{}/cfg/{}.cfg".format(SCRIPT_DIR,DET)

            # if os.path.exists(SCRIPT_DIR+"/results/"+Experiment_name):
            #     shutil.rmtree(SCRIPT_DIR+"/results/"+Experiment_name, ignore_errors=True)
            # shutil.copytree(SCRIPT_DIR+"/results/ready_results_baseline/",SCRIPT_DIR+"/results/"+Experiment_name+"/")

            args = ["--config", str(DETCFG),
                                "--left_image_path", str(IM_LEFT) ,
                                "--end_frame", str(END_FRAME) ,
                                "--right_image_path", str(IM_RIGHT),
                                "--left_disparity_path", str(DISP) ,
                                "--calib_path", str(CALIB) ,
                                "--object_proposal_path", str(PROP) ,
                                "--detections_path", str(DETPATH),
                                "--output_dir", str(OUT_DIR_DET),
                                "--tracking_mode", str(MODE),
                                "--sequence_name", str(SEQNAME),
                                "--debug_level", str(debug_level) ,
                                "--is_oriented", str(1) ,
                                "--enable_coupling", str(1) ,
                                "--check_exit_to2D_projeciton", str(0) ,
                                "--association_score_is_3DIoU", str(1) 
                                , 
                                "--association_appearance_model_weight", str(hyp_param["association_appearance_model_weight"]) ,
                                "--IoU3D_model_weight", str(hyp_param["IoU3D_model_weight"]) ,
                                "--association_weight_distance_from_camera_param", str(hyp_param["association_weight_distance_from_camera_param"]) ,
                                "--gaiting_appearance_threshold", str(hyp_param["gaiting_appearance_threshold"]) ,
                                "--gaiting_IOU_threshold", str(hyp_param["gaiting_IOU_threshold"]) , 
                                "--gaiting_mh_distance_threshold", str(hyp_param["gaiting_mh_distance_threshold"]) ,
                                "--gaiting_min_association_score", str(hyp_param["gaiting_min_association_score"]) , 
                                "--gaiting_size_2D", str(hyp_param["gaiting_size_2D"]) ,
                                "--tracking_e1", str(hyp_param["tracking_e1"]) , 
                                "--tracking_e3", str(hyp_param["tracking_e3"]) , 
                                "--tracking_e4", str(hyp_param["tracking_e4"]) , 
                                "--id_handling_overlap_threshold", str(hyp_param["id_handling_overlap_threshold"]) ,
                                "--tracking_exp_decay", str(hyp_param["tracking_exp_decay"]) ,
                                # "--not_selected_tolerance", str(hyp_param["not_selected_tolerance"]) ,
                                "--max_hole_size", str(hyp_param["max_hole_size"]) , 
                                "--tracking_temporal_window_size", str(hyp_param["tracking_temporal_window_size"]) ,
                                "--hole_penalty_decay_parameter", str(hyp_param["hole_penalty_decay_parameter"]) , 
                                "--min_observations_needed_to_init_hypothesis", str(hyp_param["min_observations_needed_to_init_hypothesis"]) ,
                                "--tracking_single_detection_hypo_threshold", str(hyp_param["tracking_single_detection_hypo_threshold"]) 
                                # ,

                                # "--kf_2d_observation_noise", str(hyp["kf_2d_observation_noise"]) ,
                                # "--kf_2d_initial_variance", str(hyp["kf_2d_initial_variance"]) ,
                                # "--kf_2d_system_noise", str(hyp["kf_2d_system_noise"]) ,
                                # "--kf_3d_observation_noise", str(hyp["kf_3d_observation_noise"]) ,
                                # "--kf_3d_initial_variance",str(hyp["kf_3d_initial_variance"]) ,
                                # "--kf_3d_system_noise",str(hyp["kf_3d_system_noise"]) ,
                                # "--kf_system_pos_variance_car_x",str(hyp["kf_system_pos_variance_car_x"]) ,
                                # "--kf_system_pos_variance_car_z",str(hyp["kf_system_pos_variance_car_z"]) ,
                                # "--kf_system_velocity_variance_car_x",str(hyp["kf_system_velocity_variance_car_x"]) ,
                                # "--kf_system_velocity_variance_car_z",str(hyp["kf_system_velocity_variance_car_z"]) ,
                                # "--kf_orientation_obs_noise",str(hyp["kf_orientation_obs_noise"])
                                ]
            subprocess.run([CIWT] + args)
    for DET in DETS:
        shutil.move(OUT_DIR+"/"+DET+"/data",SCRIPT_DIR+"/results/"+Experiment_name+"/CIWT_Pointrcnn/val/data")
    

    # Determine sequences here

    if PHASE =="training":
        SEQUENCES = [2, 6, 7, 8, 10, 13, 14, 16, 18]

    else:
        SEQUENCES = [0,1,3,4,5,9,11,12,15,17,19,20]


    seqs_frames = [SEQUENCES, [ int(end_frames[s])+1 for s in SEQUENCES]]
    
    tracked = ['car', 'ped']
    DIMENSION = ['3D', '2D']
    for dim in DIMENSION:
        for obj in  tracked:
            argv = []
            argv.append("{}_3d_det_val".format(obj))
            argv.append(Experiment_name)
            argv.append(dim)
            argv.append(df[dim][obj])
            # remove '*' if the trajectories are for each objects are separated in different subfolders
            argv.append("CIWT_Pointrcnn"+'*')
            argv.append(seqs_frames)
            # argv.append(PHASE)
            print("start evaluation")
            
            mota, motp, df[dim][obj] = run(*argv)
    return  df