diff --git a/IR_config_constants.py b/IR_config_constants.py
index d92c359622de28f647bdebaf62f85670f205e252..7c880c38dd8b2f1d87815cf7c97be6c1ca95ef5b 100644
--- a/IR_config_constants.py
+++ b/IR_config_constants.py
@@ -11,7 +11,11 @@ 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"
+# get local parameter directory from script location
+import os.path as ospath
+parameter_file_path = ospath.join(ospath.dirname(__file__), 'data')
+
+
 try:
 #    import sys
     path=str(repr(__file__)).split("IR_config_constants")[0].split("'")[1]+"upload_config"
@@ -28,6 +32,7 @@ except Exception as E:
     archivepath="http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"
     print("config loading failed",E)
 #    raise Exception("Config file was not loaded properly",E)
+testarchivepath = "http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"
 
 #%% Dictionaries
 project="W7X"
diff --git a/IR_image_tools.py b/IR_image_tools.py
index fe61edd1ddd01979a01bd69fc97be282e16dddd4..8622cb3d87b143dee5b478614d26970366589f93 100644
--- a/IR_image_tools.py
+++ b/IR_image_tools.py
@@ -21,9 +21,6 @@ import datetime
 #import h5py
 #import glob
 
-# 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.
@@ -57,7 +54,7 @@ def get_OP_by_time(time_ns=None, shot_no=None, program_str=None):
             return "OP1.2a"
         else:
             return None        
-    elif dateOP.year == 2018:
+    elif dateOP.year >= 2018:
         return "OP1.2b"
     elif dateOP.year <= 2016 and dateOP.year >= 2015:
         if (dateOP.year == 2016 and dateOP.month <= 3) or (dateOP.year == 2015 and dateOP.month == 12):
diff --git a/downloadversionIRdata.py b/downloadversionIRdata.py
index a0fbbf2538c4a74e401727a649e1058aa1267cea..ad4b73d36b5b76fd5390db8d767bcfda0376e7b2 100644
--- a/downloadversionIRdata.py
+++ b/downloadversionIRdata.py
@@ -11,7 +11,7 @@ Version: 3.2.5
 
 import numpy as np
 import IR_image_tools as IR_tools
-from IR_config_constants import archivepath,portcamdict,camlimdict, \
+from IR_config_constants import archivepath,testarchivepath,portcamdict,camlimdict, \
                                 valid_FOV_circle,valid_background_rectangle, \
                                 TC_port,TC_channel,IRCamColdframes_fittingpath, \
                                 exJet,portpathdict,project,project_ana, \
@@ -30,6 +30,9 @@ import matplotlib.pyplot as plt
 try:          
     import threading
     import archivedb as AKF_2
+    # disbale deprecation warnings, because of timezone warning spam
+    import warnings
+    warnings.filterwarnings("ignore", category=DeprecationWarning)
     fastDL=True
 except Exception as E:
     print(E)
@@ -44,27 +47,29 @@ except:
     config_path=""
 
 
-def get_latest_version(stream,project="W7X",Test=False,t_from=None,t_to=None,program=None):
+def get_latest_version(stream,project="W7X",testmode=False,t_from=None,t_to=None,
+                       program=None,verbose=0):
     
      """Find out latest version of given stream
      :param stream   url stream of interest
      :return int of version number of None if non-versioned or non-existing stream
      author: G. Schlisio, edit by holn
      """
-     if Test:
-         base="http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"
+     if testmode:
+         base=testarchivepath
      else:
          base=archivepath    
 
-    
      if program==None and t_from==None and t_to==None:         
          request =urllib.request.Request(base +project+"/" + stream + "/_versions.json", headers={"Accept": "application/json"})            
      else:
          if program is not None:
-             prog=get_program_from_PID(program)
-             if prog[0]:
-                 t_from=prog[1]['trigger']['0'][0]
-                 t_to=prog[1]['trigger']['6'][0]
+#             prog=get_program_from_PID(program)
+#             if prog[0]:
+#                 t_from=prog[1]['trigger']['0'][0]
+#                 t_to=prog[1]['trigger']['6'][0]
+             exist, t_from, _, t_to = get_trigger_from_PID(program, stream, testmode, verbose=verbose-1)
+             
          elif t_from is not None and t_to==None:
              t_to=int(t_from+100e9)
          elif t_from==None and t_to is not None:
@@ -129,7 +134,8 @@ def read_program(timestamp_start,timestamp_end=0,tol=60):
 
 
 
-def download_LUT(port,time,exposure=0,emissivity=0,camera_filter=0,version=0, verbose=0):
+def download_LUT(port,time,exposure=0,emissivity=0,camera_filter=0,version=0, 
+                 testmode=False,verbose=0):
     """
     download_LUT(camera,port,time,exposure=0,emissivity=0,camera_filter=0,version=1):
         time in ns
@@ -140,7 +146,10 @@ def download_LUT(port,time,exposure=0,emissivity=0,camera_filter=0,version=0, ve
         port = 11
     elif port == 11:
         port = 21
-    larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"LUT_"
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"LUT_"
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"LUT_"
     if port==50 and OP=="OP1.2a":# camera=="INFRATEC" or camera=="infratec" or camera=="Infratec":
         query="Filter_"+str(camera_filter)+"_Texp_"+str(int(exposure))+"us_e_"+str(float(emissivity))
     elif port in [10,11,20,21,30,31,40,41,51] or OP=="OP1.2b":#camera=="IRCAM" or camera=="IRcam" or camera=="ircam":
@@ -149,7 +158,7 @@ def download_LUT(port,time,exposure=0,emissivity=0,camera_filter=0,version=0, ve
         print("download_LUT: Error! Camera unknown, stopping here.")
         raise Exception
     if version==0:
-        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"LUT_DATASTREAM",t_from=time)
+        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"LUT_DATASTREAM",t_from=time,testmode=testmode)
     if verbose>0:
         print("download_LUT: LUT V"+str(version)+" is used")
     #time=int(fu.TimeToNs([2017,9,26],[8,0,0,0]))
@@ -194,27 +203,35 @@ def read_LUT_from_file(port, this_time, t_exp, emissivity, cfilter, emissivity_s
         print("read_LUT_from_file: ERROR in loading V3 LUTs",E)
         return False, []
     
-def download_NUC_by_program(port,program,exposure,version=0):
-    prog=get_program_from_PID(program)
+def download_NUC_by_program(port,program,exposure,version=0,testmode=False,verbose=0):
+    '''
+    '''
+#    prog=get_program_from_PID(program)
 #    try:
 #        t_program = AKF_2.get_program_from_to(program)
 #        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-    if prog[0]:
-        starttime=prog[1]['trigger']['0'][0]
-        stoptime=prog[1]['trigger']['1'][0]
-        return download_NUC_by_times(port,starttime,stoptime,exposure,version)
+#    if prog[0]:
+#        starttime=prog[1]['trigger']['0'][0]
+#        stoptime=prog[1]['trigger']['1'][0]
+    exist, starttime, stoptime, _ = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return download_NUC_by_times(port,starttime,stoptime,exposure,version,verbose=verbose)
     else:
 #    except:
         print("download_NUC_by_program: cannot find the program")
         return False,0,0
 
-def download_NUC_by_times(port,starttime,stoptime,exposure,version=0):
-    project="W7X"
+def download_NUC_by_times(port,starttime,stoptime,exposure,testmode=False,version=0,verbose=0):
+    '''
+    '''
     OP=IR_tools.get_OP_by_time(time_ns=starttime)
-    larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"NUC_"
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"NUC_"
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"NUC_"
 #    NUC_parlog=AKF_1.read_restdb_old(archivepath+"PARLOG/V"+str(version)+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
     if version==0:
-        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"NUC_DATASTREAM",t_from=starttime)
+        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"NUC_DATASTREAM",t_from=starttime,testmode=testmode)
     try:
         res = urllib.request.urlopen(larchivepath+"PARLOG/V"+str(version)+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
         signal_list = json.loads(res.read().decode('utf-8'))
@@ -249,29 +266,36 @@ def download_NUC_by_times(port,starttime,stoptime,exposure,version=0):
     else:
         return False,0,0
 
-def get_NUC_by_program(port,program,exposure,version=0,verbose=0):
-    prog=get_program_from_PID(program)
+def get_NUC_by_program(port,program,exposure,version=0,testmode=False,verbose=0):
+    '''
+    '''
+#    prog=get_program_from_PID(program)
 #    try:
 #        t_program = AKF_2.get_program_from_to(program)
 #        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-    if prog[0]:
-        starttime=prog[1]['trigger']['0'][0]
-        stoptime=prog[1]['trigger']['1'][0]
-        return get_NUC_by_times(port,starttime,stoptime,exposure,version=0,verbose=verbose)
+#    if prog[0]:
+#        starttime=prog[1]['trigger']['0'][0]
+#        stoptime=prog[1]['trigger']['1'][0]
+    exist, starttime, stoptime, _ = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return get_NUC_by_times(port,starttime,stoptime,exposure,version=0,testmode=testmode,verbose=verbose)
     else:
 #    except:
-        print("get_NUC_by_program: Error! cannot find the program")
-        return False,0,0
+        print("get_NUC_by_program: Warning! cannot find the trigger timestamps for program", program)
+#        return False,0,0
+        OP=IR_tools.get_OP_by_time(program_str=program)
+        return get_NUC_by_times(port,starttime,stoptime,exposure,version=0,testmode=testmode,OP=OP,verbose=verbose)
     
-def get_NUC_by_times(port,starttime,endtime,t_exp,version=0,verbose=0):
+def get_NUC_by_times(port,starttime,stoptime,t_exp,version=0,testmode=False,OP=None,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
-    teh cold frame and/or compute the gain,offset from the hot and cold frame.
+    the cold frame and/or compute the gain,offset from the hot and cold frame.
     """
-    OP=IR_tools.get_OP_by_time(time_ns=endtime)
+    if OP is None:
+        OP=IR_tools.get_OP_by_time(time_ns=stoptime)
     if OP=="OP1.2a":
-        t1=endtime
+        t1=stoptime
         t0=starttime
         prog=read_program(t1)
         program=prog[1]['id']
@@ -279,15 +303,15 @@ def get_NUC_by_times(port,starttime,endtime,t_exp,version=0,verbose=0):
             if verbose>0:
                 print("get_NUC_by_times: rebuilding coldframe")
             #use any way the rebuilt coldframe.
-            sT = get_sensor_temp_by_program(port, program)[2][0]
+            sT = get_sensor_temp_by_program(port, program,testmode=testmode)[2][0]
     #                        coldref, hotref = IR_tools.load_ref_images('AEF' + str(port), t_exp)
-            gotit,hotcold,describtion=download_hot_cold_reference_by_times(port,t_exp)
+            gotit,hotcold,describtion=download_hot_cold_reference_by_times(port,t_exp,testmode=False)
             if gotit:
                 coldref=hotcold[1]
                 hotref=hotcold[0]
             else:
                 raise Exception("get_NUC_by_times: unable to download reference frames")
-            filestring = 'AEF' + str(port) + '_et' + str(t_exp)
+            filestring = 'AEF' + str(port) + '_et' + str(int(t_exp))
             amap = np.load(join(IRCamColdframes_fittingpath, filestring + '_a.npy'))
             bmap = np.load(join(IRCamColdframes_fittingpath, filestring + '_b.npy'))
             cirebuild = IR_tools.reconstruct_coldframe(t_exp, sT, amap, bmap, coldref)
@@ -304,13 +328,13 @@ def get_NUC_by_times(port,starttime,endtime,t_exp,version=0,verbose=0):
             if verbose>0:
                 print('get_NUC_by_times: downloading NUC')
     #                        coldref, hotref = IR_tools.load_ref_images('AEF' + str(port), t_exp)
-            gotit,hotcold,describtion=download_hot_cold_reference_by_times(port,t_exp)
+            gotit,hotcold,describtion=download_hot_cold_reference_by_times(port,t_exp,testmode=False)
             if gotit:
                 coldref=hotcold[1]
                 hotref=hotcold[0]
             else:
                 raise Exception("get_NUC_by_times: unable to download reference frames")
-            NUC_DL=download_NUC_by_times(port,t0,t1,t_exp,version)
+            NUC_DL=download_NUC_by_times(port,t0,t1,t_exp,version,testmode)
             if NUC_DL[0]==False:
                 raise Exception("get_NUC_by_times: NUC was not found")
             else:
@@ -325,38 +349,43 @@ def get_NUC_by_times(port,starttime,endtime,t_exp,version=0,verbose=0):
         else:
             if verbose>0:
                 print('get_NUC_by_times: downloading NUC')
-            return download_NUC_by_times(port,starttime,endtime,t_exp)
+            return download_NUC_by_times(port,starttime,stoptime,t_exp,testmode=testmode)
     elif OP=="OP1.2b":
         gain_error=0
         offset_error=0
-        gotit,hotcold,describtion=download_hot_cold_reference_by_times(port,t_exp)
+        gotit,hotcold,describtion=download_hot_cold_reference_by_times(port,t_exp,testmode=False)
         if gotit:
             coldref=hotcold[1]
             hotref=hotcold[0]
         else:
             raise Exception("get_NUC_by_times: unable to download reference frames")
         ### get the cold frame: 1. get the metastream frametype and exposuretime and check in it for the positions, if -1 type is unknown, when if needs to be identified in a different way
-        exist,ctime,coldframes=download_calibration_raw_files_by_time(port,t_exp,starttime,endtime,frametype=0,version=0,verbose=verbose-1)
+        try:
+            exist,_,coldframes=download_calibration_raw_files_by_time(port,t_exp,starttime,stoptime,frametype=0,version=0,testmode=testmode,verbose=verbose-1)
+        except:
+            exist = False    
         if exist:
             cold=np.zeros(np.shape(coldframes[0]),dtype=np.uint64)
             for ele in coldframes:
                 cold+=ele                
             cold=np.asarray(cold/len(coldframes),dtype=np.uint16)        
         else:
-            return False,[0],[0]
+            print('get_NUC_by_times: Warning! no cold frames found. will use reference cold frame...')
+            cold = np.copy(coldref)
+#            return False,[0],[0]
         gain, offset = IR_tools.calculate_gain_offset_image(cold, None, coldref, hotref,verbose=verbose-1)
         badpixels=find_badpixels(port,gain,offset,niterations=10,tolerance=10,verbose=verbose-1)
         return True,[gain,offset,cold,badpixels,gain_error,offset_error],['gain','offset','cold','badpixels','gain_error','offset_error']
     else:
         raise Exception("get_NUC_by_times: unknown Operation phase or NUC method not implemented for this OP")
 
-def download_calibration_raw_files_by_time(port,t_exp,starttime,endtime,frametype=0,version=0,verbose=0):
+def download_calibration_raw_files_by_time(port,t_exp,starttime,stoptime,frametype=0,version=0,testmode=False,verbose=0):
     """
-    download_calibration_raw_files_by_time(port,t_exp,starttime,endtime,frametype=0,version=0)
+    download_calibration_raw_files_by_time(port,t_exp,starttime,stoptime,frametype=0,version=0)
     frametype: 0 for closed shutter frames (cold), 1 for open shutter frames (background)
     """
-    gotit,time_t,texp_t=get_exposure_by_times(port,int(starttime-100),int(endtime-20e6))
-    OP=IR_tools.get_OP_by_time(time_ns=endtime)
+    gotit,time_t,texp_t=get_exposure_by_times(port,int(starttime-100),int(stoptime-20e6),testmode=testmode)
+    OP=IR_tools.get_OP_by_time(time_ns=stoptime)
     if gotit:
         expinds=np.where(texp_t==t_exp)[0]
         if len(expinds)==0:
