def run_ECRad_from_script(working_dir, shot, Config, InvokeECRad, args):
    Results = ECRadResults()
    Results.parse_config(Config, Config.time)
    next_time_index_to_analyze = 0
    print("Analyzing {0:d} time points".format(len(Config.time)))
    while True:
        if(next_time_index_to_analyze >= len(Config.time)):
            break
        print("Working on t = {0:1.4f}".format(Config.time[next_time_index_to_analyze]))
        if(os.path.isdir(os.path.join(Config.working_dir, "ECRad_data"))):
            shutil.rmtree(os.path.join(Config.working_dir, "ECRad_data"))
        for diag_key in Config.used_diags_dict:
            if("CT" in diag_key or "IEC" == diag_key):
                if(str(Config.used_diags_dict[diag_key].beamline) not in Config.gy_dict):
                    new_gy = get_ECRH_viewing_angles(Config.shot, \
                                                     Config.used_diags_dict[diag_key].beamline)
                    if(new_gy.error == 0):
                        Config.gy_dict[str(Config.used_diags_dict[diag_key].beamline)] = new_gy
                    else:
                        print("Error when reading viewing angles")
                        print("Launch aborted")
                        return
        if(not prepare_input_files(Config.time, next_time_index_to_analyze, Config)):
            print("Error!! Launch aborted")
            return None
        print("-------- Launching ECRad -----------\n")
        print("-------- INVOKE COMMAND------------\n")
        print(InvokeECRad + " " + Config.working_dir)
        ECRad_process = subprocess.Popen([InvokeECRad, args])
        print("-----------------------------------\n")
        ECRad_process = subprocess.Popen([InvokeECRad, Config.working_dir])
        ECRad_process.wait()
        next_time_index_to_analyze += 1
        try:
            Results.append_new_results()
        except (IOError, IndexError) as e:
            print("Error: Results of ECRad cannot be found")
            print("Most likely cause is an error that occurred within the ECRad")
            print("Please run the ECRad with current input parameters in a separate shell.")
            print("The command to launch the ECRad can be found above.")
            print("Afterwards please send any error messages that appear at sdenk|at|ipp.mpg.de")
            print("If no errors occur make sure that you don't have another instance of ECRad GUI working in the same working directory")
            print(e)
            return None

    Results.tidy_up()
    print("Finished!")
    return Results
