class ECRadRayManipulator(object):
    '''
    classdocs
    '''
    def __init__(self, ECRad_result_file):
        '''
        Constructor
        '''
        self.org_results_file = ECRad_result_file
        self.ECRad_results = ECRadResults()
        self.ECRad_results.from_mat_file(ECRad_result_file)
        self.N_ch = self.ECRad_results.Scenario.ray_launch[0]["f"]
        self.N_ray = self.ECRad_results.Config["Physics"]["N_ray"]
        if (self.ECRad_results.Config["Physics"]["considered_modes"] == 1):
            self.modes = ["X"]
        elif (self.ECRad_results.Config["Physics"]["considered_modes"] == 2):
            self.modes = ["O"]
        elif (self.ECRad_results.Config["Physics"]["considered_modes"] == 3):
            self.modes = ["X", "O"]
        else:
            raise ValueError("Invalid value in considered modes")

    def get_Rz_single_ray(self, it, ich, mode="X", iray=0):
        if (self.N_ray == 1):
            R = np.sqrt(self.ECRad_results.ray["x"+mode][it][ich]**2 + \
                        self.ECRad_results.ray["y"+mode][it][ich]**2)
            return R, self.ECRad_results.ray["z" + mode][it][ich]
        else:
            R = np.sqrt(self.ECRad_results.ray["x"+mode][it][ich][iray]**2 + \
                        self.ECRad_results.ray["y"+mode][it][ich][iray]**2)
            return R, self.ECRad_results.ray["z" + mode][it][ich][iray]

    def get_field_single_ray(self, field, it, ich, mode="X", iray=0):
        if (self.N_ray == 1):
            return self.ECRad_results.ray[field + mode][it][ich]
        else:
            return self.ECRad_results.ray[field + mode][it][ich][iray]

    def set_field_single_ray(self, field, values, it, ich, mode="X", iray=0):
        if (self.N_ray == 1):
            if (self.ECRad_results.ray[field + mode][it][ich].shape !=
                    values.shape):
                raise ValueError(
                    "The new values must have the same shape as the original values"
                )
            self.ECRad_results.ray[field + mode][it][ich] = values
        else:
            if (self.ECRad_results.ray[field + mode][it][ich][iray].shape !=
                    values.shape):
                raise ValueError(
                    "The new values must have the same shape as the original values"
                )
            self.ECRad_results.ray[field + mode][it][ich][iray] = values

    def save(self, new_filename, comment=""):
        if (new_filename == self.org_results_file):
            print("This routine does not allow overwriting of the old file!")
            return
        self.ECRad_results.to_mat_file(new_filename, comment)
Example #2
0
def manipiulate_rays(result_file_in, result_file_out):
    res = ECRadResults()
    res.from_mat_file(result_file_in)
    for index in range(len(res.time)):
        for ich in range(len(res.Scenario.ray_launch[index]["f"])):
            for mode in res.modes:
                if (res.Config["Physics"]["N_ray"] > 1):
                    for iray in range(len(res.ray["s" + mode][index][ich])):
                        res.ray["Te" + mode][index][ich][iray][:] /= 2.0
                else:
                    res.ray["Te" + mode][index][ich][:] /= 2.0
    res.to_mat_file(result_file_out)
def repair_ECRad_results(folder_in, folder_out=None):
    # Allows to make bulk modification of result files using glob
    # If folder_out is True it overwrites!
    filelist = glob.glob(os.path.join(folder_in, "*.mat"))
#     filelist = ['/tokp/work/sdenk/DRELAX_Results/ECRad_35662_ECECTACTC_run0208.mat']
    cur_result = ECRadResults()
    for filename in filelist:
        cur_result.reset()
        cur_result.from_mat_file(filename)
        # Enter bulk modifcations here
        cur_result.Scenario.used_diags_dict["CTC"].diag = "CTC"
        if(folder_out is None):
            cur_result.to_mat_file(filename)
        else:
            cur_result.to_mat_file(os.path.join(folder_out, os.path.basename(filename)))    
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")