From 5cb30000dc42db205bfe151e42bf0bcbe51a7a0e Mon Sep 17 00:00:00 2001 From: Peter Drewelow <peter.drewelow@ipp.mpg.de> Date: Tue, 11 Jun 2019 16:31:07 +0200 Subject: [PATCH] IR_config_constants: added path to local data directory for parameter/input files IR_image_tools: changed import of os for more flexibility IR_image_tools: new function read_finger_info() reads intup files with parameters of the fingers as defined in the heat flux mapping IR_image_tools: new function derive_wetted_area_per_module() calculates the wetted area given a numpy array with THEODOR results and mapping reference arrays as stored on the archive downloadversionIRdata: small fixes to parameter structure in calls and messages, variation of example section new input files in .\data: finger_infor_TDU.csv and finger_info_HHF.csv (used for wetted area calculation) --- IR_config_constants.py | 1 + IR_image_tools.py | 406 ++++++++++++++++++++++++++++++++++++++- data/finger_info_HHF.csv | 140 ++++++++++++++ data/finger_info_TDU.csv | 140 ++++++++++++++ downloadversionIRdata.py | 48 ++--- 5 files changed, 707 insertions(+), 28 deletions(-) create mode 100644 data/finger_info_HHF.csv create mode 100644 data/finger_info_TDU.csv diff --git a/IR_config_constants.py b/IR_config_constants.py index 701d7a9..0341ddc 100644 --- a/IR_config_constants.py +++ b/IR_config_constants.py @@ -11,6 +11,7 @@ IRCamColdframes_fittingpath=calibpath+"IRCamColdframes_fitting\\" IRCamRefImagespath = calibpath+'IRCamReferenceImages\\' IRCAMBadPixels_path = calibpath + 'IRCAMBadPixels\\' heatflux_requestlist_path="\\\\x-drive\\Diagnostic-logbooks\\QRT-DivertorThermography\\ArchiveDB_heatflux_pipeline\\" +parameter_file_path = ".\\data" try: # import sys path=str(repr(__file__)).split("IR_config_constants")[0].split("'")[1]+"upload_config" diff --git a/IR_image_tools.py b/IR_image_tools.py index 22e3fe7..e6ac5f5 100644 --- a/IR_image_tools.py +++ b/IR_image_tools.py @@ -14,12 +14,16 @@ Tools for: """ import numpy as np import matplotlib.pyplot as plt -from IR_config_constants import portcamdict,IRCamRefImagespath,IRCAMBadPixels_path +import matplotlib.patches as patches +from IR_config_constants import portcamdict,IRCamRefImagespath,IRCAMBadPixels_path,parameter_file_path import h5py -from os.path import join, basename +import os import glob import datetime +# set working directory to local directory of script +os.chdir(os.path.dirname(__file__)) + def get_OP_by_time(time_ns=None, shot_no=None, program_str=None): '''Derives operation phase (OP) of W7-X based on either: a nanosacond time stamp, a MDSplus style shot no. or a program ID. @@ -483,19 +487,19 @@ def load_ref_images(port, exposuretime, verbose=0): ''' cameraname = portcamdict['OP1.2a'][port] foldername = cameraname.split('_')[0] + '_' + cameraname.split('_')[2] - scanpath = join(IRCamRefImagespath, foldername) + scanpath = os.path.join(IRCamRefImagespath, foldername) coldref, hotref = [], [] for filename in glob.iglob(scanpath + '\*' + str(int(exposuretime)) + 'us.h5', recursive=True): if 'hot' in filename: if verbose>0: print('load_ref_images: read from ',filename) with h5py.File(filename, 'r') as h5in: - hotref = h5in[basename(filename)].value + hotref = h5in[os.path.basename(filename)].value elif 'cold' in filename: if verbose>0: print('load_ref_images: read from ',filename) with h5py.File(filename, 'r') as h5in: - coldref = h5in[basename(filename)].value + coldref = h5in[os.path.basename(filename)].value return coldref, hotref def reconstruct_coldframe (exposuretime, sT, a, bnew, coldref): @@ -516,4 +520,394 @@ def check_dublicates_2(array): if x not in seen: uniq.append(x) seen.add(x) - return uniq,seen \ No newline at end of file + return uniq,seen + +#%% functions regarding wetted area calculation + +def read_finger_info(file_name=None, OP='OP1.2b', verbose=0): + '''Read divertor finger information from file. The referenced fingers are those + defined in the IR profile mapping, i.e. the target modlues 5 and 6 are + divided in inner and outer fingers (see 'finger_part' in result dictionary). + + INPUT + ----- + file_name: str, optional + file name of csv fiel with finger information + (OPTIONAL: default is None, i.e. decide by OP) + OP: str, optional + label of operation phase of interest, e.g. 'OP1.2b' + (OPTIONAL: default is 'OP1.2b', i.e. load TDU file) + verbose: integer, optional + feedback level (details of print messages) + (OPTIONAL: if not provided, only ERROR output) + RESULT + ------ + finger_dic: dictionary + dictionary with keys 'ID', 'target', 'target_element','n_profiles', 'width', 'finger_part' (see NOTES) + NOTES + ----- + contents of result dictionary: + * 'ID' numpy array of integers of continuous finger number + * 'target' list of strings of target identifier ('h_l' horizontal low-iota, 'h_m' horizontal middle part, 'h_h' horizontal high-iota, 'v' vertical) + * 'target_element' numpy array of integers of target module number (1..9 on horizontal target, 1..3 on vertical target) + * 'n_profiles' numpy array of integers of number of profiles defined on this finger + * 'width' numpy array of floats of centre width of finger in meters + * 'finger_part' numpy array of integers indicating with 0 this is a full finger and with 1 this is the second part of the previous finger + ''' + if file_name is None: + # assume OP is given + if OP.startswith('OP1'): + file_name='finger_info_TDU.csv' + elif OP.startswith('OP2'): + file_name='finger_info_HHF.csv' + full_path = os.path.join(parameter_file_path, file_name) + print(full_path) + if verbose>0: + print('read_finger_info: reading from file {0} in {1}'.format(file_name, parameter_file_path)) + if not os.path.isfile(full_path): + raise Exception('read_finger_info: ERROR! file not found') + + finger_dic = {'ID': [], + 'target': [], + 'target_element':[], + 'n_profiles':[], + 'width':[], + 'finger_part':[]} + + data = np.genfromtxt(full_path, delimiter=';', dtype=(int, "|S3", int, int, float, int)) + for i in range(len(data)): + finger_dic['ID'].append( data[i][0] ) + finger_dic['target'].append( data[i][1].decode('UTF-8') ) + finger_dic['target_element'].append( data[i][2] ) + finger_dic['n_profiles'].append( data[i][3] ) + finger_dic['width'].append( data[i][4] ) + finger_dic['finger_part'].append( data[i][5] ) + + finger_dic['ID'] = np.array(finger_dic['ID']) + finger_dic['target_element'] = np.array(finger_dic['target_element']) + finger_dic['n_profiles'] = np.array(finger_dic['n_profiles']) + finger_dic['width'] = np.array(finger_dic['width']) + finger_dic['finger_part'] = np.array(finger_dic['finger_part']) + + return finger_dic + + +def derive_wetted_area_per_module(heat_flux, mapping, mode='average', q_max=None, + profile_average_range=3, ports_loaded=None, + plot_it=False, verbose=0): + ''' Derive wetted area of heat flux array by integrating the total power load + and dividing with a peak heat flux value. + The peak heat flux value is either: + 1) the maximum within each divertor finger (mode='finger') + 2) the maximum of a whole divertor module (mode='module') + 3) the maximum of the mean divertor averaged toroidally (mode='average'). + Mode average is default. In case the input heat flux has only 2 dimensions + (from one divertor), mode 'average' and 'module' result in the same. + Returned are the wetted area(s) and the corresponding q_max value(s). + + INPUT + ----- + heat_flux: numpy array + array of heat fluxes from THEODOR on the profiles defined + in the IR mapping; can be 2D (one divertor), or 3D (multiple divertor modules) + mapping: dictionary + IR profile mapping information as returned by + downloadversionIRdara.download_heatflux_mapping_reference(); + minimum necessary keys are 'finger_ID' and 's' + mode: str, optional + label to identify the normalization mode, either + 'module' (normalize by peak heat flux per torus module), + 'average' (normalize by peak heat flux in the toroidally mean heat flux pattern), + 'finger' (normalize by peak heat flux per finger in each torus module) + (OPTIONAL: default is 'average') + q_max: float or numpy array, optional + either single peak heat flux value or a peak heat flux for each + divertor module or each finger (depends on mode) + (OPTIONAL: default is None, i.e. derived based on mode) + profile_average_range: int, optional + number of central profiles on each finger to average the + integral heat flux on (this avoids hot leading edges and shadowed edges) + (OPTIONAL: default is 3 profiles) + ports_loaded: list or str or int, optinal + label of divertor modules provided in heat_flux array for plots; + int of port number for single divertor data and list of + port numbers for heat flux from multiple divertor modules; # + gets renamed if a mean heat flux pattern is used (mode 'average') + (OPTIONAL: default is None, i.e. label will be 'A_w') + plot_it: bool, optional + switch of whether to plot intermediate results or not + (OPTIONAL: deafult is NOT to plot) + verbose: integer, optional + feedback level (details of print messages) + (OPTIONAL: if not provided, only ERROR output) + RESULT + ------ + total_wetted_area: float or numpy array + wetted area in a shape that depends on the mode (see NOTES) + q_max: float or numpy array + peak heat flux used for normalizatin in a shape that depends on the mode (see NOTES) + NOTES + ----- + The shape of the results varies depending on the dimension of the input + * 2D: singel divertor modules heat flux + * 3D: heat flux from multiple divertor modules + and the mode to derive q_max ('module', 'average', 'finger'): + * '2D' + 'module' or 'average' --> one value for total_wetted_area and q_max + * '3D' + 'average' --> one value for total_wetted_area and q_max + * '3D' + 'module' --> 1D numpy arays with a value for each torus module (first dimension of heat_flux) + * '2D' + 'finger' --> 1D numpy arays with a value for each divertor finger + * '3D' + 'finger' --> 2D numpy arays with a value for each torus module and each divertor finger + ''' + + # prepare mapping and finger information + finger_dic = read_finger_info(verbose=verbose-1) + finger_ID = finger_dic['ID'] + profile_no = mapping['Finger_ID'][0] + + # find profile IDs of central profiles on each finger + central_profiles_on_finger = [] + is_central_profile = [] + for i_finger in range(len(finger_ID)): + n_profiles = finger_dic['n_profiles'][i_finger] + i_profile_start = n_profiles//2 - profile_average_range//2 -1 + central_profiles = i_finger*100 + np.arange(i_profile_start, i_profile_start+profile_average_range) + central_profiles_on_finger.append(central_profiles) + is_central_profile.append( np.logical_or.reduce([profile_no == centre_profile for centre_profile in central_profiles]) ) + central_profiles_on_finger = np.array(central_profiles_on_finger) + + heat_flux_dim = len(np.shape(heat_flux)) + # reduce dimension of heat_flux if in 'average' mode + if heat_flux_dim == 2 and mode == 'average': + mode = 'module' + elif heat_flux_dim == 3 and mode == 'average': + heat_flux = np.nanmean(heat_flux, axis=0) + heat_flux_dim = 2 + ports_loaded = 'mean heat flux' + + if heat_flux_dim==3: + # assume dimensions: toroidal index (camera ports), row, column + n_ports, n_rows, n_cols = np.shape(heat_flux) + if verbose>0: + print('derive_wetted_area: deriving wetted area on {0} divertor modules in {1} mode...'.format(n_ports, mode)) + # derive q_max for normalization of integral + if q_max is None: + # derive q_max on every finger + q_max_on_finger = [] + for i_finger in range(len(finger_ID)): + q_max_on_finger.append([np.nanmax(h[is_central_profile[i_finger]]) for h in heat_flux]) + q_max_on_finger = np.array(q_max_on_finger) + q_max_on_finger[q_max_on_finger==0] = 1 + if mode == 'module': + # one value per torus half module + q_max = np.nanmax(q_max_on_finger, axis=0) + elif mode == 'finger': + # one value per finger in each torus half module + q_max = q_max_on_finger + q_max[q_max==0] = 1 + # integrate over profiles + finger_wetted_area = np.zeros([len(finger_ID), n_ports]) + for i_finger in range(len(finger_ID)): + # initialize temporary line integral for each module + central_line_integral = np.zeros(n_ports) + # integrate over each central profile and average + for i_profile in central_profiles_on_finger[i_finger]: + ij_profile = np.where(profile_no==i_profile) + s = mapping['s'][ij_profile] + h = heat_flux[:,ij_profile[0],ij_profile[1]] + central_line_integral += np.nan_to_num( np.trapz(h, x=s, axis=1) ) + # complete averaging process + central_line_integral = central_line_integral / profile_average_range + # normalize by q_max and multiply with width of finger + if mode == 'module': + finger_wetted_area[i_finger,:] = central_line_integral / q_max * finger_dic['width'][i_finger] + elif mode == 'finger': + finger_wetted_area[i_finger,:] = central_line_integral / q_max[i_finger] * finger_dic['width'][i_finger] + + # get example profiles and wetted area widths at local maxima + i_finger_max = np.argmax(q_max_on_finger, axis=0) + h_max = [] + s_max = [] + width_max = [] + height_max = [] + for i in range(len(i_finger_max)): + central_profiles = central_profiles_on_finger[i_finger_max[i]] + h_profiles = [ heat_flux[i][profile_no == cp] for cp in central_profiles ] + i_max = np.argmax([np.sum(h) for h in h_profiles]) +# i_max = np.argsort([np.sum(h) for h in h_profiles])[profile_average_range//2] + h_max.append( h_profiles[ i_max ] ) + s_max.append( mapping['s'][profile_no == central_profiles[i_max]] ) + if mode == 'module': + width_max.append(np.nan_to_num(np.trapz(h_max[-1], x=s_max[-1]) / q_max[i])) + height_max.append(q_max[i]) + elif mode == 'finger': + width_max.append(np.nan_to_num(np.trapz(h_max[-1], x=s_max[-1]) / q_max[i_finger_max[i],i])) + height_max.append(q_max[i_finger_max[i],i]) + i_samples = [np.argmin(width_max), np.argsort(width_max)[len(width_max)//2], np.argmax(width_max)] + i_centre = np.argsort(width_max)[len(width_max)//2] + s_max = [s_max[np.argmin(width_max)], s_max[i_centre], s_max[np.argmax(width_max)]] + h_max = [h_max[np.argmin(width_max)], h_max[i_centre], h_max[np.argmax(width_max)]] + height_max = [height_max[np.argmin(width_max)], height_max[i_centre], height_max[np.argmax(width_max)]] + width_max = [width_max[np.argmin(width_max)], width_max[i_centre], width_max[np.argmax(width_max)]] + + elif heat_flux_dim==2: + # assume dimensions: row, column + if verbose>0: + print('derive_wetted_area: deriving wetted area on single divertor module in {0} mode...'.format(mode)) + # derive q_max for normalization of integral + if q_max is None: + if mode == 'average' or mode == 'module': + # one value + q_max = np.nanmax(heat_flux[np.logical_or.reduce(is_central_profile)]) + elif mode == 'finger': + # one value per finger + q_max = [] + for i_finger in range(len(finger_ID)): + q_max.append( np.nanmax(heat_flux[is_central_profile[i_finger]]) ) + q_max = np.array(q_max) + q_max[q_max==0] = 1 + # integrate over profiles + finger_wetted_area = np.zeros([len(finger_ID)]) + for i_finger in range(len(finger_ID)): + # integrate over each central profile and average + central_line_integral = 0 + for i_profile in central_profiles_on_finger[i_finger]: + ij_profile = np.where(profile_no==i_profile) + s = mapping['s'][ij_profile] + h = heat_flux[ij_profile[0],ij_profile[1]] + central_line_integral += np.nan_to_num( np.trapz(h, x=s, axis=0) ) + central_line_integral = central_line_integral / profile_average_range + if mode == 'average' or mode == 'module': + finger_wetted_area[i_finger] = central_line_integral / q_max * finger_dic['width'][i_finger] + elif mode == 'finger': + finger_wetted_area[i_finger] = central_line_integral / q_max[i_finger] * finger_dic['width'][i_finger] + + # get example profiles and wetted area widths at local maxima + i_samples = [np.nanargmin(finger_wetted_area), np.argsort(finger_wetted_area)[len(finger_wetted_area)//2], np.nanargmax(finger_wetted_area)] + h_max = [] + s_max = [] + width_max = [] + height_max = [] + for i in range(len(i_samples)): + central_profiles = central_profiles_on_finger[i_samples[i]] + h_profiles = [ heat_flux[profile_no == cp] for cp in central_profiles ] + i_max = np.argmax([np.sum(h) for h in h_profiles]) + h_max.append( h_profiles[ i_max ] ) + s_max.append( mapping['s'][profile_no == central_profiles[i_max]] ) + if mode == 'module' or mode == 'average': + width_max.append(np.nan_to_num(np.trapz(h_max[-1], x=s_max[-1]) / q_max)) + height_max.append(q_max) + elif mode == 'finger': + width_max.append(np.nan_to_num(np.trapz(h_max[-1], x=s_max[-1]) / q_max[i_samples[i]])) + height_max.append(q_max[i_samples[i]]) + + + # merge half-fingers of TM5 and TM6 + if np.any(finger_dic['finger_part']): + new_finger_ID = np.copy(finger_ID) + # scan backwards over fingers, merge and delete second finger halfs + for i_finger in finger_ID[:0:-1]: + if finger_dic['finger_part'][i_finger]: + new_finger_ID = np.delete(new_finger_ID, i_finger) + if heat_flux_dim==3 and mode != 'average': + finger_wetted_area[i_finger-1,:] = finger_wetted_area[i_finger-1,:] + finger_wetted_area[i_finger,:] + else: + finger_wetted_area[i_finger-1] = finger_wetted_area[i_finger-1] + finger_wetted_area[i_finger] + finger_wetted_area = np.delete(finger_wetted_area, i_finger, axis=0) + if mode == 'finger' and heat_flux_dim==3: + q_max[i_finger-1,:] = np.maximum(q_max[i_finger-1,:], q_max[i_finger,:]) + q_max = np.delete(q_max, i_finger, axis=0) + elif mode == 'finger' and heat_flux_dim==2: + q_max[i_finger-1] = np.maximum(q_max[i_finger-1], q_max[i_finger]) + q_max = np.delete(q_max, i_finger, axis=0) + + # sum up + # 'average' mode: sum all fingers over all torus modules --> wetted area of all divertors + # divide by n_ports --> get average wetted area per divertor + # 'module' mode: in each torus module sum over wetted area on all fingers + # --> individual wetted areas per divertor + # 'finger' mode: do not sum, since each finger was normalized with a differen q_max + # --> individual wetted areas per finger + # if only one divertors heat flux is given, proceed as in local mode + if mode == 'finger': + total_wetted_area = finger_wetted_area + else: + total_wetted_area = np.sum(finger_wetted_area, axis=0) + + # if requested, make some visalization + if plot_it: + if ports_loaded is None: + if heat_flux_dim==3: + ports_label = ['port index {0}'.format(i) for i in range(n_ports)] + elif heat_flux_dim==2: + ports_label = ['A_w'] + elif isinstance(ports_loaded, list) or isinstance(ports_loaded, np.ndarray): + ports_label = ['module {0} {1}'.format(int(port/10), ['L','U'][port%10]) for port in ports_loaded] + elif isinstance(ports_loaded, int) or isinstance(ports_loaded, np.int_): + ports_label = ['module {0} {1}'.format(int(int(ports_loaded)/10), ['L','U'][int(ports_loaded)%10])] + elif isinstance(ports_loaded, str): + ports_label = [ports_loaded] + + # wetted areas vs fingers + plt.figure() + if heat_flux_dim==3 and mode != 'average': + for i_port in range(n_ports): + plt.plot(new_finger_ID, finger_wetted_area[:,i_port]*1E4, label=ports_label[i_port]) + elif heat_flux_dim==3 and mode == 'average': + plt.plot(new_finger_ID, finger_wetted_area*1E4, label='mean heat flux') + else: + plt.plot(new_finger_ID, finger_wetted_area*1E4, label=ports_label[0]) + plt.title('normalized with q_max of {0}'.format(mode)) + plt.xlabel('finger no.') + plt.ylabel('wetted area [cm²]') + plt.legend() + plt.show() + + # wetted areas vs torus modules + if heat_flux_dim==3: + if mode == 'module': + i_ports = np.arange(n_ports) + plt.figure() + plt.plot(i_ports, total_wetted_area*1E2) + plt.xticks(i_ports, [port[-3:] for port in ports_label], rotation='vertical') + plt.xlabel('module') + plt.ylabel('wetted area [dm²]') + plt.tight_layout() + plt.show() + + # central finger profiles and the rectangle with the same integral + # (the width represented to contribution to the wetted area) + plt.figure() + if heat_flux_dim==3: + label_str = [ports_label[i] for i in i_samples] + if mode=='module': + plt.title('wetted area examples from fingers with max Int[q]\nintegrated on their respective divertor and normalized to a local q_max') + elif mode == 'average': + plt.title('wetted area examples from fingers with max Int[q]\nintegrated on the mean heat flux pattern and normalized to a global q_max') + elif mode == 'finger': + plt.title('wetted area examples from fingers with max Int[q]\nintegrated on their respective divertor and normalized to a finger q_max') + elif heat_flux_dim==2: + label_str = ['min(A_w)', 'median(A_w)', 'max(A_w)'] + if mode == 'finger': + plt.title('wetted area examples from fingers\nintegrated on their respective divertor and normalized to a finger q_max') + elif mode == 'module': + plt.title('wetted area examples from fingers\nintegrated on their respective divertor and normalized to a local q_max') + elif mode == 'average': + plt.title('wetted area examples from fingers\nintegrated on a mean heat flux pattern and normalized to a its q_max') + color_str = ['b', 'g', 'r'] + rect = [] + for i in range(len(i_samples)): + plt.plot(s_max[i], h_max[i]/1E3, label=label_str[i], + color=color_str[i]) + width = width_max[i] + height = height_max[i]/1E3 + start_point = (s_max[i][np.argmax(h_max[i])]-width/2,0) + rect.append(patches.Rectangle(start_point,width,height,linewidth=1, + edgecolor=color_str[i], + facecolor='none')) + plt.gca().add_patch(rect[-1]) + plt.xlabel('s [m]') + plt.ylabel('q [kW/m²]') + plt.legend() + plt.show() + + return total_wetted_area, q_max \ No newline at end of file diff --git a/data/finger_info_HHF.csv b/data/finger_info_HHF.csv new file mode 100644 index 0000000..e162956 --- /dev/null +++ b/data/finger_info_HHF.csv @@ -0,0 +1,140 @@ +# Finger widths of TDU;;;;; +# continuous ID of divertor fingers;ID of divertor section;target module number within horizontal or vertical target;number of profiles in standard mapping;width used for integration of averaged central profile;finger_part indicates if finger is the second part of the previous finger (in h_m) +# finger_ID;target;target element;n_profiles;width [m];finger_part +0;h_l;1;13;0.051072;0 +1;h_l;1;14;0.053565;0 +2;h_l;1;14;0.053565;0 +3;h_l;1;14;0.053565;0 +4;h_l;1;14;0.053565;0 +5;h_l;1;14;0.053565;0 +6;h_l;1;14;0.053565;0 +7;h_l;2;14;0.053565;0 +8;h_l;2;14;0.053565;0 +9;h_l;2;14;0.053565;0 +10;h_l;2;15;0.058047;0 +11;h_l;2;15;0.05794;0 +12;h_l;2;14;0.053565;0 +13;h_l;2;14;0.055486;0 +14;h_l;3;14;0.054198;0 +15;h_l;3;13;0.052192;0 +16;h_l;3;13;0.052192;0 +17;h_l;3;13;0.052192;0 +18;h_l;3;13;0.052192;0 +19;h_l;3;13;0.052192;0 +20;h_l;3;13;0.052192;0 +21;h_l;3;13;0.052192;0 +22;h_l;4;13;0.052192;0 +23;h_l;4;13;0.052192;0 +24;h_l;4;13;0.052192;0 +25;h_l;4;13;0.052192;0 +26;h_l;4;13;0.052192;0 +27;h_l;4;13;0.052192;0 +28;h_l;4;13;0.052192;0 +29;h_l;4;13;0.052192;0 +30;h_m;5;14;0.054328;0 +31;h_m;5;15;0.054328;1 +32;h_m;5;14;0.054328;0 +33;h_m;5;15;0.054328;1 +34;h_m;5;14;0.054152;0 +35;h_m;5;15;0.054152;1 +36;h_m;5;14;0.054152;0 +37;h_m;5;15;0.054152;1 +38;h_m;5;14;0.05408;0 +39;h_m;5;15;0.05408;1 +40;h_m;5;14;0.054134;0 +41;h_m;5;15;0.054134;1 +42;h_m;5;14;0.054134;0 +43;h_m;5;15;0.054134;1 +44;h_m;5;14;0.054134;0 +45;h_m;5;15;0.054134;1 +46;h_m;5;14;0.054134;0 +47;h_m;5;15;0.054134;1 +48;h_m;5;14;0.054134;0 +49;h_m;5;15;0.054134;1 +50;h_m;5;14;0.054134;0 +51;h_m;5;15;0.054134;1 +52;h_m;5;14;0.054134;0 +53;h_m;5;15;0.054134;1 +54;h_m;6;14;0.053823;0 +55;h_m;6;15;0.053823;1 +56;h_m;6;14;0.053823;0 +57;h_m;6;15;0.053823;1 +58;h_m;6;14;0.053823;0 +59;h_m;6;15;0.053823;1 +60;h_m;6;14;0.053823;0 +61;h_m;6;15;0.053823;1 +62;h_m;6;14;0.053823;0 +63;h_m;6;15;0.053823;1 +64;h_m;6;14;0.05406;0 +65;h_m;6;15;0.05406;1 +66;h_m;6;14;0.05406;0 +67;h_m;6;15;0.05406;1 +68;h_m;6;14;0.05406;0 +69;h_m;6;15;0.05406;1 +70;h_m;6;14;0.05406;0 +71;h_m;6;15;0.05406;1 +72;h_m;6;14;0.05406;0 +73;h_m;6;15;0.05406;1 +74;h_m;6;14;0.05406;0 +75;h_m;6;15;0.05406;1 +76;h_m;6;14;0.05406;0 +77;h_m;6;15;0.05406;1 +78;h_h;7;15;0.056351;0 +79;h_h;7;14;0.052463;0 +80;h_h;7;14;0.052463;0 +81;h_h;7;14;0.052463;0 +82;h_h;7;14;0.052463;0 +83;h_h;7;15;0.054963;0 +84;h_h;8;16;0.057662;0 +85;h_h;8;15;0.055162;0 +86;h_h;8;15;0.055162;0 +87;h_h;8;15;0.055162;0 +88;h_h;8;15;0.055162;0 +89;h_h;8;15;0.055162;0 +90;h_h;8;15;0.055162;0 +91;h_h;8;15;0.055162;0 +92;h_h;8;15;0.055162;0 +93;h_h;8;15;0.055162;0 +94;h_h;8;15;0.055162;0 +95;h_h;8;15;0.055162;0 +96;h_h;9;15;0.055162;0 +97;h_h;9;15;0.055162;0 +98;h_h;9;15;0.055162;0 +99;h_h;9;15;0.055162;0 +100;h_h;9;15;0.055162;0 +101;h_h;9;15;0.055162;0 +102;h_h;9;15;0.055162;0 +103;h_h;9;15;0.055162;0 +104;h_h;9;15;0.055162;0 +105;h_h;9;15;0.055162;0 +106;h_h;9;15;0.055162;0 +107;h_h;9;15;0.055162;0 +108;v;1;15;0.054426;0 +109;v;1;15;0.054426;0 +110;v;1;15;0.054426;0 +111;v;1;15;0.054426;0 +112;v;1;15;0.054426;0 +113;v;1;15;0.054426;0 +114;v;1;15;0.054426;0 +115;v;1;15;0.054426;0 +116;v;1;15;0.054426;0 +117;v;1;15;0.054426;0 +118;v;2;15;0.054426;0 +119;v;2;15;0.054426;0 +120;v;2;15;0.054426;0 +121;v;2;15;0.054426;0 +122;v;2;15;0.054426;0 +123;v;2;15;0.054426;0 +124;v;2;15;0.054426;0 +125;v;2;15;0.054426;0 +126;v;2;15;0.054426;0 +127;v;2;15;0.054426;0 +128;v;3;15;0.054426;0 +129;v;3;15;0.054426;0 +130;v;3;15;0.054426;0 +131;v;3;15;0.054426;0 +132;v;3;15;0.054426;0 +133;v;3;15;0.054426;0 +134;v;3;15;0.054426;0 +135;v;3;15;0.054426;0 +136;v;3;15;0.054426;0 diff --git a/data/finger_info_TDU.csv b/data/finger_info_TDU.csv new file mode 100644 index 0000000..e162956 --- /dev/null +++ b/data/finger_info_TDU.csv @@ -0,0 +1,140 @@ +# Finger widths of TDU;;;;; +# continuous ID of divertor fingers;ID of divertor section;target module number within horizontal or vertical target;number of profiles in standard mapping;width used for integration of averaged central profile;finger_part indicates if finger is the second part of the previous finger (in h_m) +# finger_ID;target;target element;n_profiles;width [m];finger_part +0;h_l;1;13;0.051072;0 +1;h_l;1;14;0.053565;0 +2;h_l;1;14;0.053565;0 +3;h_l;1;14;0.053565;0 +4;h_l;1;14;0.053565;0 +5;h_l;1;14;0.053565;0 +6;h_l;1;14;0.053565;0 +7;h_l;2;14;0.053565;0 +8;h_l;2;14;0.053565;0 +9;h_l;2;14;0.053565;0 +10;h_l;2;15;0.058047;0 +11;h_l;2;15;0.05794;0 +12;h_l;2;14;0.053565;0 +13;h_l;2;14;0.055486;0 +14;h_l;3;14;0.054198;0 +15;h_l;3;13;0.052192;0 +16;h_l;3;13;0.052192;0 +17;h_l;3;13;0.052192;0 +18;h_l;3;13;0.052192;0 +19;h_l;3;13;0.052192;0 +20;h_l;3;13;0.052192;0 +21;h_l;3;13;0.052192;0 +22;h_l;4;13;0.052192;0 +23;h_l;4;13;0.052192;0 +24;h_l;4;13;0.052192;0 +25;h_l;4;13;0.052192;0 +26;h_l;4;13;0.052192;0 +27;h_l;4;13;0.052192;0 +28;h_l;4;13;0.052192;0 +29;h_l;4;13;0.052192;0 +30;h_m;5;14;0.054328;0 +31;h_m;5;15;0.054328;1 +32;h_m;5;14;0.054328;0 +33;h_m;5;15;0.054328;1 +34;h_m;5;14;0.054152;0 +35;h_m;5;15;0.054152;1 +36;h_m;5;14;0.054152;0 +37;h_m;5;15;0.054152;1 +38;h_m;5;14;0.05408;0 +39;h_m;5;15;0.05408;1 +40;h_m;5;14;0.054134;0 +41;h_m;5;15;0.054134;1 +42;h_m;5;14;0.054134;0 +43;h_m;5;15;0.054134;1 +44;h_m;5;14;0.054134;0 +45;h_m;5;15;0.054134;1 +46;h_m;5;14;0.054134;0 +47;h_m;5;15;0.054134;1 +48;h_m;5;14;0.054134;0 +49;h_m;5;15;0.054134;1 +50;h_m;5;14;0.054134;0 +51;h_m;5;15;0.054134;1 +52;h_m;5;14;0.054134;0 +53;h_m;5;15;0.054134;1 +54;h_m;6;14;0.053823;0 +55;h_m;6;15;0.053823;1 +56;h_m;6;14;0.053823;0 +57;h_m;6;15;0.053823;1 +58;h_m;6;14;0.053823;0 +59;h_m;6;15;0.053823;1 +60;h_m;6;14;0.053823;0 +61;h_m;6;15;0.053823;1 +62;h_m;6;14;0.053823;0 +63;h_m;6;15;0.053823;1 +64;h_m;6;14;0.05406;0 +65;h_m;6;15;0.05406;1 +66;h_m;6;14;0.05406;0 +67;h_m;6;15;0.05406;1 +68;h_m;6;14;0.05406;0 +69;h_m;6;15;0.05406;1 +70;h_m;6;14;0.05406;0 +71;h_m;6;15;0.05406;1 +72;h_m;6;14;0.05406;0 +73;h_m;6;15;0.05406;1 +74;h_m;6;14;0.05406;0 +75;h_m;6;15;0.05406;1 +76;h_m;6;14;0.05406;0 +77;h_m;6;15;0.05406;1 +78;h_h;7;15;0.056351;0 +79;h_h;7;14;0.052463;0 +80;h_h;7;14;0.052463;0 +81;h_h;7;14;0.052463;0 +82;h_h;7;14;0.052463;0 +83;h_h;7;15;0.054963;0 +84;h_h;8;16;0.057662;0 +85;h_h;8;15;0.055162;0 +86;h_h;8;15;0.055162;0 +87;h_h;8;15;0.055162;0 +88;h_h;8;15;0.055162;0 +89;h_h;8;15;0.055162;0 +90;h_h;8;15;0.055162;0 +91;h_h;8;15;0.055162;0 +92;h_h;8;15;0.055162;0 +93;h_h;8;15;0.055162;0 +94;h_h;8;15;0.055162;0 +95;h_h;8;15;0.055162;0 +96;h_h;9;15;0.055162;0 +97;h_h;9;15;0.055162;0 +98;h_h;9;15;0.055162;0 +99;h_h;9;15;0.055162;0 +100;h_h;9;15;0.055162;0 +101;h_h;9;15;0.055162;0 +102;h_h;9;15;0.055162;0 +103;h_h;9;15;0.055162;0 +104;h_h;9;15;0.055162;0 +105;h_h;9;15;0.055162;0 +106;h_h;9;15;0.055162;0 +107;h_h;9;15;0.055162;0 +108;v;1;15;0.054426;0 +109;v;1;15;0.054426;0 +110;v;1;15;0.054426;0 +111;v;1;15;0.054426;0 +112;v;1;15;0.054426;0 +113;v;1;15;0.054426;0 +114;v;1;15;0.054426;0 +115;v;1;15;0.054426;0 +116;v;1;15;0.054426;0 +117;v;1;15;0.054426;0 +118;v;2;15;0.054426;0 +119;v;2;15;0.054426;0 +120;v;2;15;0.054426;0 +121;v;2;15;0.054426;0 +122;v;2;15;0.054426;0 +123;v;2;15;0.054426;0 +124;v;2;15;0.054426;0 +125;v;2;15;0.054426;0 +126;v;2;15;0.054426;0 +127;v;2;15;0.054426;0 +128;v;3;15;0.054426;0 +129;v;3;15;0.054426;0 +130;v;3;15;0.054426;0 +131;v;3;15;0.054426;0 +132;v;3;15;0.054426;0 +133;v;3;15;0.054426;0 +134;v;3;15;0.054426;0 +135;v;3;15;0.054426;0 +136;v;3;15;0.054426;0 diff --git a/downloadversionIRdata.py b/downloadversionIRdata.py index 3a169a9..b91f57c 100644 --- a/downloadversionIRdata.py +++ b/downloadversionIRdata.py @@ -2931,7 +2931,7 @@ def get_heatflux_profile(port,profile,finger=None,timepoint=1,program=None,tstar """ ### checking whether input is valid and whether the download can be started if program==None and tstart==None: - raise Exception("get_heatflux_profile: No Program given, please specify the program you are want heatflux from") + raise Exception("get_heatflux_profile: No Program given, please specify the program you want heatflux from") else: ### some informations about the program are given, is the timepoint given in a usefull way? if timepoint==None or (type(timepoint)!=int and type(timepoint)!=float): @@ -2991,8 +2991,9 @@ def get_heatflux_profile(port,profile,finger=None,timepoint=1,program=None,tstar else: ### if the program goes up to here, time okay, finger okay,port okay, lets download it exist,timo,frames=download_heatflux_by_times(port,tstart,tend,time_window=0,threads=1,testmode=False,version=version,verbose=verbose-1) - if exist: - return extract_heatflux_profile_from_DL(time=(np.asarray(timo)-t1)/1e9,images=frames,profile=int(fingerID%100),finger=int(fingerID/100),inputchecked=inputcheck,verbose=verbose-1) + if exist: + result = extract_heatflux_profile_from_DL(time=(np.asarray(timo)-t1)/1e9,images=frames,profile=int(fingerID%100),finger=int(fingerID/100),time_window=None,inputchecked=inputcheck,verbose=verbose-1) + return result else: if verbose>0: print("get_heatflux_profile: heatflux data could not be downloaded") @@ -3043,7 +3044,7 @@ def extract_heatflux_profile_from_DL(time,images,profile,finger=None,time_window else: fingerID=finger*100+profile ### okay finderID is fine, data is given, lets get the mapping - exist,mapping=download_heatflux_mapping_reference(testmode=testmode) + exist,mapping=download_heatflux_mapping_reference(testmode=testmode, verbose=verbose-1) if exist: Fingermap=np.asarray(mapping['Finger_ID'][0],dtype=np.int) locs=np.where(Fingermap==fingerID) @@ -3246,6 +3247,8 @@ def download_divertor_load(port,targetmodule=None,program=None,tstart=None,tend= return exist,time,load,error def download_scene_model(port,program=None,timepoint=None,version=0,verbose=0): + """ + """ if type(port)==int or type(port)==float: portnam="AEF"+str(port) elif type(port)==str: @@ -3291,7 +3294,7 @@ def download_scene_model(port,program=None,timepoint=None,version=0,verbose=0): "x": channels[8], "y": channels[9], "z": channels[10] - } + } return exist,scene_model else: return False,[0] @@ -3441,22 +3444,22 @@ if __name__=='__main__': print("local function calling") #%% temperature download and plotting example - port=50#"AEF50"#"AEF51" - prog='20170927.020'#"20181011.036"#"20181016.037"#"20180920.042"#"20171109.021"#"20181010.036" - status,time,images,valid=get_temp_from_raw_by_program(port,prog,time_window=[0,4],emi=0.80,T_version=2,version=0,threads=4,give_ERROR=False,use_firstframe_as_background=False,verbose=5) -# status2,time2,images2=download_raw_images_by_program(port,prog,time_window=0.02,verbose=5) -# bla=get_calib_data(50,program=prog,verbose=5) -# success,t,s,profile=extract_temperature_profile_from_DL(port,np.asarray(time-time[0])/1e9,images,profile="TM3h_5_5",verbose=10,reference_time=time[0]) - if status: - plt.figure() - plt.imshow(images[0],vmin=330,vmax=1000,cmap=exJet) - cb=plt.colorbar() - cb.set_label("temperature in K",rotation=270,labelpad=20,fontsize=20) - cb.ax.tick_params(labelsize=20) +# port=50#"AEF50"#"AEF51" +# prog='20170927.020'#"20181011.036"#"20181016.037"#"20180920.042"#"20171109.021"#"20181010.036" +# status,time,images,valid=get_temp_from_raw_by_program(port,prog,time_window=[0,4],emi=0.80,T_version=2,version=0,threads=4,give_ERROR=False,use_firstframe_as_background=False,verbose=5) +## status2,time2,images2=download_raw_images_by_program(port,prog,time_window=0.02,verbose=5) +## bla=get_calib_data(50,program=prog,verbose=5) +## success,t,s,profile=extract_temperature_profile_from_DL(port,np.asarray(time-time[0])/1e9,images,profile="TM3h_5_5",verbose=10,reference_time=time[0]) +# if status: +# plt.figure() +# plt.imshow(images[0],vmin=330,vmax=1000,cmap=exJet) +# cb=plt.colorbar() +# cb.set_label("temperature in K",rotation=270,labelpad=20,fontsize=20) +# cb.ax.tick_params(labelsize=20) #%% heatflux test -# port=10 -# prog="20180904.015" -# + port=10 + prog="20180904.015" + # for prog in ["20180823.016","20180918.045","20181016.037","20181009.024","20181016.016"]:#"20171207.024","20180814.024","20181016.016","20181010.036"]: # for port in [10,11,20,21,30,31,40,41,50,51]: # status,time,images=download_heatflux_by_program(port,prog,time_window=4,threads=4,version=2,verbose=3,givealpha=False,request=True) @@ -3467,8 +3470,9 @@ if __name__=='__main__': # print(prog,port,"missing") # plt.figure(),plt.imshow(images[0],vmin=0) # plt.figure(),plt.imshow(images[50],vmin=0) -# status,mapping=download_heatflux_mapping_reference(verbose=4) -# test=get_heatflux_profile(20,1605,timepoint=1,program="20171109.008",verbose=4) + status,mapping=download_heatflux_mapping_reference(verbose=4) + test=get_heatflux_profile(20,1605,timepoint=1,program="20171109.008",verbose=4) + #%% loads test # port=21 # prog="20171114.052" -- GitLab