@@ -365,7 +394,7 @@ def download_calibration_raw_files_by_time(port,t_exp,starttime,endtime,frametyp
     else:
         print("download_calibration_raw_files_by_time: Error! exposure time not found")
         return False,[0],[0]
-    gotitf,timef,values_f=get_frametype_by_times(port,int(starttime-100),int(endtime-20e6))
+    gotitf,timef,values_f=get_frametype_by_times(port,int(starttime-100),int(stoptime-20e6),testmode=testmode)
     if gotitf:
         typiinds=np.where(values_f[expinds]==frametype)[0]
         if len(typiinds)>0:
@@ -380,11 +409,11 @@ def download_calibration_raw_files_by_time(port,t_exp,starttime,endtime,frametyp
             turnpoint=np.where(np.asarray(diftime)>11e6)[0][0]
             if frametype==0:
                 ref_t=[np.min(frametimes[0:turnpoint+1]),np.max(frametimes[0:turnpoint+1])]
-                print((ref_t[1]-ref_t[0])/1e9)
+#                print((ref_t[1]-ref_t[0])/1e9)
             elif frametype==1:
 #                print(len(frametimes[turnpoint+1:]),len(frametimes[0:turnpoint+1]),len(frametimes))                
                 ref_t=[np.min(frametimes[turnpoint+1:]),np.max(frametimes[turnpoint+1:])]
-                print((ref_t[1]-ref_t[0])/1e9)
+#                print((ref_t[1]-ref_t[0])/1e9)
             else:
                 raise Exception("download_calibration_raw_files_by_time: requested Frametype unknown and not implemented!")
     else:
@@ -402,13 +431,16 @@ def download_calibration_raw_files_by_time(port,t_exp,starttime,endtime,frametyp
         else:
             raise Exception("download_calibration_raw_files_by_time: requested Frametype unknown and not implemented!")
 #        return False,[0],[0]
-    t1date=datetime.datetime.utcfromtimestamp((endtime-100)/1e9)
+    t1date=datetime.datetime.utcfromtimestamp((stoptime-100)/1e9)
     t1date=t1date.isoformat()
     t0date=datetime.datetime.utcfromtimestamp((starttime-15e6)/1e9)
     t0date=t0date.isoformat()
     if version==0:
-        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM",t_from=starttime,t_to=endtime)
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
+        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"
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
     timest0=AKF_2.get_time_intervals(larchivepath,t0date.replace("T"," "),t1date.replace("T"," "))
     t_offset=timest0[-1][0]-time_t[0]
     if t_offset>10e6:
@@ -417,15 +449,19 @@ def download_calibration_raw_files_by_time(port,t_exp,starttime,endtime,frametyp
     else:
         t_offset=0
 #            print("starttime frames:",np.min(timest0),"starttime metachannels:",time_t[0],"offset",t_offset)
-    return download_raw_images_by_times(port,ref_t[0]+t_offset,ref_t[1]+t_offset,verbose=verbose-1)
+    return download_raw_images_by_times(port,ref_t[0]+t_offset,ref_t[1]+t_offset,testmode=testmode,verbose=verbose-1)
         
-def download_hot_cold_reference_by_times(port,exposure,starttime=1503907200000000000,version=0):
+def download_hot_cold_reference_by_times(port,exposure,starttime=1503907200000000000,
+                                         testmode=False,version=0):
     """
     Loads the most recent hot and cold calibration frames for a starttime.
     Uses first calibration frames if time is not defined.
     """
     OP=IR_tools.get_OP_by_time(time_ns=starttime)
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"raw_"
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_"
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_"
 #    NUC_parlog=AKF_1.read_restdb_old(archivepath+"PARLOG/V"+str(version)+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
     if version==0:
         version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM",t_from=starttime)
@@ -470,29 +506,35 @@ def download_hot_cold_reference_by_times(port,exposure,starttime=150390720000000
     else:
         return False,0,0
     
-def download_background_by_program(port,program,exposure,version=0):
+def download_background_by_program(port,program,exposure,version=0,testmode=False,verbose=0):
     '''
     returned exist,time,frame
     '''
-    prog=get_program_from_PID(program)
+#    prog=get_program_from_PID(program)
 #    try:
 #        t_program = AKF_2.get_program_from_to(program)
 #        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-    if prog[0]:
-        starttime=prog[1]['trigger']['0'][0]
-        stoptime=prog[1]['trigger']['1'][0]
+#    if prog[0]:
+#        starttime=prog[1]['trigger']['0'][0]
+#        stoptime=prog[1]['trigger']['1'][0]
+    exist, starttime, stoptime, _ = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
         return download_background_by_times(port,starttime,stoptime,exposure,version)
     else:#except:
         print("download_background_by_program: Error! cannot find the program {0}".format(program))
         return False,0,0
     
-def download_background_by_times(port,starttime,stoptime,exposure,camera_filter=0,version=0,verbose=0):
+def download_background_by_times(port,starttime,stoptime,exposure,camera_filter=0,
+                                 version=0,testmode=False,verbose=0):
     OP=IR_tools.get_OP_by_time(time_ns=starttime)
     if OP=="OP1.2a":
         stream=portpathdict[OP]["AEF"+str(port)]+"background_"
-        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"background_"
+        if testmode:
+            larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"background_"
+        else:
+            larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"background_"
         if version==0:
-            version=get_latest_version(stream+"DATASTREAM",t_from=starttime)
+            version=get_latest_version(stream+"DATASTREAM",t_from=starttime,testmode=testmode)
         try:
             res = urllib.request.urlopen(larchivepath+"PARLOG/V"+str(version)+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
             signal_list = json.loads(res.read().decode('utf-8'))
@@ -528,7 +570,7 @@ def download_background_by_times(port,starttime,stoptime,exposure,camera_filter=
         else:
             return False,0,0
     elif OP=="OP1.2b":
-        NUC_DL=get_NUC_by_times(port=port,starttime=starttime,endtime=stoptime,t_exp=exposure,version=version,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
@@ -544,11 +586,11 @@ def download_background_by_times(port,starttime,stoptime,exposure,camera_filter=
             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,plot_it=False,verbose=0):
+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,verbose=verbose-1)
+    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)
@@ -569,7 +611,8 @@ def get_NUCed_background_by_times(port,t0,t1,t_exp,cfilter,gain,offset,version=0
     return exist,btime[0],background
 
 
-def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0, plot_it=False, verbose=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 
        the NUC of the previous program (or next one, if the previous does not exist).
@@ -603,18 +646,18 @@ def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0, plot
     """
     if exposure is None:
         try:
-            exist, t, exposure = get_exposure_by_program(port, program, version=version)
+            exist, t, exposure = get_exposure_by_program(port, program, version=version, testmode=testmode)
         except:
             print('get_NUCed_coldframe_by_program: ERROR! no exposure time found!')
             return False, []
             
         t_exp = exposure[0]
     else:
-        if verbose>0:
-            print('get_NUCed_coldframe_by_program: using exposure time {0}'.format(exposure))
         t_exp = exposure
+    if verbose>0:
+            print('get_NUCed_coldframe_by_program: using exposure time {0}'.format(t_exp))
     try:
-        exist, data, desc = get_NUC_by_program(port, program, t_exp, version=version, verbose=verbose-1)
+        exist, data, desc = get_NUC_by_program(port, program, t_exp, version=version, testmode=testmode, verbose=verbose-1)
     except:
         print('get_NUCed_coldframe_by_program: ERROR! no cold frame found!')
         return False, []
@@ -624,33 +667,27 @@ def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0, plot
         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, verbose=verbose-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]
             if verbose>0:
                 print('get_NUCed_coldframe_by_program: using NUC of program {0}'.format(ref_program))
         else:
-            ref_program = '{0}.{1:03d}'.format(program.split('.')[0], porg_nr+1)
-            if verbose>0:
-                print('get_NUCed_coldframe_by_program: program {0} has no predecessor.\n   --> using NUC of {1}'.format(program, ref_program))
-            exist2, data, desc = get_NUC_by_program(port, ref_program, t_exp, version=version, verbose=verbose-1)
-            if exist2:
-                coldframe = apply_NUC([cold_raw],data[0],data[1])[0]
-            else:
-                print('get_NUCed_coldframe_by_program: WARNING! no adjacent program found! --> cold frame is not NUCed')
-                coldframe = cold_raw
+            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.colorbar()
-            plt.title('raw cold frame\nof {0}'.format(program))
+            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.colorbar()
             plt.title('NUCed based on\ngain/offset from {0}'.format(ref_program))
-            plt.tight_layout()
+            plt.suptitle('cold frame of port {0}'.format(port))
+            plt.tight_layout(rect=[0, 0, 1, 0.95])
             plt.show()
     else:
         print('get_NUCed_coldframe_by_program: ERROR! No cold frame found for program {0}!'.foramt(program))
@@ -659,40 +696,45 @@ def get_NUCed_coldframe_by_program(port, program, exposure=None, version=0, plot
     return exist, coldframe
 
 
-def download_raw_images_by_program(port,program,time_window=0,version=0,verbose=0):
+def download_raw_images_by_program(port,program,time_window=0,version=0,testmode=False,verbose=0):
     """
     """
+    exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
 #    prog=AKF_1.get_program_from_PID(program)
-    try:
-        t_program = AKF_2.get_program_from_to(program)
-        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-#    if prog[0]:
-        starttime=prog[0]['trigger']['1'][0]
-        stoptime=prog[0]['trigger']['6'][0]
+#    try:
+#        t_program = AKF_2.get_program_from_to(program)
+#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+##    if prog[0]:
+#        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:
                 raise Exception("download_raw_images_by_program: invalid input for the time_window!")
             tstart=time_window[0]
             tstop=time_window[1]
             if tstop<tstart:
-                raise Exception("download_raw_images_by_program: endtime before starttime")
-            return download_raw_images_by_times(port,int(starttime+tstart*1e9),int(starttime+tstop*1e9),version,verbose=verbose)
+                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:
-                return download_raw_images_by_times(port,starttime,stoptime,version,verbose=verbose)
+                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,verbose=verbose)
-    except:
+                return download_raw_images_by_times(port,starttime,int(starttime+time_window*1e9),version,testmode=testmode,verbose=verbose)
+    else:
         print("download_raw_images_by_program: Error! cannot find the program")
         return False,0,0
 
-def download_raw_images_by_times(port,starttime,stoptime,version=0,intervalSize=1E9,verbose=0):
+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)    
     if version==0:
-        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM",t_from=starttime,t_to=stoptime)
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"  
+        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"  
+    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,version=version,intervalSize=intervalSize,verbose=verbose)
     
 def download_images_by_times(larchivepath,starttime,stoptime,version=0,intervalSize=1E9,verbose=0):
@@ -758,27 +800,38 @@ def download_images_by_times(larchivepath,starttime,stoptime,version=0,intervalS
             return False, 0,-1
 
 if fastDL:
-    def download_raw_images_by_program_via_png(port,program,time_window=0,version=0,threads=1,verbose=0):
+    def download_raw_images_by_program_via_png(port,program,time_window=0,version=0,
+                                               threads=1,testmode=False,verbose=0):
         """
         """
-        prog=get_program_from_PID(program)
-#        try:
-#            t_program = AKF_2.get_program_from_to(program)
-#            prog =AKF_2.get_program_list(t_program[0], t_program[1])
-        if not prog[0]:
-            print("download_raw_images_by_program_via_png: Error! program not found, cannot download the data")
-            return False,[0],[0]
+#        prog=get_program_from_PID(program)
+##        try:
+##            t_program = AKF_2.get_program_from_to(program)
+##            prog =AKF_2.get_program_list(t_program[0], t_program[1])
+#        if not prog[0]:
+#            print("download_raw_images_by_program_via_png: Error! program not found, cannot download the data")
+#            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)
+        if testmode:
+            larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
         else:
-            starttime=prog[1]['trigger']['1'][0]
-            stoptime=prog[1]['trigger']['6'][0]
-            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)
-            larchivepath=archivepath+"W7X/"+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)
-            
+            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'):
         """
@@ -788,25 +841,37 @@ if fastDL:
             tstart=time_window[0]
             tstop=time_window[1]
             if tstop<tstart:
-                raise Exception("download_images_by_time_via_png: endtime before starttime")
-            stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9+tstart)
-            stdate=stdate.isoformat()
-            enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+tstop)  
-            enddate=enddate.isoformat()
+                raise Exception("download_images_by_time_via_png: t_stop before t_start")
+            time_from = (starttime-100)+int(tstart*1E9)
+            if stoptime<time_from:
+                raise Exception("download_images_by_time_via_png: time_window after stoptime")
+            time_to = starttime+int(tstop*1E9)
+            if stoptime<time_to:
+                time_to = stoptime
+                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=enddate.isoformat()
         else:
-            stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9)
-            stdate=stdate.isoformat()
+#            stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9)
+#            stdate=stdate.isoformat()
+            time_from = starttime-100
             if time_window==0:
-                enddate=datetime.datetime.utcfromtimestamp(stoptime/1e9)        
-                enddate=enddate.isoformat()
+                time_to = stoptime
+#                enddate=datetime.datetime.utcfromtimestamp(stoptime/1e9)        
+#                enddate=enddate.isoformat()
             else:
-                enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+time_window)  
-                enddate=enddate.isoformat()
+                time_to = starttime+int(time_window*1E9)
+#                enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+time_window)  
+#                enddate=enddate.isoformat()
             #"2017-11-15 08:00:00"
         try:
-            times=AKF_2.get_time_intervals(larchivepath,stdate.replace("T"," "),enddate.replace("T"," "))#
+#            times=AKF_2.get_time_intervals(larchivepath,stdate.replace("T"," "),enddate.replace("T"," "))
+            times=AKF_2.get_time_intervals(larchivepath,time_from,time_to)
         except Exception as E:
-            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 ',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]  
             
@@ -870,6 +935,7 @@ if fastDL:
                 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):
@@ -985,20 +1051,20 @@ if fastDL:
             images=IR_tools.correct_images(images,self.badpixels,verbose=self.verbose-1)
             self.resultlist.append([self.threadID,successes,time,images]) 
 
-def download_raw_FLIR_images_via_png(t1,t6,time_window=0,version=0,threads=1,verbose=0,Test=True):
+def download_raw_FLIR_images_via_png(t1,t6,time_window=0,version=0,threads=1,verbose=0,testmode=True):
     """
     """
-    if Test:
-        larchivepath="http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"+"W7X/QSR07_FLIR/AEK51_raw"
+    if testmode:
+        larchivepath=testarchivepath+project+"/QSR07_FLIR/AEK51_raw"
     else:
-        larchivepath=archivepath+"W7X/QSR07_FLIR/AEK51_raw"
+        larchivepath=archivepath+project+"/QSR07_FLIR/AEK51_raw"
     if type(time_window)==list:
         tstart=time_window[0]
         tstop=time_window[1]
         if tstop<tstart:
-            raise Exception("download_raw_FLIR_images_via_png: endtime before starttime")
+            raise Exception("download_raw_FLIR_images_via_png: t_stop before t_start")
         starttime=int(t1-100+tstart*1e9)
-        endtime=int(t1+tstop*1e9)
+        stoptime=int(t1+tstop*1e9)
 #        stdate=datetime.datetime.utcfromtimestamp((t1-100)/1e9+tstart)
 #        stdate=stdate.isoformat()
 #        enddate=datetime.datetime.utcfromtimestamp((t1)/1e9+tstop)  
@@ -1006,9 +1072,9 @@ def download_raw_FLIR_images_via_png(t1,t6,time_window=0,version=0,threads=1,ver
     else:
         starttime=int(t1-100)
         if time_window==0:
-            endtime=t6
+            stoptime=t6
         else:
-            endtime=int((t1)+time_window*1e9)
+            stoptime=int((t1)+time_window*1e9)
 #        stdate=datetime.datetime.utcfromtimestamp((t1-100)/1e9)
 #        stdate=stdate.isoformat()
 #        if time_window==0:
@@ -1018,14 +1084,14 @@ def download_raw_FLIR_images_via_png(t1,t6,time_window=0,version=0,threads=1,ver
 #            enddate=datetime.datetime.utcfromtimestamp((t1)/1e9+time_window)  
 #            enddate=enddate.isoformat()
         #"2017-11-15 08:00:00"
-    typ1_version=get_latest_version("QSR07_FLIR/AEK51_raw_DATASTREAM",Test=Test,t_from=tstart)
+    typ1_version=get_latest_version("QSR07_FLIR/AEK51_raw_DATASTREAM",testmode=testmode,t_from=tstart)
     if typ1_version==None:
         mode=1
     else:
         mode=2
     if mode==1:
         ### okay the data is stored probably as different sets (so recorded with FLIR software)
-        timess,versions=get_FLIR_Pset_times(starttime,endtime,version,Test=Test)#stdate,enddate,version,Test=Test)
+        timess,versions=get_FLIR_Pset_times(starttime,stoptime,version,testmode=testmode)#stdate,enddate,version,testmode=testmode)
         if verbose>0:
             print("download_raw_FLIR_images_via_png: found {0} frames in the different sets".format([np.shape(x) for x in timess]))
         ### we not know the times for all presets for the program, now we have to download them, if times is not empty
@@ -1052,19 +1118,19 @@ def download_raw_FLIR_images_via_png(t1,t6,time_window=0,version=0,threads=1,ver
 
     return exist,time,frames,mode,tsets,versions
 
-def get_FLIR_Pset_times(stdate,enddate,version=0,verbose=0,Test=True):
+def get_FLIR_Pset_times(stdate,enddate,version=0,verbose=0,testmode=True):
     """
     """
-    if Test:
-        larchivepath="http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"+"W7X/QSR07_FLIR/AEK51_raw"
+    if testmode:
+        larchivepath=testarchivepath+project+"/QSR07_FLIR/AEK51_raw"
     else:
-        larchivepath=archivepath+"W7X/QSR07_FLIR/AEK51_raw"
+        larchivepath=archivepath+project+"/QSR07_FLIR/AEK51_raw"
     if version==0:
         versions=[]
-        versions.append(get_latest_version("QSR07_FLIR/AEK51_raw_PS0_DATASTREAM",Test=Test,t_from=stdate))
-        versions.append(get_latest_version("QSR07_FLIR/AEK51_raw_PS1_DATASTREAM",Test=Test,t_from=stdate))
-        versions.append(get_latest_version("QSR07_FLIR/AEK51_raw_PS2_DATASTREAM",Test=Test,t_from=stdate))
-        versions.append(get_latest_version("QSR07_FLIR/AEK51_raw_PS3_DATASTREAM",Test=Test,t_from=stdate))
+        versions.append(get_latest_version("QSR07_FLIR/AEK51_raw_PS0_DATASTREAM",testmode=testmode,t_from=stdate))
+        versions.append(get_latest_version("QSR07_FLIR/AEK51_raw_PS1_DATASTREAM",testmode=testmode,t_from=stdate))
+        versions.append(get_latest_version("QSR07_FLIR/AEK51_raw_PS2_DATASTREAM",testmode=testmode,t_from=stdate))
+        versions.append(get_latest_version("QSR07_FLIR/AEK51_raw_PS3_DATASTREAM",testmode=testmode,t_from=stdate))
     else:
         versions=[version,version,version,version]
     timess=[]
@@ -1227,28 +1293,33 @@ def download_last_raw_image_by_time(larchivepath,starttime,stoptime,version=0):
         print('download_last_raw_image_by_time: Error querrying {0}\n{1}'.format(url,e))
         return False, [-1]
     
-def download_raw_parlog_by_program(port,program,version=0):
+def download_raw_parlog_by_program(port,program,version=0,testmode=False,verbose=0):
     """
     """
-#    prog=AKF_1.get_program_from_PID(program)
-    try:
-        t_program = AKF_2.get_program_from_to(program)
-        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-#    if prog[0]:
-        starttime=prog[0]['trigger']['1'][0]
-        stoptime=prog[0]['trigger']['6'][0]
-        return download_raw_parlog_by_times(port,starttime,stoptime,version)    
-    except:
+##    prog=AKF_1.get_program_from_PID(program)
+#    try:
+#        t_program = AKF_2.get_program_from_to(program)
+#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+##    if prog[0]:
+#        starttime=prog[0]['trigger']['1'][0]
+#        stoptime=prog[0]['trigger']['6'][0]
+    exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return download_raw_parlog_by_times(port,starttime,stoptime,version,testmode=testmode)    
+    else: #except:
         print("download_raw_parlog_by_program: Error! cannot find the program")
         return False,0,0
     
-def download_raw_parlog_by_times(port,starttime,stoptime,version=0):
+def download_raw_parlog_by_times(port,starttime,stoptime,version=0,testmode=False):
     """
     """
     OP=IR_tools.get_OP_by_time(time_ns=stoptime)
     if version==0:
-        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG",t_from=starttime)
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG/V"+str(version)   
+        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG",t_from=starttime,testmode=testmode)
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG/V"+str(version)
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG/V"+str(version)
     try:
         res = urllib.request.urlopen(larchivepath+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
         signal_list = json.loads(res.read().decode('utf-8'))
@@ -1264,28 +1335,34 @@ def download_raw_parlog_by_times(port,starttime,stoptime,version=0):
         return True, signal_list['dimensions'],signal_list['values'][0]['meta-data']
     
 
-def get_INFRATEC_filter_by_program(program,version=0):
+def get_INFRATEC_filter_by_program(program,port=50,version=0,testmode=False,verbose=0):
     """
     """
-    prog=get_program_from_PID(program)
-#    try:
-#        t_program = AKF_2.get_program_from_to(program)
-#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-    if prog[0]:
-        starttime=prog[1]['trigger']['1'][0]
-        stoptime=prog[1]['trigger']['6'][0]
-        return  get_INFRATEC_filter_by_times(starttime,stoptime,50,version)
+#    prog=get_program_from_PID(program)
+##    try:
+##        t_program = AKF_2.get_program_from_to(program)
+##        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+#    if prog[0]:
+#        starttime=prog[1]['trigger']['1'][0]
+#        stoptime=prog[1]['trigger']['6'][0]
+    exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return  get_INFRATEC_filter_by_times(starttime,stoptime,50,version,testmode=testmode)
     else:#except:
         print("get_INFRATEC_filter_by_program: Error! cannot find the program")
         return False,0,0
 
-def get_INFRATEC_filter_by_times(starttime,stoptime,port=50,version=0):
+def get_INFRATEC_filter_by_times(starttime,stoptime,port=50,version=0,testmode=False):
     """
     """
     OP=IR_tools.get_OP_by_time(time_ns=starttime)
     if version==0:
-        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG",t_from=starttime)
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG/V"+str(version)
+        version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG",t_from=starttime,testmode=testmode)
+    
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG/V"+str(version)
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"raw_PARLOG/V"+str(version)
     try:
         res = urllib.request.urlopen(larchivepath+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
         signal_list = json.loads(res.read().decode('utf-8'))
@@ -1302,164 +1379,194 @@ def get_INFRATEC_filter_by_times(starttime,stoptime,port=50,version=0):
     else:
         return False, 0,-1
     
-def get_exposure_by_program(port,program,version=0):
+def get_exposure_by_program(port,program,version=0,testmode=False,verbose=0):
     """
     """
-    prog=get_program_from_PID(program)
-#    try:
-#        t_program = AKF_2.get_program_from_to(program)
-#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-    if prog[0]:
-        starttime=prog[1]['trigger']['1'][0]
-        stoptime=prog[1]['trigger']['6'][0]
-        return get_exposure_by_times(port,starttime,stoptime,version)
+#    prog=get_program_from_PID(program)
+##    try:
+##        t_program = AKF_2.get_program_from_to(program)
+##        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+#    if prog[0]:
+#        starttime=prog[1]['trigger']['1'][0]
+#        stoptime=prog[1]['trigger']['6'][0]
+    exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return get_exposure_by_times(port,starttime,stoptime,version,testmode=testmode)
     else:
 #    except Exception as E:
         print("get_exposure_by_program: Error! cannot find the program, no exposure time available;")#, E)
         return False,0,0
         
-def get_exposure_by_times(port,starttime,stoptime,version=0):
+def get_exposure_by_times(port,starttime,stoptime,version=0,testmode=False):
     """
     """
     OP=IR_tools.get_OP_by_time(time_ns=stoptime)
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
-    stream=portpathdict[OP]["AEF"+str(port)]+"meta_"
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
+    stream=portpathdict[OP]["AEF"+str(port)]+"meta_"+"DATASTREAM"
     if version==0:
-        version=get_latest_version(stream+"DATASTREAM",t_from=starttime)
+        version=get_latest_version(stream,t_from=starttime, testmode=testmode)
     return read_restdb(larchivepath+"DATASTREAM/V"+str(version)+"/3/exposuretime"+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
       
-def get_camera_temp_by_program(port,program,version=0):
+def get_camera_temp_by_program(port,program,version=0,testmode=False,verbose=0):
     """
     """
-#    prog=AKF_1.get_program_from_PID(program)
-    try:
-        t_program = AKF_2.get_program_from_to(program)
-        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-#    if prog[0]:
-        starttime=prog[0]['trigger']['1'][0]
-        stoptime=prog[0]['trigger']['6'][0]
-        return get_camera_temp_by_times(port,starttime,stoptime,version)
-    except:
+##    prog=AKF_1.get_program_from_PID(program)
+#    try:
+#        t_program = AKF_2.get_program_from_to(program)
+#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+##    if prog[0]:
+#        starttime=prog[0]['trigger']['1'][0]
+#        stoptime=prog[0]['trigger']['6'][0]
+    exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return get_camera_temp_by_times(port,starttime,stoptime,version,testmode=testmode)
+    else: #except:
         print("get_camera_temp_by_program: Error! cannot find the program")
         return False,0,0
         
-def get_camera_temp_by_times(port,starttime,stoptime,version=0):
+def get_camera_temp_by_times(port,starttime,stoptime,version=0,testmode=False):
     """
     """
     OP=IR_tools.get_OP_by_time(time_ns=stoptime)
     stream=portpathdict[OP]["AEF"+str(port)]+"meta_"
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"meta_"
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
     if version==0:
-        version=get_latest_version(stream+"DATASTREAM",t_from=starttime)
+        version=get_latest_version(stream+"DATASTREAM",t_from=starttime,testmode=testmode)
     dummy=read_restdb(larchivepath+"DATASTREAM/V"+str(version)+"/1/cameratemperature/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
     if dummy[0]:
         return dummy
     else:
         return read_restdb(larchivepath+"DATASTREAM/V"+str(version)+"/1/cameratempetarure/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
     
-def get_sensor_temp_by_program(port,program,version=0):
+def get_sensor_temp_by_program(port,program,version=0,testmode=False,verbose=0):
     """
     """
-    prog=get_program_from_PID(program)
-#    try:
-#        t_program = AKF_2.get_program_from_to(program)
-#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-    if prog[0]:
-        starttime=prog[1]['trigger']['1'][0]
-        stoptime=prog[1]['trigger']['6'][0]
-        return get_sensor_temp_by_times(port,starttime,stoptime,version)
+#    prog=get_program_from_PID(program)
+##    try:
+##        t_program = AKF_2.get_program_from_to(program)
+##        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+#    if prog[0]:
+#        starttime=prog[1]['trigger']['1'][0]
+#        stoptime=prog[1]['trigger']['6'][0]
+    exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return get_sensor_temp_by_times(port,starttime,stoptime,version,testmode=testmode)
     else:#except:
         print("get_sensor_temp_by_program: Error! cannot find the program")
         return False,0,0
         
-def get_sensor_temp_by_times(port,starttime,stoptime,version=0):
+def get_sensor_temp_by_times(port,starttime,stoptime,version=0,testmode=False):
     """
     """
     OP=IR_tools.get_OP_by_time(time_ns=stoptime)
     stream=portpathdict[OP]["AEF"+str(port)]+"meta_"
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"meta_"
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
     if version==0:
-        version=get_latest_version(stream+"DATASTREAM",t_from=starttime)
+        version=get_latest_version(stream+"DATASTREAM",t_from=starttime,testmode=testmode)
     return read_restdb(larchivepath+"DATASTREAM/V"+str(version)+"/0/sensortemperature/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
 
-def get_camera_framerate_by_program(port,program,version=0):
+def get_camera_framerate_by_program(port,program,version=0,testmode=False,verbose=0):
     """
     """
-    prog=get_program_from_PID(program)
-#    try:
-#        t_program = AKF_2.get_program_from_to(program)
-#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-    if prog[0]:
-        starttime=prog[1]['trigger']['1'][0]
-        stoptime=prog[1]['trigger']['6'][0]
-        return get_camera_framerate_by_times(port,starttime,stoptime,version)
+#    prog=get_program_from_PID(program)
+##    try:
+##        t_program = AKF_2.get_program_from_to(program)
+##        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+#    if prog[0]:
+#        starttime=prog[1]['trigger']['1'][0]
+#        stoptime=prog[1]['trigger']['6'][0]
+    exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return get_camera_framerate_by_times(port,starttime,stoptime,version,testmode=testmode)
 #    except:
     else:
         print("get_camera_framerate_by_program: Error! cannot find the program")
         return False,0,0
         
-def get_camera_framerate_by_times(port,starttime,stoptime,version=0):
+def get_camera_framerate_by_times(port,starttime,stoptime,version=0,testmode=False):
     """
     """
     OP=IR_tools.get_OP_by_time(time_ns=stoptime)
     stream=portpathdict[OP]["AEF"+str(port)]+"meta_"
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"meta_"
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
     if version==0:
-        version=get_latest_version(stream+"DATASTREAM",t_from=starttime)    
+        version=get_latest_version(stream+"DATASTREAM",t_from=starttime,testmode=testmode)    
     return read_restdb(larchivepath+"DATASTREAM/V"+str(version)+"/2/framerate/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
     
 
-def get_frametype_by_program(port,program,version=0):
+def get_frametype_by_program(port,program,version=0,testmode=False,verbose=0):
     """
     """
-#    prog=AKF_1.get_program_from_PID(program)
-    try:
-        t_program = AKF_2.get_program_from_to(program)
-        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-#    if prog[0]:
-        starttime=prog[0]['trigger']['1'][0]
-        stoptime=prog[0]['trigger']['6'][0]
-        return get_frametype_by_times(port,starttime,stoptime,version)
-    except:
+##    prog=AKF_1.get_program_from_PID(program)
+#    try:
+#        t_program = AKF_2.get_program_from_to(program)
+#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+##    if prog[0]:
+#        starttime=prog[0]['trigger']['1'][0]
+#        stoptime=prog[0]['trigger']['6'][0]
+    exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return get_frametype_by_times(port,starttime,stoptime,version,testmode=testmode)
+    else: #except:
         print("get_frametype_by_program: Error! cannot find the program")
         return False,0,0
         
-def get_frametype_by_times(port,starttime,stoptime,version=0):
+def get_frametype_by_times(port,starttime,stoptime,version=0,testmode=False):
     """
     """
     OP=IR_tools.get_OP_by_time(time_ns=starttime)
     stream=portpathdict[OP]["AEF"+str(port)]+"meta_"
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"meta_"
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
     if version==0:
-        version=get_latest_version(stream+"DATASTREAM",t_from=starttime)    
+        version=get_latest_version(stream+"DATASTREAM",t_from=starttime,testmode=testmode)    
     return read_restdb(larchivepath+"DATASTREAM/V"+str(version)+"/5/frametype/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
     
-def get_framenumber_by_program(port,program,version=0):
+def get_framenumber_by_program(port,program,version=0,testmode=False,verbose=0):
     """
     """
 #    prog=AKF_1.get_program_from_PID(program)
-    try:
-        t_program = AKF_2.get_program_from_to(program)
-        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-#    if prog[0]:
-        starttime=prog[0]['trigger']['1'][0]
-        stoptime=prog[0]['trigger']['6'][0]
-        return get_framenumber_by_times(port,starttime,stoptime,version)
-    except:
+#    try:
+#        t_program = AKF_2.get_program_from_to(program)
+#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+##    if prog[0]:
+#        starttime=prog[0]['trigger']['1'][0]
+#        stoptime=prog[0]['trigger']['6'][0]
+    exist, _, starttime, stoptime = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if exist:
+        return get_framenumber_by_times(port,starttime,stoptime,version,testmode=testmode)
+    else: #except:
         print("get_framenumber_by_program: Error! cannot find the program")
         return False,0,0
         
-def get_framenumber_by_times(port,starttime,stoptime,version=0):
+def get_framenumber_by_times(port,starttime,stoptime,version=0,testmode=False):
     """
     """
     OP=IR_tools.get_OP_by_time(time_ns=starttime)
     stream=portpathdict[OP]["AEF"+str(port)]+"meta_"
-    larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(port)]+"meta_"
+    if testmode:
+        larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
+    else:
+        larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+"meta_" 
     if version==0:
-        version=get_latest_version(stream+"DATASTREAM",t_from=starttime)    
+        version=get_latest_version(stream+"DATASTREAM",t_from=starttime,testmode=testmode)    
     return read_restdb(larchivepath+"DATASTREAM/V"+str(version)+"/4/framenumber/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
 
-def get_average_divertor_TC_for_camtemp(port,starttime,endtime,part="all",TC=0):
+def get_average_divertor_TC_for_camtemp(port,starttime,stoptime,part="all",TC=0):
     """
     """
     urlstart="http://archive-webapi.ipp-hgw.mpg.de/ArchiveDB/raw/W7X/CoDaStationDesc.115/"
@@ -1520,7 +1627,7 @@ def get_average_divertor_TC_for_camtemp(port,starttime,endtime,part="all",TC=0):
                 i+=1
             url=urlstart+str(offset+i)+ext+"0"+str(i)+"_TC"+str(i%8+1)
             try:
-                result=read_restdb(url+"/_signal.json?from="+str(starttime)+"&upto="+str(endtime))
+                result=read_restdb(url+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
     #                res.append(result)
                 if result[0]:
                     n+=1            
@@ -1553,22 +1660,24 @@ def get_divertor_TC_coordinate(cameraport,TC=0):
         raise Exception("get_divertor_TC_coordinate: unknown port!")    
     return TC_database[portnr][TC]
 
-def get_TC_data_for_port_by_program(port,program,part=0,version=0):
+def get_TC_data_for_port_by_program(port,program,part=0,version=0,verbose=0):
     """
     """
-#    prog=AKF_1.get_program_from_PID(program)
-    try:
-        t_program = AKF_2.get_program_from_to(program)
-        prog =AKF_2.get_program_list(t_program[0], t_program[1])
-#    if prog[0]:
-        starttime=prog[0]['trigger']['1'][0]
-        stoptime=prog[0]['trigger']['6'][0]
+##    prog=AKF_1.get_program_from_PID(program)
+#    try:
+#        t_program = AKF_2.get_program_from_to(program)
+#        prog =AKF_2.get_program_list(t_program[0], t_program[1])
+##    if prog[0]:
+#        starttime=prog[0]['trigger']['1'][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)
-    except:
+    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,endtime,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/"
@@ -1584,7 +1693,7 @@ def get_TC_data_for_port(port,starttime,endtime,part=0,version=0):
                 for chi in range(len(thisTCchannel[0])):            
                     url=urlstart+str(thisTCchannel[0][chi])+"/"+thisTCchannel[1][chi]
                     try:
-                        result=read_restdb(url+"/_signal.json?from="+str(starttime)+"&upto="+str(endtime))
+                        result=read_restdb(url+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
                         if result[0]:
                             n+=1            
                             time=result[1]
@@ -1599,7 +1708,7 @@ def get_TC_data_for_port(port,starttime,endtime,part=0,version=0):
                 try:
                     url=urlstart+str(thisTCchannel[0][part-1])+"/"+thisTCchannel[1][part-1]
                     try:
-                        result=read_restdb(url+"/_signal.json?from="+str(starttime)+"&upto="+str(endtime))
+                        result=read_restdb(url+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
                         if result[0]:
                             n+=1            
                             time=result[1]
@@ -1659,88 +1768,92 @@ def check_temperature_range(time,maxvalue_C,minvalue_C,port,exposure,cfilter=0):
         
 
 def get_temp_from_raw_by_program_V1(portnr,program,time_window=0,emi=0.8,divertorpart="all",
-                                    version=0,intervalSize=1E9,give_ERROR=False,verbose=0):
+                                    version=0,intervalSize=1E9,give_ERROR=False,testmode=False,verbose=0):
     """
     """
-    background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,program=program,emissivity=emi,T_version=1,version=version,verbose=verbose-1)
-#    prog=AKF_1.get_program_from_PID(program)
-    try:
-        t_program = AKF_2.get_program_from_to(program)
-        prog = AKF_2.get_program_list(t_program[0], t_program[1])
-#    if prog[0]:
-#        t0=prog[1]['trigger']['0'][0]
-        t1=prog[0]['trigger']['1'][0]
-        t6=prog[0]['trigger']['6'][0]
-        starttime=t1-10
-        if type(time_window)==list:
-            tstart=time_window[0]
-            tstop=time_window[1]
-            if tstop<tstart:
-                raise Exception("get_temp_from_raw_by_program_V1: endtime before starttime")
-            stoptime=int(starttime+tstop*1e9)  
-            starttime=int(starttime+tstart*1e9)        
+    
+##    prog=AKF_1.get_program_from_PID(program)
+#    try:
+#        t_program = AKF_2.get_program_from_to(program)
+#        prog = AKF_2.get_program_list(t_program[0], t_program[1])
+##    if prog[0]:
+##        t0=prog[1]['trigger']['0'][0]
+#        t1=prog[0]['trigger']['1'][0]
+#        t6=prog[0]['trigger']['6'][0]
+    exist, t0, t1, t6 = get_trigger_from_PID(program, portnr, testmode, verbose=verbose-1)
+    if not exist:
+        print("get_temp_from_raw_by_program_V1: Error! cannot find program")
+        return False,0,-1,False
+    
+    background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,t0=t0,t1=t1,t6=t6,emissivity=emi,T_version=1,version=version,testmode=testmode,verbose=verbose-1)
+    starttime=t1-10
+    if type(time_window)==list:
+        tstart=time_window[0]
+        tstop=time_window[1]
+        if tstop<tstart:
+            raise Exception("get_temp_from_raw_by_program_V1: t_stop before t_start")
+        stoptime=int(starttime+tstop*1e9)  
+        starttime=int(starttime+tstart*1e9)        
+    else:
+        if time_window==0:                                
+            stoptime=t6
         else:
-            if time_window==0:                                
-                stoptime=t6
-            else:
-                stoptime=int(starttime+time_window*1e9)
-        success=True
+            stoptime=int(starttime+time_window*1e9)
+    success=True
+    if verbose>0:
+        print(datetime.datetime.now(),"get_temp_from_raw_by_program_V1: Start download of raw images")
+    if (stoptime-starttime)/intervalSize>1:        
+        nrinterv=int(np.ceil((stoptime-starttime)/intervalSize))
         if verbose>0:
-            print(datetime.datetime.now(),"get_temp_from_raw_by_program_V1: Start download of raw images")
-        if (stoptime-starttime)/intervalSize>1:        
-            nrinterv=int(np.ceil((stoptime-starttime)/intervalSize))
-            if verbose>0:
-                print("get_temp_from_raw_by_program_V1: time_window too large, splitting into {0} smaller fractions".format(nrinterv))
-            intervalls=[]
-            for i in range(nrinterv):
-                intervalls.append(int(starttime-10+i*intervalSize))
-            intervalls.append(stoptime)
-            temperatureimages=[]
-            times=[]
-            for i in range(nrinterv):                            
-                raw_dl=download_raw_images_by_times(portnr,intervalls[i],intervalls[i+1],version,intervalSize,verbose=verbose-1)
-                print(datetime.datetime.now(),"get_temp_from_raw_by_program_V1: download of raw images part {0} of {1} finished".format(i+1, nrinterv))
-                if raw_dl[0]:
-                    time=raw_dl[1]
-                    images=raw_dl[2]
-                    del raw_dl
-#                    images=images.swapaxes(1,2)
-                    images=[im.swapaxes(0,1) for im in images]
-                    sucess,images=apply_calib_on_raw(images,background,LUT,refT,gain,offset,True,verbose=verbose-1)                                        
-                    temperatureimages=temperatureimages+images
-                    times=times+time                                        
-                    del time,images
-                else:
-                    raise Exception("get_temp_from_raw_by_program_V1: cannot download the raw images")
-        else:
-            raw_dl=download_raw_images_by_times(portnr,starttime,stoptime,version,intervalSize,verbose=verbose-1)
+            print("get_temp_from_raw_by_program_V1: time_window too large, splitting into {0} smaller fractions".format(nrinterv))
+        intervalls=[]
+        for i in range(nrinterv):
+            intervalls.append(int(starttime-10+i*intervalSize))
+        intervalls.append(stoptime)
+        temperatureimages=[]
+        times=[]
+        for i in range(nrinterv):                            
+            raw_dl=download_raw_images_by_times(portnr,intervalls[i],intervalls[i+1],version,intervalSize,testmode=testmode,verbose=verbose-1)
+            print(datetime.datetime.now(),"get_temp_from_raw_by_program_V1: download of raw images part {0} of {1} finished".format(i+1, nrinterv))
             if raw_dl[0]:
-                times=raw_dl[1]
-                temperatureimages=raw_dl[2]
+                time=raw_dl[1]
+                images=raw_dl[2]
                 del raw_dl
-#                temperatureimages=temperatureimages.swapaxes(1,2)
-                temperatureimages=[im.swapaxes(0,1) for im in temperatureimages]
-                if give_ERROR:
-                    success,temperatureimages,error_images=apply_calib_on_raw(temperatureimages,background,LUT,refT,gain,offset,gain_error,offset_error,True,give_ERROR,verbose=verbose-1)
-                else:
-                    success,temperatureimages=apply_calib_on_raw(temperatureimages,background,LUT,refT,gain,offset,gain_error,offset_error,True,give_ERROR,verbose=verbose-1)
+#                    images=images.swapaxes(1,2)
+                images=[im.swapaxes(0,1) for im in images]
+                sucess,images=apply_calib_on_raw(images,background,LUT,refT,gain,offset,True,verbose=verbose-1)                                        
+                temperatureimages=temperatureimages+images
+                times=times+time                                        
+                del time,images
             else:
                 raise Exception("get_temp_from_raw_by_program_V1: cannot download the raw images")
-        valid=True
-        for i in range(len(temperatureimages)):
-            try:
-                check_temperature_range(times[0],np.max(temperatureimages)-273.15,np.min(temperatureimages)-273.15,portnr,t_exp,cfilter)
-            except Exception as E:
-                print("get_temp_from_raw_by_program_V1: Error! ",E)
-                valid=False
-                i=len(temperatureimages)
-        if give_ERROR:
-            return success,times,temperatureimages,valid,error_images
+    else:
+        raw_dl=download_raw_images_by_times(portnr,starttime,stoptime,version,intervalSize,testmode=testmode,verbose=verbose-1)
+        if raw_dl[0]:
+            times=raw_dl[1]
+            temperatureimages=raw_dl[2]
+            del raw_dl
+#                temperatureimages=temperatureimages.swapaxes(1,2)
+            temperatureimages=[im.swapaxes(0,1) for im in temperatureimages]
+            if give_ERROR:
+                success,temperatureimages,error_images=apply_calib_on_raw(temperatureimages,background,LUT,refT,gain,offset,gain_error,offset_error,True,give_ERROR,verbose=verbose-1)
+            else:
+                success,temperatureimages=apply_calib_on_raw(temperatureimages,background,LUT,refT,gain,offset,gain_error,offset_error,True,give_ERROR,verbose=verbose-1)
         else:
-            return success,times,temperatureimages,valid          
-    except:
-        print("get_temp_from_raw_by_program_V1: Error! cannot find program")
-        return False,0,-1,False
+            raise Exception("get_temp_from_raw_by_program_V1: cannot download the raw images")
+    valid=True
+    for i in range(len(temperatureimages)):
+        try:
+            check_temperature_range(times[0],np.max(temperatureimages)-273.15,np.min(temperatureimages)-273.15,portnr,t_exp,cfilter)
+        except Exception as E:
+            print("get_temp_from_raw_by_program_V1: Error! ",E)
+            valid=False
+            i=len(temperatureimages)
+    if give_ERROR:
+        return success,times,temperatureimages,valid,error_images
+    else:
+        return success,times,temperatureimages,valid          
+        
 
 def get_temp_from_raw_by_program_V2(portnr,program,time_window=0,emi=0.8,version=0,
                                     threads=1,give_ERROR=False,use_firstframe_as_background=False,
@@ -1756,200 +1869,200 @@ def get_temp_from_raw_by_program_V2(portnr,program,time_window=0,emi=0.8,version
 def get_temp_from_raw_by_program(portnr,program,time_window=0,emi=0.8,T_version=2,
                                  version=0,threads=1,give_ERROR=False,
                                  use_firstframe_as_background=False,back_emissivity=0.8,
-                                 verbose=0,Test=False,framerate='max'):
+                                 verbose=0,testmode=False,framerate='max'):
     """
     """
     FLIR=False
-    prog=get_program_from_PID(program)
-    if prog[0]:
-        t1=prog[1]['trigger']['1'][0]
-        t6=prog[1]['trigger']['6'][0]
-        success=True
-        OP=IR_tools.get_OP_by_time(time_ns=t1)
-        if type(portnr) is str:
-            try:
-                camera=portcamdict[OP][portnr]
-                if camera.split("_")[0]=='FLIR':
-                    FLIR=True
+    trigger_exist, t0, t1, t6 = get_trigger_from_PID(program, portnr, testmode, verbose=verbose-1)
+    if not trigger_exist:
+        raise Exception("get_temp_from_raw_by_program: unknown Program")
+    
+    success=True
+    OP=IR_tools.get_OP_by_time(time_ns=t1)
+    if type(portnr) is str:
+        try:
+            camera=portcamdict[OP][portnr]
+            if camera.split("_")[0]=='FLIR':
+                FLIR=True
+            else:
+                FLIR=False
+                portnr=int(portnr.split("AEF")[1])
+        except Exception as E:
+            raise Exception("get_temp_from_raw_by_program: unknown Port!"+E)
+    elif isinstance(portnr, (int, np.integer, float, np.float)):
+        FLIR=False
+        portnr=int(portnr)
+    else:
+        raise Exception("get_temp_from_raw_by_program: the given port is neither a number or a valid String!")
+    
+    if FLIR:
+        # --- Glens FLIR camera ---
+        #
+        # get raw data
+        exist,time,frames,mode,tsets,versions=download_raw_FLIR_images_via_png(t1=t1,t6=t6,time_window=time_window,version=version,threads=threads,verbose=verbose-1,testmode=testmode)
+        if not exist:
+            print("get_temp_from_raw_by_program: Error! FLIR data not found")
+            return False,[0],[0],[]
+        # get calibration
+        if mode==1:
+            Psets=IR_tools.check_dublicates(tsets)
+            Radi_Co=[]
+            Temp_Co=[]
+            if len(Psets)==1:
+                # single exposure time case
+                PS=Psets[0]
+                if testmode:
+                    parlog=read_restdb_old(testarchivepath+"W7X/QSR07_FLIR/AEK51_raw_PS"+str(PS)+"_PARLOG/V"+str(versions[PS])+"/_signal.json?from="+str(t1-10)+"&upto="+str(t6+20))                                
                 else:
-                    FLIR=False
-                    portnr=int(portnr.split("AEF")[1])
-                goon=True
-            except Exception as E:
-                raise Exception("get_temp_from_raw_by_program: unknown Port!"+E)
-        elif isinstance(portnr, (int, np.integer, float, np.float)):
-            FLIR=False
-            goon=True
-            portnr=int(portnr)
-        else:
-            goon=False        
-        if not goon:
-            raise Exception("get_temp_from_raw_by_program: the given port is neither a number or a valid String!")
-        else:
-            if FLIR:                
-                exist,time,frames,mode,tsets,versions=download_raw_FLIR_images_via_png(t1=t1,t6=t6,time_window=time_window,version=version,threads=threads,verbose=verbose-1,Test=Test)
-                if exist:
-                    if mode==1:
-                        Psets=IR_tools.check_dublicates(tsets)
-                        Radi_Co=[]
-                        Temp_Co=[]
-                        if len(Psets)==1:
-                            single=True
-                        else:
-                            single=False
-                        if single:
-                            PS=Psets[0]
-                            if Test:
-                                parlog=read_restdb_old("http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"+"W7X/QSR07_FLIR/AEK51_raw_PS"+str(PS)+"_PARLOG/V"+str(versions[PS])+"/_signal.json?from="+str(t1-10)+"&upto="+str(t6+20))                                
-                            else:
-                                parlog=read_restdb_old(archivepath+"W7X/QSR07_FLIR/AEK51_raw_PS"+str(PS)+"_PARLOG/V"+str(versions[PS])+"/_signal.json?from="+str(t1-10)+"&upto="+str(t6+20))
-                            tsets=[0 for i in range(len(frames))]                            
-                            if parlog[0]:                             
-                                pari=parlog[2][0]['meta-data']
-                                ipi=0
-                                for inti in range(4):
-                                    try:
-                                        dummy=pari['ITime_'+str(inti)]
-                                        ipi=inti
-                                        break
-                                    except:
-                                        ipi=-1
-                                c1=[float(pari['Coeff0_'+str(ipi)].split("\n")[0]),float(pari['Coeff1_'+str(ipi)].split("\n")[0])]
-                                c2=[float(pari['TempCoeff'+str(x)+'_'+str(ipi)].split("\n")[0]) for x in range(7)]
-                                Radi_Co.append(c1)
-                                Temp_Co.append(c2)
-                            else:
-                                Radi_Co.append([])
-                                Temp_Co.append([])
-                        else:
-                            for PS in range(4):                            
-                                if PS in Psets: 
-                                    if Test:
-                                        parlog=read_restdb_old("http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"+"W7X/QSR07_FLIR/AEK51_raw_PS"+str(PS)+"_PARLOG/V"+str(versions[PS])+"/_signal.json?from="+str(t1-10)+"&upto="+str(t6+20))
-                                    else:
-                                        parlog=read_restdb_old(archivepath+"W7X/QSR07_FLIR/AEK51_raw_PS"+str(PS)+"_PARLOG/V"+str(versions[PS])+"/_signal.json?from="+str(t1-10)+"&upto="+str(t6+20))
-                                    if parlog[0]:                                    
-                                        pari=parlog[2][0]['meta-data']                                    
-                                        c1=[float(pari['Coeff0_'+str(PS)].split("\n")[0]),float(pari['Coeff1_'+str(PS)].split("\n")[0])]
-                                        c2=[float(pari['TempCoeff'+str(x)+'_'+str(PS)].split("\n")[0]) for x in range(7)]
-                                        Radi_Co.append(c1)
-                                        Temp_Co.append(c2)
-                                    else:
-                                        Radi_Co.append([])
-                                        Temp_Co.append([])
-                                else:
-                                    Radi_Co.append([])
-                                    Temp_Co.append([])
-                        ### got the raw, knowing which frame needs which calibration, got the calibration, now we have to transform it
-                        if verbose>0:
-                            print(datetime.datetime.now(),"get_temp_from_raw_by_program: Converting the raw data into temperature, number of frames:",len(frames))
-                        for i in range(len(frames)):
-                            try:
-                                frames[i]=Radi_Co[tsets[i]][0]+frames[i]*Radi_Co[tsets[i]][1]
-                                dummy=frames[i]
-                                temp=Temp_Co[tsets[i]][0]+Temp_Co[tsets[i]][1]*dummy
-                                for expo in range(2,7):
-                                    temp=temp+Temp_Co[tsets[i]][expo]*np.power(dummy,expo)
-                                frames[i]=temp+273.15
-                            except Exception as E:
-                                print('get_temp_from_raw_by_program: Error in frame {0}! {1}'.format(i,E))
-                                print('                              (len(tsets) {0},Radi_Co[tsets[i]] {1},Temp_Co[tsets[i]] {2})'.format(len(tsets),Radi_Co[tsets[i]],Temp_Co[tsets[i]]))
-                        if verbose>0:
-                            print(datetime.datetime.now(),"get_temp_from_raw_by_program: temperature frames done")
-                        return exist,time,frames,tsets
-                    elif mode==2:
-                        
-                        raise Exception("get_temp_from_raw_by_program: not implemented in mode 2")
-                    else:
-                        raise Exception("get_temp_from_raw_by_program: FLIR evaluation, This case should not be possible.")
+                    parlog=read_restdb_old(archivepath+"W7X/QSR07_FLIR/AEK51_raw_PS"+str(PS)+"_PARLOG/V"+str(versions[PS])+"/_signal.json?from="+str(t1-10)+"&upto="+str(t6+20))
+                tsets=[0 for i in range(len(frames))]                            
+                if parlog[0]:                             
+                    pari=parlog[2][0]['meta-data']
+                    ipi=0
+                    for inti in range(4):
+                        try:
+                            dummy=pari['ITime_'+str(inti)]
+                            ipi=inti
+                            break
+                        except:
+                            ipi=-1
+                    c1=[float(pari['Coeff0_'+str(ipi)].split("\n")[0]),float(pari['Coeff1_'+str(ipi)].split("\n")[0])]
+                    c2=[float(pari['TempCoeff'+str(x)+'_'+str(ipi)].split("\n")[0]) for x in range(7)]
+                    Radi_Co.append(c1)
+                    Temp_Co.append(c2)
                 else:
-                    print("get_temp_from_raw_by_program: Error! FLIR data not found")
-                    return False,[0],[0],[]
+                    Radi_Co.append([])
+                    Temp_Co.append([])
             else:
-                cexist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,program=program,emissivity=emi,T_version=T_version,version=version,back_emissivity=back_emissivity,verbose=verbose-1)
-                if not cexist:
-                    if verbose>0:
-                        print("get_temp_from_raw_by_program: Unable to load the complete calibration data for",program," please confirm that this data was uploaded")
-                    return False,[0],[0],False
-                else: 
-                    if version==0:
-                        version=get_latest_version(portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM",program=program)
-                    larchivepath=archivepath+"W7X/"+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)
-                    else:
-                        exist,time,frames=download_raw_images_by_program(portnr,program,time_window,version,verbose=verbose-1)
-                        if exist:
-                            frames=[im.swapaxes(0,1) for im in frames]
+                # multi exposure time case
+                for PS in range(4):                            
+                    if PS in Psets: 
+                        if testmode:
+                            parlog=read_restdb_old(testarchivepath+"W7X/QSR07_FLIR/AEK51_raw_PS"+str(PS)+"_PARLOG/V"+str(versions[PS])+"/_signal.json?from="+str(t1-10)+"&upto="+str(t6+20))
                         else:
-                            raise Exception("get_temp_from_raw_by_program: no data found")
-                    if not exist:
-                        raise Warning("get_temp_from_raw_by_program: data not found in database!")
-                        return False,[0],[0],False
-                    else:
-                        if verbose>0:
-                            print(datetime.datetime.now(),"get_temp_from_raw_by_program: raw download finished")
-                        FOV=get_FOV_mask(portnr)    
-                        if use_firstframe_as_background:
-                            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)
-                        else:
-                            success,frames=apply_calib_on_raw(frames,background,LUT,refT,gain,offset,gain_error,offset_error,False,give_ERROR,verbose=verbose-1)
-                        if verbose>0:
-                            print(datetime.datetime.now(),"get_temp_from_raw_by_program: Temperature calculation done")
-                        if not success:
-                            if verbose>0:
-                                print("calculation of the temperature failed, calibration could not be applied")
-                            return False,time,frames,False
+                            parlog=read_restdb_old(archivepath+"W7X/QSR07_FLIR/AEK51_raw_PS"+str(PS)+"_PARLOG/V"+str(versions[PS])+"/_signal.json?from="+str(t1-10)+"&upto="+str(t6+20))
+                        if parlog[0]:                                    
+                            pari=parlog[2][0]['meta-data']                                    
+                            c1=[float(pari['Coeff0_'+str(PS)].split("\n")[0]),float(pari['Coeff1_'+str(PS)].split("\n")[0])]
+                            c2=[float(pari['TempCoeff'+str(x)+'_'+str(PS)].split("\n")[0]) for x in range(7)]
+                            Radi_Co.append(c1)
+                            Temp_Co.append(c2)
                         else:
-                            
-                            for i in range(len(frames)):
-                                frames[i]=(frames[i]*FOV).astype(np.float32)
-                            
-#                            if portnr!=50:
-                            if verbose>0:
-                                print(datetime.datetime.now(),"get_temp_from_raw_by_program: correcting bad pixels")
-                            frames=IR_tools.correct_images(frames,badpixels)
-                            if verbose>0:
-                                print(datetime.datetime.now(),"get_temp_from_raw_by_program: checking temperaturerange")
-                            valid=True
-                        #    for i in range(len(frames)):
-            #                try:
-            #                    check_temperature_range(time[0],np.max(frames)-273.15,np.min(frames[:][np.nonzero(frames[i])])-273.15,portnr,t_exp,cfilter)
-            #                except Exception as E:
-            #                    print(E)
-            #                    valid=False
-                        #        i=len(frames)
-                            date=int(program.split(".")[0])
-                            if date>20180712 and date<20180720:
-#                                prog=get_program_from_PID(program)
-                                if prog[0]:
-                        #            t0time=prog[1]['trigger']['0'][0]
-                                    starttime=t1#prog[1]['trigger']['1'][0]
-                                    toff=time[0]-starttime
-                                    if toff>10e6:
-                                        print("get_temp_from_raw_by_program: time offset of {0}ns detected, correcting".format(toff))
-                                        time[:]=time[:]-toff
-                            if give_ERROR:
-                                return exist,time,frames,valid,error_images
-                            else:
-                                return exist,time,frames,valid
+                            Radi_Co.append([])
+                            Temp_Co.append([])
+                    else:
+                        Radi_Co.append([])
+                        Temp_Co.append([])
+            # got the raw, knowing which frame needs which calibration, got the calibration, now we have to transform it
+            if verbose>0:
+                print(datetime.datetime.now(),"get_temp_from_raw_by_program: Converting the raw data into temperature, number of frames:",len(frames))
+            for i in range(len(frames)):
+                try:
+                    frames[i]=Radi_Co[tsets[i]][0]+frames[i]*Radi_Co[tsets[i]][1]
+                    dummy=frames[i]
+                    temp=Temp_Co[tsets[i]][0]+Temp_Co[tsets[i]][1]*dummy
+                    for expo in range(2,7):
+                        temp=temp+Temp_Co[tsets[i]][expo]*np.power(dummy,expo)
+                    frames[i]=temp+273.15
+                except Exception as E:
+                    print('get_temp_from_raw_by_program: Error in frame {0}! {1}'.format(i,E))
+                    print('                              (len(tsets) {0},Radi_Co[tsets[i]] {1},Temp_Co[tsets[i]] {2})'.format(len(tsets),Radi_Co[tsets[i]],Temp_Co[tsets[i]]))
+            if verbose>0:
+                print(datetime.datetime.now(),"get_temp_from_raw_by_program: temperature frames done")
+            return exist,time,frames,tsets
+        elif mode==2:
+            raise Exception("get_temp_from_raw_by_program: not implemented in mode 2")
+        else:
+            raise Exception("get_temp_from_raw_by_program: FLIR evaluation, This case should not be possible.")
+        
     else:
-        raise Exception("get_temp_from_raw_by_program: unknown Program")
+        # --- IRcam case ---
+        #
+        # get calibration data
+        cexist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,t0=t0,t1=t1,t6=t6,emissivity=emi,T_version=T_version,version=version,back_emissivity=back_emissivity,testmode=testmode,verbose=verbose-1)
+        if not cexist:
+            if verbose>0:
+                print("get_temp_from_raw_by_program: Unable to load the complete calibration data for",program," please confirm that this data was uploaded")
+            return False,[0],[0],False
+        # get raw data from latest or requested version
+        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"
+        else:
+            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)
+        else:
+            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]
+        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)    
+        if use_firstframe_as_background:
+            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)
+        else:
+            success,frames=apply_calib_on_raw(frames,background,LUT,refT,gain,offset,gain_error,offset_error,False,give_ERROR,verbose=verbose-1)
+        if verbose>0:
+            print(datetime.datetime.now(),"get_temp_from_raw_by_program: Temperature calculation done")
+        if not success:
+            if verbose>0:
+                print("calculation of the temperature failed, calibration could not be applied")
+            return False,time,frames,False
+        
+        # crop to FOV
+        for i in range(len(frames)):
+            frames[i]=(frames[i]*FOV).astype(np.float32)
+        # correct bad pixels
+        if verbose>0:
+            print(datetime.datetime.now(),"get_temp_from_raw_by_program: correcting bad pixels")
+        frames=IR_tools.correct_images(frames,badpixels)
+        
+        # TODO: check temperature range for saturation and mark frames as not valid
+        #
+#        if verbose>0:
+#            print(datetime.datetime.now(),"get_temp_from_raw_by_program: checking temperaturerange")
+        valid=True
+#        for i in range(len(frames)):
+#                try:
+#                    check_temperature_range(time[0],np.max(frames)-273.15,np.min(frames[:][np.nonzero(frames[i])])-273.15,portnr,t_exp,cfilter)
+#                except Exception as E:
+#                    print(E)
+#                    valid=False
+#                    i=len(frames)
+        # check for time vector offsets
+        date=int(program.split(".")[0])
+        if date>20180712 and date<20180720:
+            toff=time[0]-t1
+            if toff>10e6:
+                print("get_temp_from_raw_by_program: time offset of {0}ns detected, correcting".format(toff))
+                time[:]=time[:]-toff
+        if give_ERROR:
+            return exist,time,frames,valid,error_images
+        else:
+            return exist,time,frames,valid
+    
 
 def get_temp_from_raw_by_program_fullthreads(portnr,program,time_window=0,emi=0.8,
                                              T_version=2,version=0,threads=1,
-                                             give_ERROR=False,check_range=True,verbose=0):
+                                             give_ERROR=False,check_range=True,
+                                             testmode=False,verbose=0):
     """
     """
     if threads==1 or not fastDL:
         return get_temp_from_raw_by_program(portnr,program,time_window,emi,
                                             T_version,version,threads,give_ERROR,
-                                            verbose=verbose-1)
+                                            testmode=testmode, verbose=verbose-1)
     else:
         if type(portnr) is str:
             try:
@@ -1970,22 +2083,27 @@ def get_temp_from_raw_by_program_fullthreads(portnr,program,time_window=0,emi=0.
         else:
             goon=False 
         if goon and not FLIR:
-            exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,program=program,emissivity=emi,T_version=T_version,version=version,verbose=verbose-1)
-            FOV=get_FOV_mask(portnr)        
-            prog=get_program_from_PID(program)
-            if prog[0]:
-                starttime=prog[1]['trigger']['1'][0]
-                stoptime=prog[1]['trigger']['6'][0]
+#            prog=get_program_from_PID(program)
+#            if prog[0]:
+#                starttime=prog[1]['trigger']['1'][0]
+#                stoptime=prog[1]['trigger']['6'][0]
+            exist, t0, starttime, stoptime = get_trigger_from_PID(program, portnr, testmode, verbose=verbose-1)
+            if exist:
+                exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,t0=t0,t1=starttime,t6=stoptime,emissivity=emi,T_version=T_version,version=version,testmode=testmode,verbose=verbose-1)
+                FOV=get_FOV_mask(portnr)
                 success=True
                 OP=IR_tools.get_OP_by_time(time_ns=starttime)
                 if version==0:
-                    version=get_latest_version(portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM",program=program)
-                larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
+                    version=get_latest_version(portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM",program=program,testmode=testmode)
+                if testmode:
+                    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"
                 if type(time_window)==list:
                     tstart=time_window[0]
                     tstop=time_window[1]
                     if tstop<tstart:
-                        raise Exception("get_temp_from_raw_by_program_fullthreads: endtime before starttime")
+                        raise Exception("get_temp_from_raw_by_program_fullthreads: t_stop before t_start")
                     stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9+tstart)
                     stdate=stdate.isoformat()
                     enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+tstop)  
@@ -2064,16 +2182,18 @@ def get_temp_from_raw_by_program_fullthreads(portnr,program,time_window=0,emi=0.
 
 def get_nuced_raw_by_program(portnr,program,time_window=0,version=0,
                              emi=1,T_version=2,threads=1,
-                             give_ERROR=False,verbose=0):
+                             give_ERROR=False,testmode=False,verbose=0):
     """
     """
-    exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,program=program,emissivity=emi,T_version=T_version,version=version,verbose=verbose-1)
+    # get calibration data
+    exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,program=program,emissivity=emi,T_version=T_version,version=version,testmode=testmode,verbose=verbose-1)
     if verbose>0:
         print(datetime.datetime.now(),"get_nuced_raw_by_program: raw download start")
     if fastDL: 
-        exist,time,frames=download_raw_images_by_program_via_png(portnr,program,time_window,version,threads,verbose=verbose-1)
+        exist,time,frames=download_raw_images_by_program_via_png(portnr,program,time_window,version,
+                                                                 threads,testmode=testmode,verbose=verbose-1)
     else:
-        exist,time,frames=download_raw_images_by_program(portnr,program,time_window,version,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]
         else:
@@ -2102,97 +2222,106 @@ def get_nuced_raw_by_program(portnr,program,time_window=0,version=0,
 
 def get_nuced_raw_by_program_fullthreads(portnr,program,time_window=0,emi=0.8,
                                          T_version=2,version=1,threads=1,
-                                         give_ERROR=False,check_range=True,verbose=0):
-    """
-    """
-    prog=get_program_from_PID(program)
-    if prog[0]:        
-        starttime=prog[1]['trigger']['1'][0]
-        stoptime=prog[1]['trigger']['6'][0]
-        if threads==1 or not fastDL:
-            return get_nuced_raw_by_program(portnr,program,
-                                            time_window=time_window,emi=emi,
-                                            T_version=T_version,version=version,
-                                            threads=threads,give_ERROR=give_ERROR,
-                                            verbose=verbose-1)
+                                         give_ERROR=False,check_range=True,
+                                         testmode=False,verbose=0):
+    """
+    """
+#    prog=get_program_from_PID(program)
+#    if prog[0]:        
+#        starttime=prog[1]['trigger']['1'][0]
+#        stoptime=prog[1]['trigger']['6'][0]
+    exist, t0, starttime, stoptime = get_trigger_from_PID(program, portnr, testmode, verbose=verbose-1)
+    if not exist:
+        print('get_nuced_raw_by_program_fullthreads: Error! no trigger timestamps found')
+        return False, None, None, None
+    
+    if threads==1 or not fastDL:
+        return get_nuced_raw_by_program(portnr,program,
+                                        time_window=time_window,emi=emi,
+                                        T_version=T_version,version=version,
+                                        threads=threads,give_ERROR=give_ERROR,
+                                        testmode=testmode, verbose=verbose-1)
+    else:
+        exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,t0=t0,t1=starttime,t6=stoptime,emissivity=emi,T_version=T_version,version=version,testmode=testmode,verbose=verbose-1)
+        FOV=get_FOV_mask(portnr)        
+        success=True
+        OP=IR_tools.get_OP_by_time(time_ns=starttime)
+        if verbose>0:
+            print('get_nuced_raw_by_program_fullthreads: prepare loading images by threads')
+        if version==0:
+            version=get_latest_version(portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM",t_from=starttime,testmode=testmode)
+        if testmode:
+            larchivepath=testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
         else:
-            exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,program=program,emissivity=emi,T_version=T_version,version=version,verbose=verbose-1)
-            FOV=get_FOV_mask(portnr)        
-            success=True
-            OP=IR_tools.get_OP_by_time(time_ns=starttime)
-            if verbose>0:
-                print('get_nuced_raw_by_program_fullthreads: prepare loading images by threads')
-            if version==0:
-                version=get_latest_version(portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM",t_from=starttime)
-            larchivepath=archivepath+"W7X/"+portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
-            if type(time_window)==list:
-                tstart=time_window[0]
-                tstop=time_window[1]
-                if tstop<tstart:
-                    raise Exception("get_nuced_raw_by_program_fullthreads: endtime before starttime")
-                stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9+tstart)
-                stdate=stdate.isoformat()
-                enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+tstop)  
+            larchivepath=archivepath+project+"/"+portpathdict[OP]["AEF"+str(portnr)]+"raw_DATASTREAM/V"+str(version)+"/0/raw"
+        if type(time_window)==list:
+            tstart=time_window[0]
+            tstop=time_window[1]
+            if tstop<tstart:
+                raise Exception("get_nuced_raw_by_program_fullthreads: t_stop before t_start")
+            stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9+tstart)
+            stdate=stdate.isoformat()
+            enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+tstop)  
+            enddate=enddate.isoformat()
+        else:
+            stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9)
+            stdate=stdate.isoformat()
+            if time_window==0:
+                enddate=datetime.datetime.utcfromtimestamp(stoptime/1e9)        
                 enddate=enddate.isoformat()
             else:
