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