diff --git a/CHANGELOG b/CHANGELOG
index ad866953ecbe4a7494ab9617b75be625b0d26a7b..f6e346cea7556fe4bc4e5dd4c5ab0932d66b3b8a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,9 +1,45 @@
 <<<<<<< HEAD
-26.03.2019: Upadte to V3.2.0:
+08.02.2020: Update to V3.4.0
+	- Bugfix: download_images_by_times produzierte doppelte Werte im Zeit und Bildvektor
+	- 
+	Update to V3.3.3:
+	- 
+	Update to V3.3.2:
+	-
+	Update to V3.3.1:
+	-
+	Update to V3.3.0:
+	- 
+	Update to V3.2.5:
+	
+	Update to V3.2.4:
+	
+	Update to V3.2.3:
+	- bugfix: finding right version for meta informations
+	Update to V3.2.2:
+	- bugfix: fix of paths due to movement of data from Test Archive to ArchiveDB; range overflow fix for calibration
+	- fix: timeout, closing of connections
+	- changes: modification of download_heatflux_mapping_reference():
+		- The points of the vertical target in 'X' and 'Y' get now shifted and rotated to appear on top of the horizontal target in order to avaoid overlap when plotting.
+		- Added new boolean peremter 'get_thickness=False' triggers optional calculation of distance of profile points to adjacent profiles. This is used to derive a thickness of the profile at each point for integration of heat loads.
+	- changes: systematically used named parameter instead of positional
+	- changes: removed unecessary trigger call 
+	- changes: made get_calib() flexible for program/t0/t1 input
+	- changes: fixes and improvements with portnr, T_version
+	- changes: testmode=False is now default
+	Update to V3.2.1:
+	- bugfixes: (1) load request, (2) AEF50 data got nuced with 0, fixed 
+26.03.2019: Update to V3.2.0:
 	- scne model download possible
 	- scene model reference download possible for heat flux data
 	- downsampled temperature image stream possible
 	- extration of temperature profiles possible
+	Update V3.1.2:
+	- bugfix: versioning and smaller bugs
+	Update V3.1.1:
+	- bugfix: path building, versioning of raw data
+22.01.2019: Update to V3.1.0:
+	- Integrated load added as download function and new Data in ArchiveDB
 27/28/29.11.2018: update to V3
 	- add file upload_heatflux.py
 	- add plot_heatflux_example.py
@@ -48,6 +84,8 @@ bugfixes in downloadversionIRdata:
     - fixed: wrong time intervall for TC divertor data
 
 Versions:
+V3.4.0: chaching functionality included, request for all cameras included + Bugfixes
+V3.3.0: code-cleaning, unification of variable names, new functions: get_trigger_from_PID, 
 V3.2.0: download of scene models possible, temperature profiles can be extracted, downsampled temperature images available
 V3.1.0: add of divertor loads in the upload and the download
 V3.0.2: change the upload of heat flux from float64 to float32. extract profile accepts now also timewindows.
diff --git a/downloadversionIRdata.py b/downloadversionIRdata.py
index cd3d940a3b58c209cf28b4b54e2363662ede6cc2..2938d1a1235a22b7d5e1771893870ff15b2c77f1 100644
--- a/downloadversionIRdata.py
+++ b/downloadversionIRdata.py
@@ -4,7 +4,7 @@ Created on Wed Oct 25 15:51:46 2017
 updated on Tue Aug 21 10:20:00 2018
 last update on Fr Nov 23 15:37:00 2018
 