-                stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9)
-                stdate=stdate.isoformat()
-                if time_window==0:
-                    enddate=datetime.datetime.utcfromtimestamp(stoptime/1e9)        
-                    enddate=enddate.isoformat()
-                else:
-                    enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+time_window)  
-                    enddate=enddate.isoformat()        
-            times=AKF_2.get_time_intervals(larchivepath,stdate.replace("T"," "),enddate.replace("T"," "))#
-            lnt=len(times)
-            tim=[]
-            for i in range(lnt):
-                tim.append(times[lnt-1-i][0])
-            intervalls=[]
-            intervalSize=int(lnt/threads)
-            for i in range(threads):
-                intervalls.append(int(i*intervalSize))
-            intervalls.append(lnt)
-            jobs = []
-            resultdict = []
-            for i in range(threads):
-                if verbose>0:
-                    print("get_nuced_raw_by_program_fullthreads: Start Thread ",i+1)                
-#                p = multiprocessing.Process(target=NUC_raw_thread, args=(portnr,tim[intervalls[i]:intervalls[i+1]],out_q,i,version,background,LUT,refT,gain,offset,gain_error,offset_error,give_ERROR,FOV,badpixels,))
-                p = NUC_raw_thread(larchivepath,tim[intervalls[i]:intervalls[i+1]],
-                                   resultdict,i,version,background,LUT,refT,
-                                   gain,offset,gain_error,offset_error,give_ERROR,
-                                   FOV,badpixels,verbose=verbose-1)
-                jobs.append(p)
-                p.start()            
-            for p in jobs:
-                p.join()
+                enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+time_window)  
+                enddate=enddate.isoformat()        
+        times=AKF_2.get_time_intervals(larchivepath,stdate.replace("T"," "),enddate.replace("T"," "))#
+        lnt=len(times)
+        tim=[]
+        for i in range(lnt):
+            tim.append(times[lnt-1-i][0])
+        intervalls=[]
+        intervalSize=int(lnt/threads)
+        for i in range(threads):
+            intervalls.append(int(i*intervalSize))
+        intervalls.append(lnt)
+        jobs = []
+        resultdict = []
+        for i in range(threads):
             if verbose>0:
-                print("get_nuced_raw_by_program_fullthreads: all threads are done")
-            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])
-            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]
-            del resultdict
-            valid=True
+                print("get_nuced_raw_by_program_fullthreads: Start Thread ",i+1)                
+#                p = multiprocessing.Process(target=NUC_raw_thread, args=(portnr,tim[intervalls[i]:intervalls[i+1]],out_q,i,version,background,LUT,refT,gain,offset,gain_error,offset_error,give_ERROR,FOV,badpixels,))
+            p = NUC_raw_thread(larchivepath,tim[intervalls[i]:intervalls[i+1]],
+                               resultdict,i,version,background,LUT,refT,
+                               gain,offset,gain_error,offset_error,give_ERROR,
+                               FOV,badpixels,verbose=verbose-1)
+            jobs.append(p)
+            p.start()            
+        for p in jobs:
+            p.join()
+        if verbose>0:
+            print("get_nuced_raw_by_program_fullthreads: all threads are done")
+        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])
+        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]
+        del resultdict
+        valid=True
 #        else:
 #            success=False
 #            times=[0]
 #            images=[0]
 #            valid=False
 #            error_images=[0]
-        print(larchivepath)
-        
-        if give_ERROR:
-            return success,np.array(times),images,valid#,error_images
-        else:
-            return success,np.array(times),images,valid        
+#        print(larchivepath)
+    
+    if give_ERROR:
+        return success,np.array(times),images,valid#,error_images
+    else:
+        return success,np.array(times),images,valid        
 
 def apply_calib_on_raw(images,background,LUT,refT=28.5,gain=0,offset=0,gain_error=0,
                        offset_error=0,fullbackground=False,give_ERROR=False,verbose=0):