def run_ECRad():
    args = sys.argv
    working_dir = args[1]
    shot = int(args[2])
    diag_id = args[3]
    shot_data_file = os.path.join(working_dir, args[4])
    times_to_analyze = None
    try:
        if(len(args) > 5):
            try:
                times_to_analyze = np.loadtxt(os.path.join(working_dir, args[5]))
                if(times_to_analyze.ndim == 0):
                    times_to_analyze = np.array([times_to_analyze])
            except:
                print("Failed to load " + os.path.join(working_dir, args[5]))
                print("Analyzing everything")
    except Exception as e:
        print("Initialization failed.")
        print("Error:", e)
        print("Usage: python run_ECRad_no_GUI.py <shotno> <diag id>")
        if(globalsettings.TCV):
            print("Possible diag ids: UCE, LCE, VCE, CCE")
        elif(globalsettings.AUG):
            print("Possible diag ids: ECE, CTA, CTC, IEC, ECN, ECO")
        else:
            print("Only AUG or TCV supported at this time")
        print("Got the following args", args)
        return -1
    try:
        Config = ECRadConfig()
        Config.from_mat_file(path=os.path.join(working_dir, "UserConfig.mat"))
    except IOError:
        print("Failed to load user config at : ")
        print(os.path.join(working_dir, "UserConfig.mat"))
    Config.working_dir = working_dir
    if(globalsettings.TCV):
        Config.time, Config.plasma_dict = load_plasma_from_mat(Config, shot_data_file)
        if(diag_id in ["UCE", "LCE", "VCE"]):
            Config.used_diags_dict.update({diag_id: Diag(diag_id, "TCV", diag_id, 0)})
        else:
            print("Selected diag_id {0:s} is not supported for TCV".format(diag_id))
            return -1
        Config.Ext_plasma = True
    elif(globalsettings.AUG):
        Config.time, Config.plasma_dict = load_IDA_data(shot, timepoints=None, exp="AUGD", ed=0)
        if(diag_id == "ECE"):
            Config.used_diags_dict.update({diag_id: Diag(diag_id, "AUGD", 'RMD', 0)})
        elif(diag_id in ["CTA", "CTC", "IEC"]):
            if(shot > 33724):
                if(diag_id == "CTA"):
                    beamline = 7
                elif(diag_id == "CTC"):
                    beamline = 8
                else:
                    beamline = 5
            else:
                if(diag_id == "CTA"):
                    beamline = 6
                else:
                    beamline = 5
            Config.used_diags_dict.update({diag_id: ECRH_diag(diag_id, "AUGD", diag_id, 0, beamline, 1.0, True)})
        elif(diag_id in ["ECN", "ECO"]):
            if(diag_id == "ECN"):
                Config.used_diags_dict.update({diag_id: ECI_diag(diag_id, "AUGD", "TDI", 0, "ECEI", "RZN", 0)})
            else:
                Config.used_diags_dict.update({diag_id: ECI_diag(diag_id, "AUGD", "TDI", 0, "ECEI", "RZO", 0)})
            Config.ECI_dict = get_ECI_launch(Config.used_diags_dict[diag_id], Config.shot)
        else:
            print("Selected diag_id {0:s} is not supported for TCV".format(diag_id))
            return -1
    else:
        print("Only AUG or TCV supported at this time")
    if(Config.time == None):
        print("Failed to initialize")
        return -1
    Config.shot = shot
    Config.working_dir = working_dir
    for diag_key in Config.used_diags_dict:
        if("CT" in diag_key or "IEC" == diag_key):
            if(str(Config.used_diags_dict[diag_key].beamline) not in Config.gy_dict):
                new_gy = get_ECRH_viewing_angles(Config.shot, \
                                                Config.used_diags_dict[diag_key].beamline)
                if(new_gy.error == 0):
                    Config.gy_dict[str(Config.used_diags_dict[diag_key].beamline)] = new_gy
                else:
                    print("Error when reading viewing angles")
                    print("Launch aborted")
                    return
    Results = ECRadResults()
    Results.parse_config(Config, Config.time)
    if(not times_to_analyze is None):
        it_ext = 0
        actual_times = []
        for i in range(len(times_to_analyze)):
            actual_times.append(np.argmin(np.abs(Config.time - times_to_analyze[it_ext])))
        actual_times = np.array(actual_times)
        Config.time = Config.time[actual_times]
        Config.plasma_dict["Te"] = Config.plasma_dict["Te"][actual_times]
        Config.plasma_dict["ne"] = Config.plasma_dict["ne"][actual_times]
        Config.plasma_dict["rhop"] = Config.plasma_dict["rhop"][actual_times]
        Config.plasma_dict["ne_rhop_scale"] = Config.plasma_dict["ne_rhop_scale"][actual_times]
        if(Config.plasma_dict["eq_data"] is not None):
            Config.plasma_dict["eq_data"] = Config.plasma_dict["eq_data"][actual_times]
    if(not Config.debug and globalsettings.AUG):
        InvokeECRad = "/afs/ipp-garching.mpg.de/home/s/sdenk/F90/ECRad_Model/ECRad_model"
    elif(globalsettings.AUG):
        InvokeECRad = "/marconi_work/eufus_gw/work/g2sdenk/ECRad_Model_parallel/ECRad_model"
    elif(globalsettings.TCV and Config.debug):
        InvokeECRad = "../ECRad_Model_TCV/ECRad_model"
    elif(globalsettings.TCV):
        InvokeECRad = "../ECRad_Model_TCV_no_debug/ECRad_model"
    else:
        print('Neither AUG nor TCV selected - no Machine!!')
        raise IOError
    Results = run_ECRad_from_script(working_dir, shot, Config, InvokeECRad, working_dir)
    Results.to_mat_file()
    print("Finished successfully")