-Version: 3.3.3
+Version: 3.4.0
 (Numbering: #of big changes(OP1.2a download V1, OP1.2b download V2, heatflux V3)
             .
             #of updates to add functionalities
@@ -12,6 +12,7 @@ Version: 3.3.3
             #number of updates for bug fixes )
 @author: holn
 """
+version="V3.4.0"
 
 import numpy as np
 import IR_image_tools as IR_tools
@@ -299,6 +300,9 @@ def download_NUC_by_times(port, starttime, stoptime, exposure, testmode=False, v
 
 def get_NUC_by_program(port, program, exposure, version=0, testmode=False, verbose=0):
     '''
+    Loads NUC elements (gain, offset cold image, bad pixels) for an IR camera
+    in a given port and time interval. Depending on time and camera, reconstruct
+    the cold frame and/or compute the gain, offset from the hot and cold frame.
     '''
 #    prog=get_program_from_PID(program)
 #    try:
@@ -374,14 +378,19 @@ def get_NUC_by_times(port, starttime, stoptime, t_exp, version=0, testmode=False
             gain, offset = IR_tools.calculate_gain_offset_image(ci, None, coldref, hotref, verbose=verbose-1)
             gain[gain == np.inf] = 0
             offset[offset == np.inf] = 0
-            badpixels = find_badpixels(port, gain, offset, niterations=10, tolerance=10, verbose=verbose-1)             
+            badpixels = find_badpixels(port, gain, offset, niterations=10, tolerance=10, verbose=verbose-1)
             gain_error = 0
             offset_error = 0
             return True, [gain, offset, ci, badpixels, gain_error, offset_error], ['gain', 'offset', 'cold', 'badpixels', 'gain_error', 'offset_error']
         else:
             if verbose > 0:
                 print('get_NUC_by_times: downloading NUC')
-            return download_NUC_by_times(port, starttime, stoptime, t_exp, testmode=testmode)
+            NUC_DL = download_NUC_by_times(port, starttime, stoptime, t_exp, testmode=testmode)
+            #True, images, ['gain', 'offset', 'cold', 'badpixels', 'gain_error', 'offset_error']
+            if NUC_DL[0]:
+                badpixels = find_badpixels(port,NUC_DL[1][0],NUC_DL[1][1],niterations=10, tolerance=10, verbose=verbose-1)
+                NUC_DL[1][3]=badpixels
+            return NUC_DL
     elif OP == "OP1.2b":
         gain_error = 0
         offset_error = 0
@@ -580,20 +589,20 @@ def download_background_by_times(port, starttime, stoptime, exposure, camera_fil
         except Exception as e:
             print('download_background_by_times: Error! ', e)
             goon = False
-        if goon: 
+        if goon:
             n = 0
             backtimes = [0]
             for backpar in signal_list['values']:
                 if backpar['structure']['Texp'] == exposure:
                     if port == 50:# camera=="INFRATEC" or camera=="infratec" or camera=="Infratec":
                         if backpar['structure']['filter'] == camera_filter:
-                            backtimes=[signal_list['dimensions'][2*n], signal_list['dimensions'][2*n+1]]                             
+                            backtimes = [signal_list['dimensions'][2*n], signal_list['dimensions'][2*n+1]]
                     else:
-                        backtimes=[signal_list['dimensions'][2*n], signal_list['dimensions'][2*n+1]]                             
+                        backtimes = [signal_list['dimensions'][2*n], signal_list['dimensions'][2*n+1]]
                 n += 1
             if backtimes[0] != 0:
                 backdat = read_restdb(larchivepath+"DATASTREAM/V"+str(version)+"/_signal.json?from="+str(backtimes[0]-10)+"&upto="+str(backtimes[1]+10))
-                if backdat[0]:                                    
+                if backdat[0]:
                     return backdat#[True, backdat[2]]
                 else:
                     print("download_background_by_times: Error! background image for requested exposure time(, filter) not found")
@@ -604,7 +613,7 @@ def download_background_by_times(port, starttime, stoptime, exposure, camera_fil
         else:
             return False, 0, 0
     elif OP == "OP1.2b":
-        NUC_DL  =get_NUC_by_times(port, starttime, stoptime, t_exp=exposure, version=version, testmode=testmode, verbose=verbose-1)#download_NUC_by_times(port, t0, t1, t_exp, version)
+        NUC_DL = get_NUC_by_times(port, starttime, stoptime, t_exp=exposure, version=version, testmode=testmode, verbose=verbose-1)#download_NUC_by_times(port, t0, t1, t_exp, version)
         if NUC_DL[0] == False:
             raise Warning("download_background_by_times: NUC was not found")
 #            return False, 0, 0
@@ -617,38 +626,38 @@ def download_background_by_times(port, starttime, stoptime, exposure, camera_fil
             # check quality of NUC elements
             gain[np.isnan(gain)] = 0
             offset[np.isnan(offset)] = 0
-            offset[offset<-1e100] = 0
+            offset[offset < -1e100] = 0
             return get_NUCed_background_by_times(port=port, t0=starttime, t1=stoptime, t_exp=exposure, cfilter=camera_filter, gain=gain, offset=offset, version=version, verbose=verbose-1)
 
 def get_NUCed_background_by_times(port, t0, t1, t_exp, cfilter, gain, offset, version=0, testmode=False, plot_it=False, verbose=0):
     """
     OP1.2b function
     """
-    exist, btime, backgroundframes=download_calibration_raw_files_by_time(port, t_exp, t0, t1, frametype=1, version=version, testmode=testmode, verbose=verbose-1)
-    camera = portcamdict["OP1.2b"]["AEF"+str(port)]  
+    exist, btime, backgroundframes = download_calibration_raw_files_by_time(port, t_exp, t0, t1, frametype=1, version=version, testmode=testmode, verbose=verbose-1)
+    camera = portcamdict["OP1.2b"]["AEF"+str(port)]
     if verbose > 50:
         print("camera is", camera)
-    background=np.zeros(np.shape(backgroundframes[0]),dtype=np.uint64)
+    background = np.zeros(np.shape(backgroundframes[0]), dtype=np.uint64)
     for frame in backgroundframes:
         background += frame
-    background = np.asarray(background/len(backgroundframes),dtype=np.uint16)
+    background = np.asarray(background/len(backgroundframes), dtype=np.uint16)
     if plot_it:
         plt.figure()
         plt.imshow(background, vmin=np.median(background)-500, vmax=np.median(background)+500)
         plt.title("background image unnuced")
     if not camera.split("_")[0] == "Infratec":
-        background=apply_NUC([background], gain, offset)[0]
-    if plot_it:        
+        background = apply_NUC([background], gain, offset)[0]
+    if plot_it:
         plt.figure()
         plt.imshow(background, vmin=np.median(background)-500, vmax=np.median(background)+500)
         plt.title("background image nuced")
     return exist, btime[0], background
 
 
-def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0, 
+def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0,
                                    testmode=False, plot_it=False, verbose=0):
-    """ 
-       Load the raw cold refences frame taken bofore this program and NUC it with 
+    """
+       Load the raw cold refences frame taken bofore this program and NUC it with
        the NUC of the previous program (or next one, if the previous does not exist).
 
        INPUT
@@ -670,7 +679,7 @@ def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0,
            verbose: integer, optional
                feedback level (details of print messages)
                (OPTIONAL: if not provided, only ERROR output)
-              
+
        RESULT
        ------
            exist: bool
@@ -685,7 +694,7 @@ def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0,
         except:
             print('get_NUCed_coldframe_by_program: ERROR! no exposure time found!')
             return False, []
-            
+
         t_exp = exposure[0]
     else:
         t_exp = exposure
@@ -697,29 +706,29 @@ def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0,
     except:
         print('get_NUCed_coldframe_by_program: ERROR! no cold frame found!')
         return False, []
-    
+
     if exist:
         cold_raw = data[2]
         porg_nr = int(program.split('.')[1])
-        
+
         ref_program = '{0}.{1:03d}'.format(program.split('.')[0], porg_nr-1)
         exist2, data, desc = get_NUC_by_program(port, ref_program, t_exp, version=version, testmode=testmode, verbose=verbose-1)
         if exist2:
-            coldframe = apply_NUC([cold_raw],data[0],data[1])[0]
+            coldframe = apply_NUC([cold_raw], data[0], data[1])[0]
             if verbose > 0:
                 print('get_NUCed_coldframe_by_program: using NUC of program {0}'.format(ref_program))
         else:
             print('get_NUCed_coldframe_by_program: WARNING! no adjacent program found! --> cold frame is not NUCed')
             coldframe = cold_raw
-        
+
         if plot_it:
-            plt.figure(figsize=[8,4])
-            plt.subplot(1,2,1)
-            plt.imshow(cold_raw, vmin=np.percentile(cold_raw, 1), vmax=np.percentile(cold_raw, 99) )
+            plt.figure(figsize=[8, 4])
+            plt.subplot(1, 2, 1)
+            plt.imshow(cold_raw, vmin=np.percentile(cold_raw, 1), vmax=np.percentile(cold_raw, 99))
             plt.colorbar()
             plt.title('averaged raw\nof {0}'.format(program))
-            plt.subplot(1,2,2)
-            plt.imshow(coldframe, vmin=np.percentile(coldframe, 1), vmax=np.percentile(coldframe, 99) )
+            plt.subplot(1, 2, 2)
+            plt.imshow(coldframe, vmin=np.percentile(coldframe, 1), vmax=np.percentile(coldframe, 99))
             plt.colorbar()
             plt.title('NUCed based on\ngain/offset from {0}'.format(ref_program))
             plt.suptitle('cold frame of port {0}'.format(port))
@@ -728,7 +737,7 @@ def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0,
     else:
         print('get_NUCed_coldframe_by_program: ERROR! No cold frame found for program {0}!'.format(program))
         coldframe = []
-    
+
     return exist, coldframe
 
 
@@ -744,16 +753,16 @@ def download_raw_images_by_program(port, program, time_window=0, version=0, test
 #        starttime=prog[0]['trigger']['1'][0]
 #        stoptime=prog[0]['trigger']['6'][0]
     if exist:
-        if type(time_window)==list or type(time_window)==np.ndarray:
-            if len(time_window)>2 or time_window[0]>1000:
+        if type(time_window) == list or type(time_window) == np.ndarray:
+            if len(time_window) > 2 or time_window[0] > 1000:
                 raise Exception("download_raw_images_by_program: invalid input for the time_window!")
-            tstart=time_window[0]
-            tstop=time_window[1]
-            if tstop<tstart:
+            tstart = time_window[0]
+            tstop = time_window[1]
+            if tstop  <tstart:
                 raise Exception("download_raw_images_by_program: t_stop before t_start")
             return download_raw_images_by_times(port, int(starttime+tstart*1e9), int(starttime+tstop*1e9), version, testmode=testmode, verbose=verbose)
         else:
-            if time_window==0:
+            if time_window == 0:
                 return download_raw_images_by_times(port, starttime, stoptime, version, testmode=testmode, verbose=verbose)
             else:
                 return download_raw_images_by_times(port, starttime, int(starttime+time_window*1e9), version, testmode=testmode, verbose=verbose)
@@ -764,23 +773,23 @@ def download_raw_images_by_program(port, program, time_window=0, version=0, test
 def download_raw_images_by_times(port, starttime, stoptime, version=0, intervalSize=1E9, testmode=False, verbose=0):
     """
     """
-    OP = IR_tools.get_OP_by_time(time_ns=starttime)    
+    OP = IR_tools.get_OP_by_time(time_ns=starttime)
     if version == 0:
         version = get_latest_version(portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM", t_from=starttime, t_to=stoptime, testmode=testmode)
     if testmode:
-        larchivepath = testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"  
+        larchivepath = testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
     else:
-        larchivepath = archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"  
-    return download_images_by_times(larchivepath, starttime=starttime, stoptime=stoptime, intervalSize=intervalSize, verbose=verbose)#version=version, 
-    
-def download_images_by_times(larchivepath, starttime, stoptime, intervalSize=1E9, verbose=0):#version=0, 
+        larchivepath = archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
+    return download_images_by_times(larchivepath, starttime=starttime, stoptime=stoptime, intervalSize=intervalSize, verbose=verbose)#version=version,
+
+def download_images_by_times(larchivepath, starttime, stoptime, intervalSize=1E9, verbose=0):#version=0,
     """
     """
     if '_raw' in larchivepath:
-        typo = np.uint16          
+        typo = np.uint16
     else:
         typo = np.float32
-    if (stoptime-starttime)/intervalSize>1:        
+    if (stoptime-starttime)/intervalSize > 1:
         nrinterv = int(np.ceil((stoptime-starttime)/intervalSize))
         if verbose > 0:
             print("download_images_by_times: time_window to large, splitting {0}s interval into {1} smaller fractions".format((stoptime-starttime)/1e9, nrinterv))
@@ -798,7 +807,7 @@ def download_images_by_times(larchivepath, starttime, stoptime, intervalSize=1E9
                     print("download_images_by_times: reading from\n   {0}".format(url))
                 res = urllib.request.urlopen(url)
                 signal_list = json.loads(res.read().decode('utf-8'))
-                res.close()                
+                res.close()
                 images = [np.array(ele, dtype=typo) for ele in signal_list['values']]
 #                signal=np.array(signal_list['values'],dtype=np.uint16)
                 t = np.array(signal_list['dimensions'])
@@ -807,20 +816,20 @@ def download_images_by_times(larchivepath, starttime, stoptime, intervalSize=1E9
                     allimages = images.copy()
                     time = t
                 else:
-                    allimages = allimages+images#np.append(ressignal, signal,axis=0)
-                    time = np.append(time, t)
+                    allimages = allimages+images[1:]#np.append(ressignal, signal,axis=0)
+                    time = np.append(time, t[1:])
                 del images, t
                 success = True
             except urllib.error.URLError as e:
-                print('download_images_by_times: Error in sub-interval {0}! {1}'.format(i, e))                
+                print('download_images_by_times: Error in sub-interval {0}! {1}'.format(i, e))
             except Exception as e:
-                print('download_images_by_times: Error in sub-interval {0}! {1}'.format(i, e))   
-        return success, time,allimages
+                print('download_images_by_times: Error in sub-interval {0}! {1}'.format(i, e))
+        return success, time, allimages
     else:
         try:
             if verbose > 100:
                 print(larchivepath+"/_signal.json?from="+str(starttime-10)+"&upto="+str(stoptime))
-            res = urllib.request.urlopen(larchivepath+"/_signal.json?from="+str(starttime-10)+"&upto="+str(stoptime))            
+            res = urllib.request.urlopen(larchivepath+"/_signal.json?from="+str(starttime-10)+"&upto="+str(stoptime))
             signal_list = json.loads(res.read().decode('utf-8'))
             res.close()
             images = [np.array(ele, dtype=typo) for ele in signal_list['values']]
@@ -830,10 +839,10 @@ def download_images_by_times(larchivepath, starttime, stoptime, intervalSize=1E9
             return True, t, images
         except urllib.error.URLError as e:
             print('download_images_by_times: Error! ', e)
-            return False, 0,-1
+            return False, 0, -1
         except Exception as e:
             print('download_images_by_times: Error! ', e)
-            return False, 0,-1
+            return False, 0, -1
 
 if fastDL:
     def download_raw_images_by_program_via_png(port, program, time_window=0, version=0,
@@ -849,12 +858,12 @@ if fastDL:
 #            return False, [0], [0]
 #        starttime=prog[1]['trigger']['1'][0]
 #        stoptime=prog[1]['trigger']['6'][0]
-        
+
         trigger_exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
         if not trigger_exist:
             print("download_raw_images_by_program_via_png: Error! trigger not found, cannot download the data")
         OP = IR_tools.get_OP_by_time(time_ns=starttime)
-        
+
         # get raw data from latest or requested version
         if version == 0:
             version = get_latest_version(portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM", testmode=testmode, program=program)
@@ -862,17 +871,17 @@ if fastDL:
             larchivepath = testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
         else:
             larchivepath = archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
-        
+
         return download_images_by_time_via_png(larchivepath, starttime, stoptime,
                                                time_window=time_window, threads=threads,
                                                version=version, verbose=verbose-1)
-    
-    
+
+
     def download_images_by_time_via_png(larchivepath, starttime, stoptime, time_window=0,
                                         threads=1, version=0, verbose=0, framerate='max'):
         """
         """
-        success = True            
+        success = True
         if type(time_window) == list:
             tstart = time_window[0]
             tstop = time_window[1]
@@ -887,7 +896,7 @@ if fastDL:
                 print('download_images_by_time_via_png: Warning! time_window cropped by end of data')
 #            stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9+tstart)
 #            stdate=stdate.isoformat()
-#            enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+tstop)  
+#            enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+tstop)
 #            enddate=enddate.isoformat()
         else:
 #            stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9)
@@ -895,11 +904,11 @@ if fastDL:
             time_from = starttime-100
             if time_window == 0:
                 time_to = stoptime
-#                enddate=datetime.datetime.utcfromtimestamp(stoptime/1e9)        
+#                enddate=datetime.datetime.utcfromtimestamp(stoptime/1e9)
 #                enddate=enddate.isoformat()
             else:
                 time_to = starttime+int(time_window*1E9)
-#                enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+time_window)  
+#                enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+time_window)
 #                enddate=enddate.isoformat()
             #"2017-11-15 08:00:00"
         try:
@@ -909,13 +918,13 @@ if fastDL:
 #            print('download_images_by_time_via_png: Error loading times from ', larchivepath, stdate.replace("T", " "), enddate.replace("T", " "))
             print('download_images_by_time_via_png: Error loading times from {0} between [{1}, {2}]'.format(larchivepath, time_from, time_to))
             raise Warning(E)
-#            return False, [0], [0]  
-            
-        if framerate != 'max': 
+#            return False, [0], [0]
+
+        if framerate != 'max':
             if verbose > 5:
                 print("download_images_by_time_via_png: downsampling active; number of original frames:", len(times))
             if type(framerate) == float or type(framerate) == int:
-                realrate=1e9/((times[0]-times[-1])[0]/len(times))
+                realrate = 1e9/((times[0]-times[-1])[0]/len(times))
                 if framerate < realrate:
                     steps = int(round(realrate/framerate, 0))
                     dummy = []
@@ -933,7 +942,7 @@ if fastDL:
                 imag = download_last_raw_image_by_time(larchivepath, ele[0]-10, ele[0]+10)
                 if imag[0]:
                     time.append(ele[0])
-                    images.append(np.array(imag[1],dtype=np.uint16))
+                    images.append(np.array(imag[1], dtype=np.uint16))
                 else:
                     success = False
             return success, np.array(time), images
@@ -950,29 +959,29 @@ if fastDL:
             resultdict = []
             for i in range(threads):
                 if verbose > 0:
-                    print("download_images_by_time_via_png: Start Thread ", i+1)                
-                TH=download_images_thread(i, larchivepath, tim[intervalls[i]:intervalls[i+1]],resultdict, version)
+                    print("download_images_by_time_via_png: Start Thread ", i+1)
+                TH = download_images_thread(i, larchivepath, tim[intervalls[i]:intervalls[i+1]], resultdict, version)
                 jobs.append(TH)
                 TH.start()
             for p in jobs:
                 p.join()
             if verbose > 0:
                 print("download_images_by_time_via_png: all threads are done")
-            order=[]
+            order = []
             for ele in resultdict:
                 order.append(ele[0])
                 if len(np.where(np.asarray(ele[1])==False)[0])>0:
-                    success=False                
-            times=[]#np.array(resultdict[order.index(0)][2])
+                    success=False
+            times = []#np.array(resultdict[order.index(0)][2])
             images=[]#np.array(resultdict[order.index(0)][3])
             for i in range(threads):
-                images=images+resultdict[order.index(i)][3]
-                times=times+resultdict[order.index(i)][2]
-                resultdict[order.index(i)]=[]
+                images = images+resultdict[order.index(i)][3]
+                times = times+resultdict[order.index(i)][2]
+                resultdict[order.index(i)] = []
             del resultdict
             return success, np.array(times), images
-        
-      
+
+
     class download_images_thread(threading.Thread):
         def __init__(self, threadID, larchivepath, times, resultlist, version=0):
             threading.Thread.__init__(self)
@@ -982,11 +991,11 @@ if fastDL:
             self.resultlist = resultlist
             self.version = version
         def run(self):
-            images=[]
-            time=[]
-            successes=[]
+            images = []
+            time = []
+            successes = []
             for i in self.times:
-                imag=download_last_raw_image_by_time(self.archivepath, i-10, i+10, version=self.version)
+                imag = download_last_raw_image_by_time(self.archivepath, i-10, i+10)#, version=self.version
                 if imag[0]:
                     images.append(np.array(imag[1],dtype=np.uint16))
                     time.append(i)
@@ -1005,23 +1014,23 @@ if fastDL:
             self.archivepath = larchivepath
             self.resultlist = resultlist
             self.version = version   
-            self.gain=gain
-            self.offset=offset
-            self.background=background
-            self.LUT=LUT
-            self.refT=refT
-            self.gain_error=gain_error
-            self.offset_error=offset_error
-            self.give_ERROR=give_ERROR
-            self.FOV=FOV
-            self.badpixels=badpixels
-            self.verbose=verbose
+            self.gain = gain
+            self.offset = offset
+            self.background = background
+            self.LUT = LUT
+            self.refT = refT
+            self.gain_error = gain_error
+            self.offset_error = offset_error
+            self.give_ERROR = give_ERROR
+            self.FOV = FOV
+            self.badpixels = badpixels
+            self.verbose = verbose
         def run(self):
-            images=[]
-            time=[]
-            successes=[]        
+            images = []
+            time = []
+            successes = []        
             for i in self.times:
-                imag=download_last_raw_image_by_time(self.archivepath, i-10, i+10, version=self.version)
+                imag = download_last_raw_image_by_time(self.archivepath, i-10, i+10)#, version=self.version
                 if imag[0]:
                     images.append(np.array(imag[1],dtype=np.uint16))
                     time.append(i)
@@ -1029,15 +1038,15 @@ if fastDL:
                 else:
                     successes.append(False)
             if self.give_ERROR:
-                success, images, error_images=apply_calib_on_raw(images, self.background, self.LUT, self.refT, self.gain, self.offset, self.gain_error, self.offset_error, False, self.give_ERROR, verbose=self.verbose-1)
+                success, images, error_images = apply_calib_on_raw(images, self.background, self.LUT, self.refT, self.gain, self.offset, self.gain_error, self.offset_error, False, self.give_ERROR, verbose=self.verbose-1)
             else:
                 success, images=apply_calib_on_raw(images, self.background, self.LUT, self.refT, self.gain, self.offset, self.gain_error, self.offset_error, False, self.give_ERROR, verbose=self.verbose-1)
             
             for i in range(len(images)):
-                images[i]=(images[i]*self.FOV).astype(np.float32)
+                images[i] = (images[i]*self.FOV).astype(np.float32)
             if self.verbose > 0:
                 print(datetime.datetime.now(), "convert_raw_to_temp_thread: correcting bad pixels")
-            images=IR_tools.correct_images(images, self.badpixels, verbose=self.verbose-1)
+            images = IR_tools.correct_images(images, self.badpixels, verbose=self.verbose-1)
             self.resultlist.append([self.threadID, successes, time, images])
     
     class NUC_raw_thread(threading.Thread):
@@ -1066,7 +1075,7 @@ if fastDL:
             time=[]
             successes=[]
             for i in self.times:
-                imag=download_last_raw_image_by_time(self.archivepath, i-10, i+10, version=self.version)
+                imag=download_last_raw_image_by_time(self.archivepath, i-10, i+10)#, version=self.version
                 if imag[0]:
                     images.append(np.array(imag[1],dtype=np.uint16))
                     time.append(i)
@@ -1312,7 +1321,7 @@ def download_FLIR_Psets(larchivepath, timess, threads, versions, verbose=0):
             tsets=[]
     return exist, time, frames, tsets
     
-def download_last_raw_image_by_time(larchivepath, starttime, stoptime, version=0):
+def download_last_raw_image_by_time(larchivepath, starttime, stoptime):#, version=0
     """
     """
     try:
@@ -1711,12 +1720,12 @@ def get_TC_data_for_port_by_program(port, program, part=0, version=0, verbose=0)
 #        stoptime=prog[0]['trigger']['6'][0]
     exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode=False, verbose=verbose-1)
     if exist:
-        return get_TC_data_for_port(port, starttime, stoptime, part, version)
+        return get_TC_data_for_port(port, starttime, stoptime, part)#, version)
     else: #except:
         print("get_TC_data_for_port_by_program: Error! cannot find the program")
         return False, 0, 0
         
-def get_TC_data_for_port(port, starttime, stoptime, part=0, version=0):
+def get_TC_data_for_port(port, starttime, stoptime, part=0):#, version=0
     """
     """
     urlstart="http://archive-webapi.ipp-hgw.mpg.de/ArchiveDB/raw/W7X/CoDaStationDesc.115/DataModuleDesc.19471_DATASTREAM/"
@@ -2031,26 +2040,26 @@ def get_temp_from_raw_by_program(portnr, program, time_window=0, emi=0.8, T_vers
         if version == 0:
             version = get_latest_version(portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM", testmode=testmode, program=program)
         if testmode:
-            larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
+            larchivepath = testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
         else:
-            larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
+            larchivepath = archivepath+project+"/"+portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
         if verbose > 0:
             print(datetime.datetime.now(), "get_temp_from_raw_by_program: raw download start")
         if fastDL: 
-            exist, time, frames=download_images_by_time_via_png(larchivepath, starttime=t1, stoptime=t6, time_window=time_window, version=version, threads=threads, verbose=verbose-1, framerate=framerate)
+            exist, time, frames = download_images_by_time_via_png(larchivepath, starttime=t1, stoptime=t6, time_window=time_window, version=version, threads=threads, verbose=verbose-1, framerate=framerate)
         else:
-            exist, time, frames=download_raw_images_by_program(portnr, program, time_window, version, testmode=testmode, verbose=verbose-1)
+            exist, time, frames = download_raw_images_by_program(portnr, program, time_window, version, testmode=testmode, verbose=verbose-1)
             if exist:
-                frames=[im.swapaxes(0,1) for im in frames]
+                frames = [im.swapaxes(0,1) for im in frames]
         if not exist:
             raise Warning("get_temp_from_raw_by_program: data not found in database!")
             return False, [0], [0], False
         if verbose > 0:
             print(datetime.datetime.now(), "get_temp_from_raw_by_program: raw download finished")
         # calibrate frames
-        FOV=get_FOV_mask(portnr)    
+        FOV = get_FOV_mask(portnr)    
         if use_firstframe_as_background:
-            bim=apply_NUC([frames[0]], gain, offset)
+            bim = apply_NUC([frames[0]], gain, offset)
             background=get_average_background_recangle(portnr, bim[0])
         if give_ERROR:
             success, frames, error_images=apply_calib_on_raw(frames, background, LUT,refT, gain, offset, gain_error, offset_error, False, give_ERROR, verbose=verbose-1)
@@ -2537,7 +2546,7 @@ def get_calib_data(port, program=None, t0=None, t1=None, t6=None, emissivity=0.8
     
     # treat cameras with and w/o filters differently
     if cfilter==0 and not Camera.split("_")[0] == "Infratec":
-        # --- Infratec Camera case ---
+        # --- Ircam Camera case ---
         if verbose > 0:
             print('get_calib_data: getting NUC arrays')
         NUC_DL=get_NUC_by_times(port, t0, t1, t_exp, version, testmode, verbose=verbose-1)#download_NUC_by_times(port, t0, t1, t_exp, version)
@@ -2584,7 +2593,7 @@ def get_calib_data(port, program=None, t0=None, t1=None, t6=None, emissivity=0.8
                 raise Warning("get_calib_data: cannot find the first frame of the discharge, reconstruction failed")                     
 #                return False, 0, LUT, 0, gain, offset, badpixels, t_exp, cfilter, gain_error, offset_error
     else:
-        # --- Ircam Camera case ---
+        # --- Infratec Camera case ---
         gain = 0
         offset = 0
         badpixels = 0
@@ -2795,9 +2804,9 @@ def get_average_background_recangle(port, image):
     """
     """
     try:
-        points=valid_background_rectangle[port]
+        points = valid_background_rectangle[port]
 #        FOV=get_FOV_mask(port)
-        dummy=image[points[1]:points[3], points[0]:points[2]]#FOV*image#
+        dummy = image[points[1]:points[3], points[0]:points[2]]#FOV*image#
         return np.min(dummy[np.nonzero(dummy)])
     except Exception as E:
         print('get_average_background_recangle: Error! ', E)
@@ -2806,14 +2815,14 @@ def get_average_background_recangle(port, image):
 def estimate_offset(port, program, plot_it=False, verbose=0):
     """
     """
-    explist=[1,2,3,4,5,6,7,8,9]
-    meanlist=[]
-    exlist=[]
-    FOV=get_FOV_mask(port)
+    explist = [1, 2, 3, 4, 5, 6, 7, 8, 9]
+    meanlist = []
+    exlist = []
+    FOV = get_FOV_mask(port)
     for exposure in explist:        
-        exist, time, frame=download_background_by_program(port, program, exposure)
+        exist, time, frame = download_background_by_program(port, program, exposure)
         if exist:
-            meanlist.append(np.mean(frame[np.where(FOV==1)]))
+            meanlist.append(np.mean(frame[np.where(FOV == 1)]))
             exlist.append(exposure)
     if len(meanlist)>=2:
 #        print(exlist,meanlist)
@@ -2831,8 +2840,8 @@ def estimate_offset(port, program, plot_it=False, verbose=0):
     else:
         return -1
 
-def download_heatflux_by_program(port, program, time_window=0, threads=1, testmode=False,
-                                 version=0, verbose=0, givealpha=False,request=True,moffset=0):
+def download_heatflux_by_program(port, program, time_window=0, testmode=False,
+                                 version=0, verbose=0, givealpha=False,request=True,moffset=0):#threads=1, 
     """
     port: string or integer
     program: string
@@ -2972,22 +2981,22 @@ def download_heatflux_mapping_reference(timepoint=None, version=0, testmode=Fals
     """
     return exist(boolean) and dictonary of the mappings informations
     """
-    if timepoint==None:
-        timepoint=int(TimeToNs([2017,9,26], [8, 0, 0, 0]))
+    if timepoint == None:
+        timepoint = int(TimeToNs([2017,9,26], [8, 0, 0, 0]))
     if testmode:
-        base=testarchivepath
+        base = testarchivepath
     else:
-        base=archivepath
+        base = archivepath
 #    OP = IR_tools.get_OP_by_time(time_ns=timepoint)
     if version == 0:
         version = get_latest_version("QRT_IRCAM/Mapping_reference_DATASTREAM", project=project_ana, testmode=testmode, t_from=timepoint)
-    larchivepath=base+project_ana+"/"+"QRT_IRCAM/Mapping_reference_DATASTREAM/V"+str(version)+"/0/reference"
+    larchivepath = base+project_ana+"/"+"QRT_IRCAM/Mapping_reference_DATASTREAM/V"+str(version)+"/0/reference"
     ### test for the testsample###
 #    if version == 0:
 #        version = get_latest_version("QRT_IRCAM_Test/Mapping_reference_Test_1_PARLOG", project=project_ana, testmode=testmode)                                        
 #    larchivepath=base+project_ana+"/QRT_IRCAM_Test/Mapping_reference_Test_1_DATASTREAM/V"+str(version)+"/0/reference"
     ### end of testsample ###
-    exist, time, frames=download_images_by_times(larchivepath, starttime=timepoint, stoptime=int(timepoint+1e9), verbose=verbose-1)
+    exist, time, frames = download_images_by_times(larchivepath, starttime=timepoint, stoptime=int(timepoint+1e9), verbose=verbose-1)
     mappings={}
     if exist:
         mappings['s']=frames[0]
@@ -3104,13 +3113,13 @@ def download_heatflux_scene_model_reference(port, timepoint=None, program=None,
     """
     return exist(boolean) and dictonary of the mappings informations
     """
-    if type(port)==int or type(port)==float:
-        portnam="AEF"+str(port)
-    elif type(port)==str:
-        portnam=port
-    if timepoint==None and program==None:
-        timepoint=int(TimeToNs([2017,8,28], [8, 0, 0, 0]))
-    elif timepoint==None:
+    if type(port) == int or type(port) == float:
+        portnam = "AEF"+str(port)
+    elif type(port) == str:
+        portnam = port
+    if timepoint == None and program == None:
+        timepoint = int(TimeToNs([2017,8,28], [8, 0, 0, 0]))
+    elif timepoint == None:
 #        prog=get_program_from_PID(program)
 #        if prog[0]:        
 #            timepoint=prog[1]['trigger']['1'][0]
@@ -3148,7 +3157,7 @@ def download_heatflux_scene_model_reference(port, timepoint=None, program=None,
         goon=False
     if goon:
         timepoint=signal_list['values'][0]  
-        exist, time, frames = download_images_by_times(larchivepath, starttime=timepoint-10, stoptime=int(timepoint+1e8), version=version, verbose=verbose-1)        
+        exist, time, frames = download_images_by_times(larchivepath, starttime=timepoint-10, stoptime=int(timepoint+1e8), verbose=verbose-1)        
         del time
         mappings={}
         if exist:
@@ -3398,8 +3407,36 @@ def extract_temperature_profile_from_DL(port, time, images, profile, finger=None
     ------
         port: int or str
             the camera port as number or full string (e.g. 'AEF10')
-    return exist, time, s in m, heat flux in W/m2
-    time_point default (None) returns entire shot.
+        time: array or numpy array
+            the time vector for the given images
+        images: numpy array
+            temperature flux images, from which the profile should be extracted
+        profile:
+        
+        finger:
+        
+        time_window: 
+        
+        inputchecked:
+            
+        verbose: integer, optional    
+            feedback level (details of print messages)
+        reference_time : float, optional, default is 0
+            reference timepoint for the mapping data
+    RESULT
+    ------
+        exist: boolean
+               indicates whether data was found (True) or not (False)
+
+        time 
+        s in m 
+        heat flux in W/m2
+    
+    
+      
+    
+     NOTES
+     ----- 
     """
     goon = True
     if time_window == None:
@@ -3602,7 +3639,7 @@ def download_divertor_load(port, targetmodule=None, program=None, tstart=None,
     if exist == False:
         now = datetime.datetime.now()
         if verbose > 0:
-            print(now, "download_divertor_load: divertor_load data is not available, creating request")          
+            print(now, "download_divertor_load: divertor_load data is not available")          
         if request:
             try:
                 programid=AKF_2.get_program_id(tstart)
@@ -3688,7 +3725,7 @@ def download_scene_model(port, program=None, timepoint=None, version=0, testmode
     if goon:
         timepoint=signal_list['values'][0]['meta-data']['timestamp']
         height=signal_list['values'][0]['meta-data']['height']
-        exist, time, frames = download_images_by_times(larchivepath, starttime=timepoint-10, stoptime=int(timepoint+1e8), version=version, verbose=verbose-1)
+        exist, time, frames = download_images_by_times(larchivepath, starttime=timepoint-10, stoptime=int(timepoint+1e8), verbose=verbose-1)
         del time
         stacked_image = np.array(frames[0], dtype='float64')
         channels = np.array(np.vsplit(stacked_image, stacked_image.shape[0]/height))            
@@ -3718,6 +3755,8 @@ the following functions are copied from W7xrest.read_restdb to remove this depen
 def read_restdb_old(request_url):
     """
     Reads JSON data from W7-X REST API
+    INPUT
+    ------
     
     Returns
     ------