@@ -2278,12 +2407,12 @@ def get_cooling_water_temperature_by_time(time_ns):
     """
     """
     starttime=int(time_ns-3e9)
-    endtime=int(time_ns+3e9)
+    stoptime=int(time_ns+3e9)
     outlet_url="95/Ist%20Av06_ABK10_CT006"
     inlet_url="94/Ist%20Av06_ABK10_CT003"
     url_base="http://archive-webapi.ipp-hgw.mpg.de/ArchiveDB/raw/W7X/CoDaStationDesc.85/DataModuleDesc.188_DATASTREAM/"
     try:
-        result_in=read_restdb(url_base+inlet_url+"/_signal.json?from="+str(starttime)+"&upto="+str(endtime))
+        result_in=read_restdb(url_base+inlet_url+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
         if result_in[0]:           
             inlet=np.mean(np.array(result_in[2]))
         else:
@@ -2294,7 +2423,7 @@ def get_cooling_water_temperature_by_time(time_ns):
         inlet=0
         result_in=[False,0,0]
     try:
-        result_out=read_restdb(url_base+outlet_url+"/_signal.json?from="+str(starttime)+"&upto="+str(endtime))
+        result_out=read_restdb(url_base+outlet_url+"/_signal.json?from="+str(starttime)+"&upto="+str(stoptime))
         if result_out[0]:           
             outlet=np.mean(np.array(result_out[2]))
         else:
@@ -2307,7 +2436,7 @@ def get_cooling_water_temperature_by_time(time_ns):
     return result_in[0] and result_out[0],inlet,outlet
         
 def get_calib_data(port,program=None,t0=None,t1=None,t6=None,emissivity=0.8,
-                   T_version=2,version=0,back_emissivity=0.82,verbose=0):
+                   T_version=2,version=0,back_emissivity=0.82,testmode=False,verbose=0):
     """
     get_calib_data
     return exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error
@@ -2322,23 +2451,19 @@ def get_calib_data(port,program=None,t0=None,t1=None,t6=None,emissivity=0.8,
                 raise Exception('get_calib_data: ERROR! Missing time definition!')
                 print('                function requires either a program ID or the trigger times t0, t1 and t6')
         # get start and end times from program ID
-        prog=get_program_from_PID(program)
-        if prog[0]:
-            t0=prog[1]['trigger']['0'][0]
-            t1=prog[1]['trigger']['1'][0]
-            t6=prog[1]['trigger']['6'][0]
-        else:
+        exist, t0, t1, t6 = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+        if not exist:
             raise Exception('get_calib_data: ERROR! program {0} not found!'.format(program))
-    
+            
+    # determin camera in this port and OP
     OP=IR_tools.get_OP_by_time(time_ns=t0)
     exist=True
-
     if verbose>0:
         print('get_calib_data: loading data for camera {1} in {0}'.format(OP,port))
     Camera=portcamdict[OP]['AEF'+str(port)]
     if Camera.split("_")[0]=="Infratec":
 #        cf=get_INFRATEC_filter_by_program(program,version)
-        cf=get_INFRATEC_filter_by_times(starttime=t1,stoptime=t6)
+        cf=get_INFRATEC_filter_by_times(starttime=t1,stoptime=t6,testmode=testmode)
         if cf[0]:
             cfilter=cf[2]
         else:
@@ -2347,138 +2472,149 @@ def get_calib_data(port,program=None,t0=None,t1=None,t6=None,emissivity=0.8,
             return False,0,0,0,0,0,0,0,0,0,0
     else:
         cfilter=0
-    expo_DL=get_exposure_by_times(port,t1,t6,version)
+        
+    # get exposure time of first frame
+    expo_DL=get_exposure_by_times(port,t1,t6,version,testmode)
     if expo_DL[0]:
         t_exp=int(expo_DL[2][0])
         del expo_DL
-        time=int(TimeToNs([2017,9,26],[8,0,0,0]))   
-        LUT_DL=download_LUT(port,time,t_exp,emissivity,cfilter,version, verbose=verbose-1)
-        if LUT_DL[0]:
-            LUT=LUT_DL[1]
-            del LUT_DL            
-            if cfilter==0 and not Camera.split("_")[0]=="Infratec":
-                if verbose>0:
-                    print('get_calib_data: getting NUC arrays')
-                NUC_DL=get_NUC_by_times(port,t0,t1,t_exp,version,verbose=verbose-1)#download_NUC_by_times(port,t0,t1,t_exp,version)
-                if NUC_DL[0]==False:
-                    raise Warning("get_calib_data: NUC was not found")
-                    return False,0,LUT,0,0,0,0,t_exp,cfilter,0,0
-                else:
-                    # extract NUC elements
-                    gain = []
-                    offset = []
-                    badpixels = []
-                    gain_error = []
-                    offset_error = []
-                    gain=np.array(NUC_DL[1][0])
-                    offset=np.array(NUC_DL[1][1])
-                    badpixels=np.array(NUC_DL[1][3],dtype=np.ubyte)
-                    # check quality of NUC elements
-                    badpixels[np.isnan(gain)] = 1
-                    badpixels[np.isnan(offset)] = 1
-                    gain[np.isnan(gain)]=0
-                    offset[np.isnan(offset)]=0
-                    badpixels[offset<-1e100] = 1
-                    offset[offset<-1e100]=0
-                    # catch cases of error frames being the value "0"
-                    if NUC_DL[1][4] is 0:
-                        gain_error = np.zeros(np.shape(gain), dtype=np.int8)
-                    else:
-                        gain_error=np.array(NUC_DL[1][4])
-                        badpixels[np.isnan(gain_error)] = 1
-                        gain_error[np.isnan(gain_error)]=np.nanmax(gain_error)+1
-                    if NUC_DL[1][5] is 0:
-                        offset_error = np.zeros(np.shape(offset), dtype=np.int8)
-                    else:
-                        offset_error=np.array(NUC_DL[1][5])
-                        badpixels[np.isnan(offset_error)] = 1
-                        offset_error[np.isnan(offset_error)]=np.nanmax(offset_error)+1
-                    # catch special case for AEF11 and AEF21 in OP1.2a
-                    if ((port == 11) or (port == 21)) and OP=="OP1.2a":
-                        exist,time,frames=download_raw_images_by_times(port,t1,int(t1+0.02*1e9),version,verbose=verbose-1)
-                        if exist:
-                #                            frames=[im.swapaxes(0,1) for im in frames]#somehow the archive gives it now already swapped back (09.07.2018)
-                            bim=apply_NUC([frames[0]],gain,offset)
-                            background=get_average_background_recangle(port,bim[0])
-                        else:
-                            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:
+        raise Warning("get_calib_data: no exposure time found")
+        return False,0,0,0,0,0,0,0,cfilter,0,0  
+    
+    # get Look-Up-Table (LUT)
+    time=int(TimeToNs([2017,9,26],[8,0,0,0]))   
+    LUT_DL=download_LUT(port,time,t_exp,emissivity,cfilter,version,testmode=testmode,verbose=verbose-1)
+    if LUT_DL[0]:
+        LUT=LUT_DL[1]
+        del LUT_DL  
+    else:
+        raise Warning("get_calib_data: no LUT found")
+        return False,0,0,0,0,0,0,t_exp,cfilter,0,0
+    
+    # treat cameras with and w/o filters differently
+    if cfilter==0 and not Camera.split("_")[0]=="Infratec":
+        # --- Infratec 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)
+        if NUC_DL[0]==False:
+            raise Warning("get_calib_data: NUC was not found")
+            return False,0,LUT,0,0,0,0,t_exp,cfilter,0,0
+        # extract NUC elements
+        gain = []
+        offset = []
+        badpixels = []
+        gain_error = []
+        offset_error = []
+        gain=np.array(NUC_DL[1][0])
+        offset=np.array(NUC_DL[1][1])
+        badpixels=np.array(NUC_DL[1][3],dtype=np.ubyte)
+        # check quality of NUC elements
+        badpixels[np.isnan(gain)] = 1
+        badpixels[np.isnan(offset)] = 1
+        gain[np.isnan(gain)]=0
+        offset[np.isnan(offset)]=0
+        badpixels[offset<-1e100] = 1
+        offset[offset<-1e100]=0
+        # catch cases of error frames being the value "0"
+        if NUC_DL[1][4] is 0:
+            gain_error = np.zeros(np.shape(gain), dtype=np.int8)
+        else:
+            gain_error=np.array(NUC_DL[1][4])
+            badpixels[np.isnan(gain_error)] = 1
+            gain_error[np.isnan(gain_error)]=np.nanmax(gain_error)+1
+        if NUC_DL[1][5] is 0:
+            offset_error = np.zeros(np.shape(offset), dtype=np.int8)
+        else:
+            offset_error=np.array(NUC_DL[1][5])
+            badpixels[np.isnan(offset_error)] = 1
+            offset_error[np.isnan(offset_error)]=np.nanmax(offset_error)+1
+        # catch special case for AEF11 and AEF21 in OP1.2a
+        if ((port == 11) or (port == 21)) and OP=="OP1.2a":
+            exist,time,frames=download_raw_images_by_times(port,t1,int(t1+0.02*1e9),version,testmode=testmode,verbose=verbose-1)
+            if exist:
+    #                            frames=[im.swapaxes(0,1) for im in frames]#somehow the archive gives it now already swapped back (09.07.2018)
+                bim=apply_NUC([frames[0]],gain,offset)
+                background=get_average_background_recangle(port,bim[0])
             else:
-                gain=0
-                offset=0
-                badpixels=0
-                gain_error=0
-                offset_error=0
-            if OP=="OP1.2a":                
-                back_DL=download_background_by_times(port,t0,t1,t_exp,cfilter,version)
-            elif OP=="OP1.2b":
-                back_DL=get_NUCed_background_by_times(port,t0,t1,t_exp,cfilter,gain,offset,version,verbose=verbose-1)
+                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 ---
+        gain=0
+        offset=0
+        badpixels=0
+        gain_error=0
+        offset_error=0
+        
+    # get background
+    if OP=="OP1.2a":                
+        back_DL=download_background_by_times(port,t0,t1,t_exp,cfilter,version,testmode=testmode)
+    elif OP=="OP1.2b":
+        back_DL=get_NUCed_background_by_times(port,t0,t1,t_exp,cfilter,gain,offset,version,testmode,verbose=verbose-1)
+    else:
+        raise Exception("get_calib_data: unknown Operation Phase or calibration method not implemented for this campaign")
+    if not back_DL[0]:
+        raise Warning("get_calib_data: no background image found")
+        return False,0,LUT,0,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error
+    background=back_DL[2]
+    
+    # apply different versions of temperature calibration
+    if T_version==1:
+        if verbose>0:
+            print('get_calib_data: use temperature calibration version 1')
+        backtime=back_DL[1]
+        backtime=backtime.tolist()
+        divertorpart="all"   
+        TCT_dl=get_average_divertor_TC_for_camtemp(port,int(backtime-2e9),int(backtime+2e9),divertorpart)
+        if TCT_dl[0]:
+            refT=np.average(TCT_dl[2])
+        else:
+            TCT_dl=get_average_divertor_TC_for_camtemp(port,int(backtime-6e9),int(backtime+6e9),divertorpart)
+            if TCT_dl[0]:
+                refT=np.average(TCT_dl[2])
             else:
-                raise Exception("get_calib_data: unknown Operation Phase or calibration method not implemented for this campaign")
-            if back_DL[0]:
-                background=back_DL[2]
-                if T_version==1:
-                    if verbose>0:
-                        print('get_calib_data: use temperature calibration version 1')
-                    backtime=back_DL[1]
-                    backtime=backtime.tolist()
-                    divertorpart="all"   
-                    TCT_dl=get_average_divertor_TC_for_camtemp(port,int(backtime-2e9),int(backtime+2e9),divertorpart)
-                    if TCT_dl[0]:
-                        refT=np.average(TCT_dl[2])
-                    else:
-                        TCT_dl=get_average_divertor_TC_for_camtemp(port,int(backtime-6e9),int(backtime+6e9),divertorpart)
-                        if TCT_dl[0]:
-                            refT=np.average(TCT_dl[2])
-                        else:
-                            raise Exception("get_calib_data: Unable to find thermocouple data")
-                elif T_version==2:
-                    if verbose>0:
-                        print('get_calib_data: use temperature calibration version 2')
-                    frame=background.copy()
-                    background=get_average_background_recangle(port,background)
-                    gotit,waterin,waterout=get_cooling_water_temperature_by_time(t1)
-                    if gotit:
-                        refT=waterout
-                    else:
-                        refT=28.5
-                elif T_version==3:
-                    if verbose>0:
-                        print('get_calib_data: use temperature calibration version 3, TEST CASE!!!')
-                    frame=background.copy()
-                    background=get_average_background_recangle(port,background)
-                    refT=28.5
-                    # read LUT V3 (compensated BG signal and photons flux of BG)
-                    LUT_DL_wall = read_LUT_from_file(port, time, t_exp, 0.45, cfilter, verbose=verbose-1)
-                    if LUT_DL_wall[0]:
-                        if verbose>0:
-                            print('get_calib_data: got the wall LUT')
-                        LUT_wall = LUT_DL_wall[1]
-                        index=IR_tools.find_nearest(LUT_wall[1],refT)
-                        background=background-LUT_wall[0][index]
-                        refT=0
-                        del LUT_DL_wall,LUT_wall
-                    LUT_DL = read_LUT_from_file(port, time, t_exp, emissivity, cfilter, verbose=verbose-1)
-                    if LUT_DL[0]:
-                        if verbose>0:
-                            print('get_calib_data: got the V3 LUT')
-                        LUT = LUT_DL[1]
-                        del LUT_DL
+                raise Exception("get_calib_data: Unable to find thermocouple data")
+    elif T_version==2:
+        if verbose>0:
+            print('get_calib_data: use temperature calibration version 2')
+        frame=background.copy()
+        background=get_average_background_recangle(port,background)
+        gotit,waterin,waterout=get_cooling_water_temperature_by_time(t1)
+        if gotit:
+            refT=waterout
+        else:
+            refT=28.5
+    elif T_version==3:
+        if verbose>0:
+            print('get_calib_data: use temperature calibration version 3, TEST CASE!!!')
+        frame=background.copy()
+        background=get_average_background_recangle(port,background)
+        refT=28.5
+        # read LUT V3 (compensated BG signal and photons flux of BG)
+        LUT_DL_wall = read_LUT_from_file(port, time, t_exp, 0.45, cfilter, verbose=verbose-1)
+        if LUT_DL_wall[0]:
+            if verbose>0:
+                print('get_calib_data: got the wall LUT')
+            LUT_wall = LUT_DL_wall[1]
+            index=IR_tools.find_nearest(LUT_wall[1],refT)
+            background=background-LUT_wall[0][index]
+            refT=0
+            del LUT_DL_wall,LUT_wall
+        LUT_DL = read_LUT_from_file(port, time, t_exp, emissivity, cfilter, verbose=verbose-1)
+        if LUT_DL[0]:
+            if verbose>0:
+                print('get_calib_data: got the V3 LUT')
+            LUT = LUT_DL[1]
+            del LUT_DL
 #                        back_off=estimate_offset(port,program)                      
 #                        background=(background-back_off)/(back_emissivity)+back_off
-                else:
-                    raise Warning("get_calib_data: Unknown temperature calibration method")
-                    return False,background,LUT,0,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error
-                
-            else:
-                raise Warning("get_calib_data: no background image found")
-                return False,0,LUT,0,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error
-        else:
-            raise Warning("get_calib_data: no LUT found")
-            return False,0,0,0,0,0,0,t_exp,cfilter,0,0
     else:
-        raise Warning("get_calib_data: no exposure time found")
-        return False,0,0,0,0,0,0,0,cfilter,0,0
+        raise Warning("get_calib_data: Unknown temperature calibration method")
+        return False,background,LUT,0,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error
+        
+    # get bad pixels
     if np.max(badpixels)==0:
         if Camera.split("_")[0]=="Infratec":
             badpixels=find_badpixels(port,frame-background,offset,niterations=10,tolerance=10,plot_it=False,verbose=verbose-1)#find_badpixels(port,gain,offset)
@@ -2491,10 +2627,9 @@ def get_calib_data(port,program=None,t0=None,t1=None,t6=None,emissivity=0.8,
             badpixels = find_badpixels(port, gain, offset, init_bp_list=init_bp_list, niterations=10, tolerance=10,verbose=verbose-1)        
     if verbose>0:
         print('get_calib_data: NUC arrays ready')
+    
     return exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error
-#    except Exception as E:
-#        print("Warning: Program was not found: ",E)
-#        return 0,0,0,0,0,0,0,0,0,0
+
 
 
 def find_badpixels(port, gain, offset, init_bp_list=None, niterations=3,
@@ -2663,33 +2798,37 @@ def download_heatflux_by_program(port,program,time_window=0,threads=1,testmode=F
     verbose: interger, level of outputs
     returns downlad_heatflux_by_times
     """
-    prog=get_program_from_PID(program)
-    if prog[0]:        
-        t1=prog[1]['trigger']['1'][0]
-        t6=prog[1]['trigger']['6'][0]
-        if time_window==0:
-            tstart=t1
-            tend=t6
-        elif type(time_window)==list or type(time_window)==np.ndarray:
-            if len(time_window)>1:
-                tstart=int(t1+time_window[0]*1e9)
-                tend=int(t1+time_window[1]*1e9)
-            else:
-                tstart=int(t1)
-                tend=int(t1+time_window[0]*1e9)
-        elif type(time_window)==int or type(time_window)==float:
-            tstart=int(t1)
-            tend=int(t1+time_window*1e9)
-        else:
-            raise Exception("download_heatflux_by_program: given time_window type is not supported")            
-        if givealpha:
-            tstart=tstart-1.1e9
-        return download_heatflux_by_times(port=port,tstart=tstart,tend=tend,time_window=0,
-                                          testmode=testmode,version=version,verbose=verbose,
-                                          request=request,moffset=moffset)
-    else:
+#    prog=get_program_from_PID(program)
+#    if prog[0]:        
+#        t1=prog[1]['trigger']['1'][0]
+#        t6=prog[1]['trigger']['6'][0]
+    exist, _, t1, t6 = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+    if not exist:
         print("download_heatflux_by_program: Error! program not found")
         return False,0,-1
+        
+    if time_window==0:
+        tstart=t1
+        tend=t6
+    elif type(time_window)==list or type(time_window)==np.ndarray:
+        if len(time_window)>1:
+            tstart=int(t1+time_window[0]*1e9)
+            tend=int(t1+time_window[1]*1e9)
+        else:
+            tstart=int(t1)
+            tend=int(t1+time_window[0]*1e9)
+    elif type(time_window)==int or type(time_window)==float:
+        tstart=int(t1)
+        tend=int(t1+time_window*1e9)
+    else:
+        raise Exception("download_heatflux_by_program: given time_window type is not supported")            
+    if givealpha:
+        tstart=tstart-1.1e9
+    return download_heatflux_by_times(port=port,tstart=tstart,tend=tend,time_window=0,
+                                      testmode=testmode,version=version,verbose=verbose,
+                                      request=request,moffset=moffset)
+
+        
 
 def download_heatflux_by_times(port,tstart,tend,time_window=0,threads=1,testmode=False,
                                version=0,verbose=0,request=True,moffset=0):
@@ -2704,7 +2843,7 @@ def download_heatflux_by_times(port,tstart,tend,time_window=0,threads=1,testmode
     returns found,time,images
     """
     if testmode:
-        base="http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"
+        base=testarchivepath
     else:
         base=archivepath
     OP=IR_tools.get_OP_by_time(time_ns=tstart)
@@ -2734,11 +2873,11 @@ def download_heatflux_by_times(port,tstart,tend,time_window=0,threads=1,testmode
             return False,0,-1
         else:## Okay QRT is requested. Maybe there is data available, maybe not, lets find out
             if version==0:
-                version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"heatflux_DATASTREAM",project=project_ana,Test=testmode,t_from=tstart,t_to=tend)
+                version=get_latest_version(portpathdict[OP]["AEF"+str(port)]+"heatflux_DATASTREAM",project=project_ana,testmode=testmode,t_from=tstart,t_to=tend)
             larchivepath=base+project_ana+"/"+portpathdict[OP]["AEF"+str(port)]+"heatflux_DATASTREAM/V"+str(version)+"/0/heatflux"
             ### test for the testsample###
 #            if version==0:
-#                version=get_latest_version("QRT_IRCAM_Test/AEF"+str(port)+"_heatflux_Test_2_DATASTREAM",project=project_ana,Test=testmode)
+#                version=get_latest_version("QRT_IRCAM_Test/AEF"+str(port)+"_heatflux_Test_2_DATASTREAM",project=project_ana,testmode=testmode)
 #            larchivepath=base+project_ana+"/QRT_IRCAM_Test/AEF"+str(port)+"_heatflux_Test_2_DATASTREAM/V"+str(version)+"/0/heatflux"
             ### end of testsample modifikation###
             if verbose>0:
@@ -2773,16 +2912,16 @@ def download_heatflux_mapping_reference(timepoint=None,version=0,testmode=False,
     if timepoint==None:
         timepoint=int(TimeToNs([2017,9,26],[8,0,0,0]))
     if testmode:
-        base="http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"
+        base=testarchivepath
     else:
         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,Test=testmode,t_from=timepoint)
+        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"
     ### test for the testsample###
 #    if version==0:
-#        version=get_latest_version("QRT_IRCAM_Test/Mapping_reference_Test_1_PARLOG",project=project_ana,Test=testmode)                                        
+#        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),version=version,verbose=verbose-1)
@@ -2897,7 +3036,8 @@ def download_heatflux_mapping_reference(timepoint=None,version=0,testmode=False,
     
     return exist,mappings
 
-def download_heatflux_scene_model_reference(port,timepoint=None,program=None,version=0,testmode=False,verbose=0):
+def download_heatflux_scene_model_reference(port,timepoint=None,program=None,
+                                            version=0,testmode=False,verbose=0):
     """
     return exist(boolean) and dictonary of the mappings informations
     """
@@ -2908,24 +3048,26 @@ def download_heatflux_scene_model_reference(port,timepoint=None,program=None,ver
     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]
-        else:
+#        prog=get_program_from_PID(program)
+#        if prog[0]:        
+#            timepoint=prog[1]['trigger']['1'][0]
+#        else:
+        exist, _, timepoint, _ = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+        if not exist:
             raise Exception("download_heatflux_scene_model_reference: Error! Program "+program+" not found!")
     if testmode:
-        base="http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"
+        base=testarchivepath
     else:
         base=archivepath
 #    OP=IR_tools.get_OP_by_time(time_ns=timepoint)
     if version==0:
-        version=get_latest_version("QRT_IRCAM/"+str(portnam)+"_SceneModel_reference_PARLOG",project=project_ana,Test=testmode,t_from=timepoint)
+        version=get_latest_version("QRT_IRCAM/"+str(portnam)+"_SceneModel_reference_PARLOG",project=project_ana,testmode=testmode,t_from=timepoint)
     larchivepath=base+project_ana+"/"+"QRT_IRCAM/"+str(portnam)+"_SceneModel_reference_DATASTREAM/V"+str(version)+"/0/scene%20model%20reference"
     larchivepath_par=base+project_ana+"/QRT_IRCAM/"+str(portnam)+"_SceneModel_reference_PARLOG/V"+str(version)+"/parms/header/Pixel_X"
     ### test for the testsample###
 #==============================================================================
 #     if version==0:
-#         version=get_latest_version("QRT_IRCAM_Test/"+str(portnam)+"_SceneModel_reference_PARLOG",project=project_ana,Test=testmode)                                        
+#         version=get_latest_version("QRT_IRCAM_Test/"+str(portnam)+"_SceneModel_reference_PARLOG",project=project_ana,testmode=testmode)                                        
 #     larchivepath=base+project_ana+"/QRT_IRCAM_Test/"+str(portnam)+"_SceneModel_reference_DATASTREAM/V"+str(version)+"/0/scene%20model%20reference"        
 #     larchivepath_par=base+project_ana+"/QRT_IRCAM_Test/"+str(portnam)+"_SceneModel_reference_PARLOG/V"+str(version)+"/parms/header/Pixel_X"
 #==============================================================================
@@ -3058,9 +3200,11 @@ def get_heatflux_profile(port,profile,finger=None,timepoint=1,program=None,tstar
             return False,0,0,0        
         ### lets find out which timepoint or timeintervall is requested, to know the OP, only needed for OP2 changes, but who knows
         if program!=None:
-            prog=get_program_from_PID(program)
-            if prog[0]:        
-                t1=prog[1]['trigger']['1'][0]
+#            prog=get_program_from_PID(program)
+#            if prog[0]:        
+#                t1=prog[1]['trigger']['1'][0]
+            exist, _, t1, _ = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+            if exist:
                 tstart=t1+int((timepoint-0.02)*1e9)
                 tend=t1+int((timepoint+0.02)*1e9)
             else:
@@ -3070,10 +3214,12 @@ def get_heatflux_profile(port,profile,finger=None,timepoint=1,program=None,tstar
         else:
             t1=tstart
             if tend==None:
-                proggi=AKF_2.get_program_id(t1)
-                prog=get_program_from_PID(proggi)
-                if prog[0]:                            
-                    tref=prog[1]['trigger']['6'][0]
+                program=AKF_2.get_program_id(t1)
+#                prog=get_program_from_PID(program)
+#                if prog[0]:
+#                    tref=prog[1]['trigger']['6'][0]
+                exist, _, _, tref = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+                if exist:
                     tend=tref+int((timepoint+0.02)*1e9)
         OP=IR_tools.get_OP_by_time(time_ns=t1)
         ### is the port given? 
@@ -3099,7 +3245,7 @@ def get_heatflux_profile(port,profile,finger=None,timepoint=1,program=None,tstar
             raise Exception("get_heatflux_profile: Unknown port, FLIR data is unsupported at the moment")
         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)
+            exist,timo,frames=download_heatflux_by_times(port,tstart,tend,time_window=0,threads=1,testmode=testmode,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),time_window=timepoint,inputchecked=inputcheck,verbose=verbose-1)
             else:
@@ -3226,7 +3372,8 @@ def extract_temperature_profile_from_DL(port,time,images,profile,finger=None,tim
             return False,0,0,0
 
 
-def download_divertor_load(port,targetmodule=None,program=None,tstart=None,tend=None,version=0,verbose=0,testmode=False,request=True):
+def download_divertor_load(port,targetmodule=None,program=None,tstart=None,tend=None,
+                           version=0,verbose=0,testmode=False,request=True):
     """
     """
     TMchadict={
@@ -3280,30 +3427,36 @@ def download_divertor_load(port,targetmodule=None,program=None,tstart=None,tend=
             print("input for program and time invalid!")
         return False,0,-1,-1
     elif program!=None:
-            prog=get_program_from_PID(program)
-            if prog[0]:        
-                tstart=prog[1]['trigger']['1'][0]
-                tend=prog[1]['trigger']['6'][0]
-            else:
-                if verbose>0: print("program not found")
+#            prog=get_program_from_PID(program)
+#            if prog[0]:        
+#                tstart=prog[1]['trigger']['1'][0]
+#                tend=prog[1]['trigger']['6'][0]
+#            else:
+            exist, _, tstart, tend = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+            if not exist:
+                print("download_divertor_load: Error! program not found")
                 return False,0,-1,-1
     else:       
         if tend==None:
-            proggi=AKF_2.get_program_id(tstart)
-            prog=get_program_from_PID(proggi)
-            if prog[0]:                            
-                tend=prog[1]['trigger']['6'][0] 
+            program=AKF_2.get_program_id(tstart)
+#            prog=get_program_from_PID(program)
+#            if prog[0]:                            
+#                tend=prog[1]['trigger']['6'][0] 
+            exist, _, _, tend = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+            if not exist:
+                print("download_divertor_load: Error! end trigger not found")
+                return False,0,-1,-1
     #channels known, time known, okay lets get the data
 #    tstart=int(tstart-100e6)    
     OP=IR_tools.get_OP_by_time(time_ns=tstart)
     if testmode:
-        base="http://archive-webapi.ipp-hgw.mpg.de/Test/raw/"
+        base=testarchivepath
     else:
         base=archivepath
     if type(port)==int:
         port="AEF"+str(port)    
     if version==0:
-        version=get_latest_version(portpathdict[OP][str(port)]+"loads_DATASTREAM",project=project_ana,t_from=tstart,t_to=tend,Test=testmode)
+        version=get_latest_version(portpathdict[OP][str(port)]+"loads_DATASTREAM",project=project_ana,t_from=tstart,t_to=tend,testmode=testmode)
     larchivepath=base+project_ana+"/"+portpathdict[OP][str(port)]+"loads_DATASTREAM/V"+str(version)    
     if type(datcha)==list:#case of several requested channels
         load=[]
@@ -3354,7 +3507,7 @@ 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):
+def download_scene_model(port,program=None,timepoint=None,version=0,testmode=False,verbose=0):
     """
     """
     if type(port)==int or type(port)==float:
@@ -3365,14 +3518,19 @@ def download_scene_model(port,program=None,timepoint=None,version=0,verbose=0):
         dati=datetime.datetime.now()
         timepoint=int(TimeToNs([dati.year,dati.month,dati.day],[dati.hour,dati.minute,dati.second,dati.microsecond]))
     elif timepoint==None:
-        prog=get_program_from_PID(program)
-        if prog[0]:                            
-            timepoint=prog[1]['trigger']['1'][0]               
-        else:
+#        prog=get_program_from_PID(program)
+#        if prog[0]:                            
+#            timepoint=prog[1]['trigger']['1'][0]               
+#        else:
+        exist, _, timepoint, _ = get_trigger_from_PID(program, port, testmode, verbose=verbose-1)
+        if not exist:
             raise Exception("download_scene_model: Error! Program "+program+" not found!")
-    base=archivepath
+    if testmode:
+        base=testarchivepath
+    else:
+        base=archivepath
     if version==0:
-        version=get_latest_version("QRT_IRCAM/"+str(portnam)+"_scene_model_PARLOG",project=project,Test=False,t_from=timepoint)
+        version=get_latest_version("QRT_IRCAM/"+str(portnam)+"_scene_model_PARLOG",project=project,testmode=False,t_from=timepoint)
     larchivepath=base+project+"/"+"QRT_IRCAM/"+str(portnam)+"_scene_model_DATASTREAM/V"+str(version)+"/0/"+str(portnam)+"_scene_model"
     larchivepath_par=base+project+"/QRT_IRCAM/"+str(portnam)+"_scene_model_PARLOG/V"+str(version)
 
@@ -3382,7 +3540,7 @@ def download_scene_model(port,program=None,timepoint=None,version=0,verbose=0):
         res.close()
         goon=True
     except urllib.error.URLError as e:
-        print('download_heatflux_scene_model_reference: Error! ',e)
+        print('download_scene_model: Error! ',e)
         goon=False
     if goon:
         timepoint=signal_list['values'][0]['meta-data']['timestamp']
@@ -3517,7 +3675,6 @@ def get_program_from_PID(instring):
     program_url = 'http://archive-webapi.ipp-hgw.mpg.de/programs.json?from='
     # write the url and load the data
     jsonurl = program_url+np.str(w7xstamp0)+'&upto='+np.str(w7xstamp1)
-    
     try:
         res = urllib.request.urlopen(jsonurl)
         prog_list = json.loads(res.read().decode('utf-8'))
@@ -3546,76 +3703,272 @@ def get_program_from_PID(instring):
 end of the copied functions
 @author: thomsen
 """
+
+def get_trigger_from_PID(program, port, testmode=False, verbose=0):
+    '''Gets the nanosecond timestamps of beginning of preparation phase (t0),
+       the start of experiment phase (t1) and the end of the experiment phase (t6).
+       If there was no program in the Archive (calibration or test shot), the
+       function will scan the raw datastream and try to find the program by counting 
+       segments of data (with NUC, background, experiment data).
+    
+       INPUT
+       -----
+           program: str
+               program string of format YYYYMMDD.NNN (Year, Month, Day, 
+               program Number), e.g. '20171026.007'
+           port: int
+               port number of IR camera (e.g. 21 for AEF21 port)
+           testmode: bool, optional
+               switch of whether to search in the Test archive or not
+               (OPTIONAL: default is to search the real Archive)
+           verbose: integer, optional
+               feedback level (details of print messages)
+               (OPTIONAL: if not provided, only ERROR output)
+       RESULT
+       ------
+           exist: bool
+               flag of whether the script was successful
+           t_preparation: int
+               nanosecond time stamp of beginning of preparation phase (t0)
+           t_start: int
+               nanosecond time stamp of beginning of experiment phase (t1)
+           t_end: int
+               nanosecond time stamp of end of experiment phase (t6)
+    '''
+    # handle different formats of port
+    if isinstance(port, str):
+        try:
+            # case port=='31'
+            port = int(port)
+        except:
+            # case port=='... AEF31 ...'
+            port = int(port[port.find('AEF')+3:port.find('AEF')+5])
+    # check if program was defined in archive
+    prog = get_program_from_PID(program)
+    if prog[0]:
+        t_preparation = prog[1]['trigger']['0'][0]
+        t_start = prog[1]['trigger']['1'][0]
+        t_end = prog[1]['trigger']['6'][0]
+        
+        return True, t_preparation, t_start, t_end
+    else:
+        if verbose>0:
+            print('get_trigger_from_PID: no program found in Archive. checking datastream...')
+        date_str = program.split('.')[0]
+        prog_no = int(program.split('.')[1])
+        OP = IR_tools.get_OP_by_time(program_str=program)
+        # prepare Datastream url
+        if testmode:
+            stream_name = testarchivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+'raw_DATASTREAM'
+        else:
+            stream_name = archivepath+project+"/"+portpathdict[OP]["AEF"+str(port)]+'raw_DATASTREAM'
+        time_from = AKF_2.to_timestamp(date_str+' 00:00:00', fmt=u"%Y%m%d %H:%M:%S")
+        time_to = AKF_2.to_timestamp(date_str+' 23:59:59', fmt=u"%Y%m%d %H:%M:%S")
+        version = AKF_2.get_last_version(stream_name, time_from, time_to)
+        signal_name = stream_name+'/'+version+'/0/raw'
+        # load all time intervals with data in this datastream
+        intervals = AKF_2.get_time_intervals(signal_name, time_from, time_to)
+        frame_start = np.array(intervals[::-1,0])
+        frame_end = np.array(intervals[::-1,1])
+        # identify segments of frames by gaps in time steps
+        dt = abs(intervals[:-1,0]-intervals[1:,0])
+        dt_normal = np.median(dt)
+        i_segment = np.hstack([np.array([0]), np.where(dt>2.5*dt_normal)[0]+1, np.array([len(intervals)])])
+        if verbose>1:
+            print('get_trigger_from_PID: found {0} data segments starting at {1}ns'.format(len(i_segment)-1, frame_start[i_segment[:-1]]))
+        # try to group segments according to normal order (NUC frames, background frames, data frames)
+        if (len(i_segment)-1)%3 == 0:
+            t_programs = []
+            for i in range(len(i_segment)//3):
+                # three data segments: 
+                # i*3: NUC, i*3+1: background, i*3+2: experiment phase
+                # --> triggers:
+                #     beginning of NUC, beginning of experiment, end of experiment (=one frame before start of next segment)
+                t_programs.append( [frame_start[i_segment[i*3]], 
+                                    frame_start[i_segment[i*3+2]], 
+                                    frame_end[i_segment[(i+1)*3]-1] ] )
+            if verbose>1:
+                print('get_trigger_from_PID: found {0} shots (NUC+BG+data)'.format(len(t_programs)))
+            if len(t_programs)>=prog_no and prog_no>0:
+                t_preparation = t_programs[prog_no-1][0]
+                t_start = t_programs[prog_no-1][1]
+                t_end = t_programs[prog_no-1][2]
+                
+                return True, t_preparation, t_start, t_end
+            else:
+                print('get_trigger_from_PID: ERROR! program {0} not found among {1} shots (NUC+BG+data)'.format(prog_no, len(t_programs)))
+                
+                return False, 0, 0, 0
+        else:
+            print('get_trigger_from_PID: ERROR! number of segments does not indicate multiple shots.')
+            
+            return False, 0, 0, 0
+        
+    
 #%% dummy run of the script
     
 if __name__=='__main__':
     print("local function calling") 
     
 #%% temperature download and plotting example                  
-    port=31#"AEF50"#"AEF51"'20171114.053'#
-    prog="20180911.008"#"20181011.033"#'20171122.035'#'20181011.010'#'20180823.037'#'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=[5,5.1],emi=0.80,T_version=2,version=0,threads=1,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[-1],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)
-        plt.title("AEF{0}".format(port))
+#    port=31#"AEF50"#"AEF51"'20171114.053'#
+#    prog="20180911.008"#"20181011.033"#'20171122.035'#'20181011.010'#'20180823.037'#'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=[5,5.1],emi=0.80,T_version=2,version=0,threads=1,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[-1],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)
+#        plt.title("AEF{0}".format(port))
+
 #%% heatflux test
-#    port=10
-#    prog="20180904.015" 
-#    
-#    for prog in ["20171207.016"]:#"20180821.012"]:#"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=0.9,threads=4,version=2,verbose=3,givealpha=False,request=True)            
-##            status,time,load,error=download_divertor_load(port,targetmodule=['all','tm1h'],program=prog,verbose=5,version=3)
-#            if status:
-#                print(prog,port,"OK")
-#            else:
-#                print(prog,port,"missing")
-#        plt.figure(),plt.imshow(images[0],vmin=0)
-#        plt.figure(),plt.imshow(images[50],vmin=0)
+#    port = 20
+#    prog = "20181016.016"
+#
 #    status,mapping=download_heatflux_mapping_reference(verbose=4)
-#    test=get_heatflux_profile(20,1605,timepoint=1,program="20171109.008",verbose=4)
+#    
+#    plt.figure()
+#    plt.subplot(2,1,1)
+#    t_start = 2.0
+#    status,times1,images1=download_heatflux_by_program(port,prog,time_window=[t_start,t_start+0.1],threads=4,version=2,verbose=3,givealpha=False,request=False)
+#    plot_frame1 = np.nan_to_num(images1[0])/1E6
+#    plot_frame1[plot_frame1<0.1] = 0
+#    q_max = np.nanmax(plot_frame1)
+#    q_min = np.nanpercentile(plot_frame1[plot_frame1>0], 1)
+#    plt.scatter(mapping['X'], mapping['Y'], s=1, c=plot_frame1, cmap='jet', vmin=q_min)
+#    
+#    plt.colorbar(label='q [MW/m²]')
+#    plt.title('t-t_0={0:.1f}s'.format(t_start))
+#    
+#    plt.subplot(2,1,2)
+#    t_start = 10.0
+#    status,times2,images2=download_heatflux_by_program(port,prog,time_window=[t_start,t_start+0.1],threads=4,version=2,verbose=3,givealpha=False,request=False)
+#    plot_frame2 = np.nan_to_num(images2[0])/1E6
+#    plot_frame2[plot_frame2<0.1] = 0
+#    plt.scatter(mapping['X'], mapping['Y'], s=1, c=plot_frame2, cmap='jet', vmin=q_min, vmax=q_max)
+#    plt.colorbar(label='q [MW/m²]')
+#    plt.title('t-t_0={0:.1f}s'.format(t_start))
+#    plt.suptitle('Heat flux in module {0} program {1}'.format(port, prog))
+#    plt.tight_layout(rect=[0, 0, 1, 0.95])
+#    plt.show()
+    
+#%% heat flux profile test
+#    port = 20
+#    prog = "20171109.008"
+#    finger_no = 1605
+#    
+#    status, profile_time, s, profiles=get_heatflux_profile(port,finger_no,timepoint=1,program=prog,verbose=4)
+#    plt.figure()
+#    plt.plot(s, profiles[0]/1E6)
+#    plt.xlabel('s [m]')
+#    plt.ylabel('q [MW/m²]')
+#    plt.title('heat flux along finger {0}\nin module {1} @ t-t1={2:.2f}s'.format(finger_no, port, profile_time[0]))
+#    plt.show()
     
 #%% loads test
-#    port=10
-#    prog="20171207.016"#"20181011.015"#"20171114.052"    
-#    for port in  [10,11,20,21,30,31,40,41,50,51]:
-#        status,time,load,error=download_divertor_load(port,targetmodule=['all','tm1h'],program=prog,verbose=5)
+#    prog = "20181016.016"
+#    loads = []
+#    times = []
+#    labels = []
+#    for port in [11,20,21,30,31,40,41]:
+#        print('loading loads of port {0} in {1}'.format(port, prog))
+#        exist,time,load,error=download_divertor_load(port,targetmodule=['all'],program=prog,request=False,verbose=5)
+#        if exist:
+#            load_start = np.mean(load[0][:10])
+#            load_end = np.mean(load[0][-10:])
+#            load_offset = np.linspace(load_start, load_end, len(time))
+#            load_offset = 0
+#            times.append(time)
+#            loads.append(load[0]-load_offset)
+#            labels.append('module {0}'.format(port))
+#    
+#    plt.figure()
+#    for i in range(len(times)):
+#        plt.plot((times[i] - times[i][0])/1E9, loads[i]/1E3, label=labels[i], linewidth=1, linestyle='--')
+#    plt.legend()
+#    plt.title('Integral heat load - program {0}'.format(prog))
+#    plt.xlabel('t - t_0 [s]')
+#    plt.ylabel('P_divertor [kW]')
+#    plt.tight_layout()
+#    plt.show()
+
 #%% scene model test
 #    port=10
 #    exist,model=download_scene_model(port)
+#    keys = ['CAD', 'FOV', 'PFC', 'distance', 'angle', 'emissivity', 'x', 'z', 'phi']
+#    if exist:
+#        plt.figure()
+#        for i in range(len(keys)):
+#            plt.subplot(3,3,i+1)
+#            plt.imshow(model[keys[i]])
+#            plt.colorbar()
+#            plt.title(keys[i])
+#        plt.tight_layout()
+#        plt.show()
+
 #%% HDF5 writing test
-#    bla=get_temp_from_raw_by_program_fullthreads(51,prog,time_window=[0,4],threads=4)
-#    bla2=get_nuced_raw_by_program_fullthreads(51,prog,time_window=[0,4],threads=4)
-#    port=41
-#    program="20180925.013"
-#    prog=get_program_from_PID(program)
+#    import h5py as h5
+##    bla=get_temp_from_raw_by_program_fullthreads(51,prog,time_window=[0,4],threads=4)
+##    bla2=get_nuced_raw_by_program_fullthreads(51,prog,time_window=[0,4],threads=4)
+#    port = 10
+#    program = "20180925.013"
+#    prog = get_program_from_PID(program)
 #    if prog[0]:
-#        t0=prog[1]['trigger']['0'][0]
-#        t1=prog[1]['trigger']['1'][0]
-#        t6=prog[1]['trigger']['6'][0]
-#        for port in [10]:
-##            bla=download_raw_images_by_times(port,t0,t1,verbose=5)
-#            bla=get_temp_from_raw_by_program(port,program,time_window=[0,4],emi=0.82,T_version=1,version=0,threads=4,give_ERROR=False,use_firstframe_as_background=True,verbose=5)
-#            import h5py as h5
-#            File=h5.File("AEF"+str(port)+"_"+program+"_temp_v1_b.h5",'w')
-#            imags=np.asarray(bla[2]).swapaxes(0,2).swapaxes(0,1)
-#            shapi=np.shape(imags)
-#            dset=File.create_dataset('images',shape=(shapi[0],shapi[1],shapi[2]),dtype='uint16',chunks=(shapi[0],shapi[1],1))          
-#            imags=np.ascontiguousarray(imags)
-#            dset.write_direct(imags)
-#            File.create_dataset('timestamps', data=list(bla[1]), dtype='uint64')#,compression="gzip")
-#            File.close()
-
-#%% get hot cold image test
-    port=10
-    program="20180904.002"
+#        t0 = prog[1]['trigger']['0'][0]
+#        t1 = prog[1]['trigger']['1'][0]
+#        t6 = prog[1]['trigger']['6'][0]
+#        
+##        bla=download_raw_images_by_times(port,t0,t1,verbose=5)
+#        bla = get_temp_from_raw_by_program(port,program,time_window=[0,4],emi=0.82,
+#                                           T_version=1,version=0,threads=4,give_ERROR=False,
+#                                           use_firstframe_as_background=True,verbose=5)
+#        
+#        filename = "AEF"+str(port)+"_"+program+"_temp_v1_b.h5"
+#        File = h5.File(filename,'w')
+#        frames = np.asarray(bla[2]).swapaxes(0,2).swapaxes(0,1)
+#        n_rows, n_cols, n_frames = np.shape(frames)
+#        dset = File.create_dataset('images',shape=(n_rows,n_cols,n_frames),dtype='uint16',chunks=(n_rows,n_cols,1))          
+#        imags = np.ascontiguousarray(frames)
+#        dset.write_direct(imags)
+#        File.create_dataset('timestamps', data=list(bla[1]), dtype='uint64')#,compression="gzip")
+#        File.close()
+#
+#        # test reading
+#        File = h5.File(filename,'r')
+#        times = np.array(File['timestamps'])
+#        frames2 = File['images']
+#        n_frames2 = frames2.shape[2] 
+#        if n_frames == n_frames2:
+#            i_frames = np.random.randint(low=0, high=n_frames-1 ,size=3)
+#            for i in range(3):
+#                print('testing frame', i_frames[i])
+#                if (np.nan_to_num(frames[:,:,i_frames[i]]) == frames2[:,:,i_frames[i]]).all():
+#                    print('   original and h5 file verions identical!')
+#                else:
+#                    print('   total difference of original and h5 file:', np.sum(np.nan_to_num(frames[:,:,i_frames[i]]) - frames2[:,:,i_frames[i]]))
+#        File.close()
+        
+#%% get coldframe from NUC test
+#    port = 31
+#    program = '20171026.007' #"20190621.001"
+#    testmode = False #True
+#    exist, coldframe = get_NUCed_coldframe_by_program(port, program, exposure=None, 
+#                                                      version=0, testmode=testmode, 
+#                                                      plot_it=True, verbose=3)
+
+#%% get trigger times
+#    port = 31
+#    program = '20190621.001' #'20190621.001' #'20171026.007'
+#    time_window = 0 #0 #0.02
+#    testmode = True #True #False
+#    verbose = 1
+#    
+#    exist, t0, t1, t6 = get_trigger_from_PID(program, port, testmode, verbose=1)
+#    if exist:
+#        print('data of port {0} in program {1}:\n   t_preparation {2}ns\n   t_start {3}ns\n   t_end {4}ns'.format(port, program, t0, t1, t6))
     
-    exist, coldframe = get_NUCed_coldframe_by_program(port, program, exposure=None, version=0, plot_it=True, verbose=3)
   
\ No newline at end of file