From 555d3ed154fc1f864ac6d6f1df8131fc3cf56d73 Mon Sep 17 00:00:00 2001
From: Holger Niemann <holger.niemann@ipp.mpg.de>
Date: Thu, 4 Oct 2018 10:29:15 +0200
Subject: [PATCH] Update V2.9.0: change multiprocessing to multithreading,
 performance improved, less archivecalls per download

---
 IR_image_tools.py        |   4 +-
 downloadversionIRdata.py | 353 ++++++++++++++++++++++-----------------
 2 files changed, 206 insertions(+), 151 deletions(-)

diff --git a/IR_image_tools.py b/IR_image_tools.py
index 539109c..b5069d2 100644
--- a/IR_image_tools.py
+++ b/IR_image_tools.py
@@ -153,7 +153,7 @@ def check_backgroundframe(backgroundframe,threshold=50):
         valid=False    
     return valid,np.mean(dataset)
     
-def read_bad_pixels_from_file(port, shot_no=None, program=None):
+def read_bad_pixels_from_file(port, shot_no=None, program=None,time_ns=None):
     '''Reads bad pixels stored in *.bpx file on E4 server.
        Requires one of the optional arguments shot_no or program.
         IN
@@ -169,6 +169,8 @@ def read_bad_pixels_from_file(port, shot_no=None, program=None):
         OP = get_OP_by_time(shot_no=shot_no)
     elif program is not None:
         OP = get_OP_by_time(program_str=program)
+    elif time_ns is not None:
+        OP = get_OP_by_time(time_ns=time_ns)
     else:
         raise Exception('read_bad_pixels_from_file: ERROR! Need either shot no. or program string.')
         
diff --git a/downloadversionIRdata.py b/downloadversionIRdata.py
index 34998aa..8647ea8 100644
--- a/downloadversionIRdata.py
+++ b/downloadversionIRdata.py
@@ -3,7 +3,7 @@
 Created on Wed Oct 25 15:51:46 2017
 updated on Tue Aug 21 10:20:00 2018
 
-Version: 2.8.0
+Version: 2.9.0
 (Numbering: #of big changes(OP1.2a download V1, OP1.2b download V2, heatflux V3) . #of updates to add functionalities . #number of updates for bug fixes )
 @author: holn
 """
@@ -22,8 +22,8 @@ from PIL import Image
 from io import BytesIO
 from os.path import join
 import matplotlib.pyplot as plt
-try:        
-    import multiprocessing    
+try:          
+    import threading
     import archivedb as AKF_2
     fastDL=True
 except Exception as E:
@@ -705,16 +705,13 @@ if fastDL:
                     intervalls.append(int(i*intervalSize))
                 intervalls.append(lnt)
                 jobs = []
-                out_q=multiprocessing.Queue()
+                resultdict = []
                 for i in range(threads):
                     if verbose>0:
                         print("Start Thread ",i+1)                
-                    p = multiprocessing.Process(target=download_raw_images_png_by_times_thread, args=(larchivepath,tim[intervalls[i]:intervalls[i+1]],out_q,i,version,))
-                    jobs.append(p)
-                    p.start()
-                resultdict = []
-                for i in range(threads):
-                    resultdict.append(out_q.get())
+                    TH=download_images_thread(i,larchivepath,tim[intervalls[i]:intervalls[i+1]],resultdict,version)
+                    jobs.append(TH)
+                    TH.start()
                 for p in jobs:
                     p.join()
                 if verbose>0:
@@ -723,8 +720,7 @@ if fastDL:
                 for ele in resultdict:
                     order.append(ele[0])
                     if len(np.where(np.asarray(ele[1])==False)[0])>0:
-                        success=False
-                
+                        success=False                
                 times=[]#np.array(resultdict[order.index(0)][2])
                 images=[]#np.array(resultdict[order.index(0)][3])
                 for i in range(threads):
@@ -733,71 +729,110 @@ if fastDL:
                     resultdict[order.index(i)]=[]
                 del resultdict
                 return success,np.array(times),images
-#        except Exception as E:
-#            raise Exception(E)
-            
+      
+    class download_images_thread(threading.Thread):
+        def __init__(self, threadID, larchivepath,times,resultlist,version=0):
+            threading.Thread.__init__(self)
+            self.threadID = threadID
+            self.times = times
+            self.archivepath = larchivepath
+            self.resultlist = resultlist
+            self.version = version
+        def run(self):
+            images=[]
+            time=[]
+            successes=[]
+            for i in self.times:
+                imag=download_last_raw_image_by_time(self.archivepath,i-10,i+10,version=self.version)
+                if imag[0]:
+                    images.append(np.array(imag[1],dtype=np.uint16))
+                    time.append(i)
+                    successes.append(True)
+                else:
+                    successes.append(False)
+            self.resultlist.append([self.threadID,successes,time,images])
     
-    def download_raw_images_png_by_times_thread(larchivepath,times,out_q,threadnumber,version=0):
-        images=[]
-        time=[]
-        successes=[]
-        for i in times:
-            imag=download_last_raw_image_by_time(larchivepath,i-10,i+10,version=version)
-            if imag[0]:
-                images.append(np.array(imag[1],dtype=np.uint16))
-#                print(np.min(imag[1]),np.max(imag[1]))
-                time.append(i)
-                successes.append(True)
-            else:
-                successes.append(False)
-        out_q.put([threadnumber,successes,time,images])        
-    #    return success,np.array(time),np.array(images,dtype=np.uint16)
-        
-    def convert_raw_to_temp_thread(larchivepath,times,out_q,threadnumber,version=0,background=0,LUT=[[],[],[]],refT=28.5,gain=0,offset=0,gain_error=0,offset_error=0,give_ERROR=False,FOV=0,badpixels=[]):
-        images=[]
-        time=[]
-        successes=[]        
-        for i in times:
-            imag=download_last_raw_image_by_time(larchivepath,i-10,i+10,version=version)
-            if imag[0]:
-                images.append(np.array(imag[1],dtype=np.uint16))
-                time.append(i)
-                successes.append(True)
+    class convert_raw_to_temp_thread(threading.Thread):
+        def __init__(self,larchivepath,times,resultlist,threadID,version=0,background=0,LUT=[[],[],[]],refT=28.5,gain=0,offset=0,gain_error=0,offset_error=0,give_ERROR=False,FOV=0,badpixels=[]):
+            threading.Thread.__init__(self)
+            self.threadID = threadID
+            self.times = times
+            self.archivepath = larchivepath
+            self.resultlist = resultlist
+            self.version = version   
+            self.gain=gain
+            self.offset=offset
+            self.background=background
+            self.LUT=LUT
+            self.refT=refT
+            self.gain_error=gain_error
+            self.offset_error=offset_error
+            self.give_ERROR=give_ERROR
+            self.FOV=FOV
+            self.badpixels=badpixels
+        def run(self):
+            images=[]
+            time=[]
+            successes=[]        
+            for i in self.times:
+                imag=download_last_raw_image_by_time(self.archivepath,i-10,i+10,version=self.version)
+                if imag[0]:
+                    images.append(np.array(imag[1],dtype=np.uint16))
+                    time.append(i)
+                    successes.append(True)
+                else:
+                    successes.append(False)
+            if self.give_ERROR:
+                sucess,images,error_images=apply_calib_on_raw(images,self.background,self.LUT,self.refT,self.gain,self.offset,self.gain_error,self.offset_error,False,self.give_ERROR)
             else:
-                successes.append(False)
-        if give_ERROR:
-            sucess,images,error_images=apply_calib_on_raw(images,background,LUT,refT,gain,offset,gain_error,offset_error,False,give_ERROR)
-        else:
-            success,images=apply_calib_on_raw(images,background,LUT,refT,gain,offset,gain_error,offset_error,False,give_ERROR)
-        
-        for i in range(len(images)):
-            images[i]=(images[i]*FOV).astype(np.float32)
-        print(datetime.datetime.now(),"correcting bad pixels")
-        images=IR_tools.correct_images(images,badpixels)
-        out_q.put([threadnumber,successes,time,images]) 
+                success,images=apply_calib_on_raw(images,self.background,self.LUT,self.refT,self.gain,self.offset,self.gain_error,self.offset_error,False,self.give_ERROR)
+            
+            for i in range(len(images)):
+                images[i]=(images[i]*self.FOV).astype(np.float32)
+            print(datetime.datetime.now(),"correcting bad pixels")
+            images=IR_tools.correct_images(images,self.badpixels)
+            self.resultlist.append([self.threadID,successes,time,images])
     
-    def NUC_raw_thread(larchivepath,times,out_q,threadnumber,version=0,background=0,LUT=[[],[],[]],refT=28.5,gain=0,offset=0,gain_error=0,offset_error=0,give_ERROR=False,FOV=0,badpixels=[]):
-        images=[]
-        time=[]
-        successes=[]
-        for i in times:
-            imag=download_last_raw_image_by_time(larchivepath,i-10,i+10,version=version)
-            if imag[0]:
-                images.append(np.array(imag[1],dtype=np.uint16))
-                time.append(i)
-                successes.append(True)
+    class NUC_raw_thread(threading.Thread):
+        def __init__ (self,larchivepath,times,resultlist,threadID,version=0,background=0,LUT=[[],[],[]],refT=28.5,gain=0,offset=0,gain_error=0,offset_error=0,give_ERROR=False,FOV=0,badpixels=[]):
+            threading.Thread.__init__(self)
+            self.threadID = threadID
+            self.times = times
+            self.archivepath = larchivepath
+            self.resultlist = resultlist
+            self.version = version   
+            self.gain=gain
+            self.offset=offset
+            self.background=background
+            self.LUT=LUT
+            self.refT=refT
+            self.gain_error=gain_error
+            self.offset_error=offset_error
+            self.give_ERROR=give_ERROR
+            self.FOV=FOV
+            self.badpixels=badpixels
+        def run(self):
+            images=[]
+            time=[]
+            successes=[]
+            for i in self.times:
+                imag=download_last_raw_image_by_time(self.archivepath,i-10,i+10,version=self.version)
+                if imag[0]:
+                    images.append(np.array(imag[1],dtype=np.uint16))
+                    time.append(i)
+                    successes.append(True)
+                else:
+                    successes.append(False)
+            if self.give_ERROR:
+                images,error_images=apply_NUC(images,self.gain,self.offset,self.gain_error,self.offset_error,self.give_ERROR)
             else:
-                successes.append(False)
-        if give_ERROR:
-            images,error_images=apply_NUC(images,gain,offset,gain_error,offset_error,give_ERROR)
-        else:
-            images=apply_NUC(images,gain,offset,gain_error,offset_error,give_ERROR)
-        
-        for i in range(len(images)):
-            images[i]=(images[i]*FOV).astype(np.float32)
-        print(datetime.datetime.now(),"correcting bad pixels")
-        images=IR_tools.correct_images(images,badpixels)
-        out_q.put([threadnumber,successes,time,images]) 
+                images=apply_NUC(images,self.gain,self.offset,self.gain_error,self.offset_error,self.give_ERROR)
+            
+            for i in range(len(images)):
+                images[i]=(images[i]*self.FOV).astype(np.float32)
+            print(datetime.datetime.now(),"correcting bad pixels")
+            images=IR_tools.correct_images(images,self.badpixels)
+            self.resultlist.append([self.threadID,successes,time,images]) 
 
 def download_raw_FLIR_images_via_png(t1,t6,time_s=0,version=0,threads=1,verbose=0):    
     larchivepath=archivepath+"W7X/QSR07_FLIR/AEK51_raw"
@@ -940,16 +975,13 @@ def download_FLIR_Psets(larchivepath,timess,threads,versions,verbose=0):
                     tim.append(times)
                     versionss.append(versions[setn])
             jobs = []
-            out_q=multiprocessing.Queue()
+            resultdict = []
             for i in range(threads):
                 if verbose>0:
                     print("Start Thread ",i+1)                
-                p = multiprocessing.Process(target=download_raw_images_png_by_times_thread, args=(larchivepaths[i],tim[i],out_q,i,versionss[i],))
-                jobs.append(p)
-                p.start()
-            resultdict = []
-            for i in range(threads):
-                resultdict.append(out_q.get())
+                TH=download_images_thread(i,larchivepaths[i],tim[i],resultdict,versionss[i])
+                jobs.append(TH)
+                TH.start()            
             for p in jobs:
                 p.join()
             if verbose>0:
@@ -1481,10 +1513,10 @@ def get_temp_from_raw_by_program(portnr,program,time_s=0,emi=0.8,T_version=2,ver
     prog=get_program_from_PID(program)
     if prog[0]:
         t0=prog[1]['trigger']['0'][0]
-        starttime=prog[1]['trigger']['1'][0]
-        stoptime=prog[1]['trigger']['6'][0]
+        t1=prog[1]['trigger']['1'][0]
+        t6=prog[1]['trigger']['6'][0]
         success=True
-        OP=get_OP_by_time(starttime)
+        OP=get_OP_by_time(t1)
 
         if type(portnr) is str:
             try:
@@ -1507,7 +1539,7 @@ def get_temp_from_raw_by_program(portnr,program,time_s=0,emi=0.8,T_version=2,ver
         else:
             if FLIR:
                 print("to be implemented")
-                exist,time,frames,mode,tsets,versions=download_raw_FLIR_images_via_png(t1=starttime,t6=stoptime,time_s=time_s,version=version,threads=threads,verbose=verbose-1)
+                exist,time,frames,mode,tsets,versions=download_raw_FLIR_images_via_png(t1=t1,t6=t6,time_s=time_s,version=version,threads=threads,verbose=verbose-1)
                 if exist:
                     if mode==1:
                         Psets=IR_tools.check_dublicates(tsets)
@@ -1515,7 +1547,7 @@ def get_temp_from_raw_by_program(portnr,program,time_s=0,emi=0.8,T_version=2,ver
                         Temp_Co=[]
                         for PS in range(4):                            
                             if PS in Psets:                            
-                                parlog=read_restdb_old(archivepath+"W7X/QSR07_FLIR/AEK51_raw_PS"+str(PS)+"_PARLOG/V"+str(versions[PS])+"/_signal.json?from="+str(starttime-10)+"&upto="+str(stoptime+20))
+                                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])]
@@ -1552,16 +1584,33 @@ def get_temp_from_raw_by_program(portnr,program,time_s=0,emi=0.8,T_version=2,ver
                     print("FLIR data not found")
                     return False,[0],[0],[]
             else:
-                cexist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,program,emi,T_version,version,back_emissivity,verbose=verbose-1)
+                cexist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,t0,t1,t6,emi,T_version,version,back_emissivity,verbose=verbose-1)
                 if not cexist:
                     if verbose>0:
                         print("Unable to load the complete calibration data for",program," please confirm that this data was uploaded")
                     return False,[0],[0],False
                 else:
+                    
+                    Cam=portcamdict[OP]['AEF'+str(portnr)]
+                    if OP=="OP1.2a":
+                        if Cam.split("_")[0]=="Infratec":#camera=="INFRATEC" or camera=="infratec" or camera=="Infratec":
+                            if version==0:
+                                version=get_latest_version("QRT_INFRATEC/"+"AEF"+str(portnr)+"_raw_DATASTREAM")
+                            larchivepath=archivepath+"Test/raw/W7X/"+"QRT_INFRATEC/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
+                        elif Cam.split("_")[0]=="IRCam":#camera=="IRCAM" or camera=="IRcam" or camera=="ircam":
+                            if version==0:
+                                version=get_latest_version("QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM")
+                            larchivepath=archivepath+"W7X/"+"QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
+                        else:
+                            raise Exception("Port number does not fit the known cameras")
+                    elif OP=="OP1.2b":
+                        if version==0:
+                            version=get_latest_version("QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM")
+                        larchivepath=archivepath+"W7X/"+"QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
                     if verbose>0:
                         print(datetime.datetime.now(),"raw download start")
                     if fastDL: 
-                        exist,time,frames=download_raw_images_by_program_via_png(portnr,program,time_s,version,threads,verbose=verbose-1)
+                        exist,time,frames=download_raw_images_by_time_via_png(larchivepath,starttime=t1,stoptime=t6,time_s=time_s,version=version,threads=threads,verbose=verbose-1)
                     else:
                         exist,time,frames=download_raw_images_by_program(portnr,program,time_s,version,verbose=verbose-1)
                         if exist:
@@ -1578,6 +1627,7 @@ def get_temp_from_raw_by_program(portnr,program,time_s=0,emi=0.8,T_version=2,ver
                         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:
@@ -1606,10 +1656,10 @@ def get_temp_from_raw_by_program(portnr,program,time_s=0,emi=0.8,T_version=2,ver
                         #        i=len(frames)
                             date=int(program.split(".")[0])
                             if date>20180712 and date<20180720:
-                                prog=get_program_from_PID(program)
+#                                prog=get_program_from_PID(program)
                                 if prog[0]:
                         #            t0time=prog[1]['trigger']['0'][0]
-                                    starttime=prog[1]['trigger']['1'][0]
+                                    starttime=t1#prog[1]['trigger']['1'][0]
                                     toff=time[0]-starttime
                                     if toff>10e6:
                                         print("time offset detected, offset is "+str(toff)+" ns, correcting")
@@ -1637,11 +1687,11 @@ def get_temp_from_raw_by_program_fullthreads(portnr,program,time_s=0,emi=0.8,T_v
             if Cam.split("_")[0]=="Infratec":#camera=="INFRATEC" or camera=="infratec" or camera=="Infratec":
                 if version==0:
                     version=get_latest_version("QRT_INFRATEC/"+"AEF"+str(portnr)+"_raw_DATASTREAM")
-                larchivepath="Test/raw/W7X/"+"QRT_INFRATEC/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
+                larchivepath=archivepath+"W7X/"+"QRT_INFRATEC/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
             elif Cam.split("_")[0]=="IRCam":#camera=="IRCAM" or camera=="IRcam" or camera=="ircam":
                 if version==0:
                     version=get_latest_version("QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM")
-                larchivepath="Test/raw/W7X/"+"QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
+                larchivepath=archivepath+"W7X/"+"QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
             else:
                 raise Exception("Port number does not fit the known cameras")
             if type(time_s)==list:
@@ -1674,15 +1724,13 @@ def get_temp_from_raw_by_program_fullthreads(portnr,program,time_s=0,emi=0.8,T_v
                 intervalls.append(int(i*intervalSize))
             intervalls.append(lnt)
             jobs = []
-            out_q=multiprocessing.Queue()
+            resultdict = [] 
             for i in range(threads):
                 print("Start Thread ",i+1)                
-                p = multiprocessing.Process(target=convert_raw_to_temp_thread, args=(larchivepath,tim[intervalls[i]:intervalls[i+1]],out_q,i,version,background,LUT,refT,gain,offset,gain_error,offset_error,give_ERROR,FOV,badpixels,))
+#                p = multiprocessing.Process(target=convert_raw_to_temp_thread, args=(larchivepath,tim[intervalls[i]:intervalls[i+1]],out_q,i,version,background,LUT,refT,gain,offset,gain_error,offset_error,give_ERROR,FOV,badpixels,))
+                p=convert_raw_to_temp_thread(larchivepath,tim[intervalls[i]:intervalls[i+1]],resultdict,i,version,background,LUT,refT,gain,offset,gain_error,offset_error,give_ERROR,FOV,badpixels)
                 jobs.append(p)
-                p.start()
-            resultdict = []
-            for i in range(threads):
-                resultdict.append(out_q.get())
+                p.start()                     
             for p in jobs:
                 p.join()
             print("all threads are done")
@@ -1751,27 +1799,29 @@ def get_nuced_raw_by_program(portnr,program,time_s=0,version=0,threads=1,give_ER
     else:
         return exist,time,frames,valid
 
-def get_nuced_raw_by_program_fullthreads(portnr,program,time_s=0,emi=0.8,T_version=2,version=0,threads=1,give_ERROR=False,check_range=True):
-    if threads==1 or not fastDL:
-        return get_nuced_raw_by_program(portnr,program,time_s,emi,T_version,version,threads,give_ERROR)
-    else:
-        background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,program,emi,T_version,version)
-        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]
+def get_nuced_raw_by_program_fullthreads(portnr,program,time_s=0,emi=0.8,T_version=2,version=1,threads=1,give_ERROR=False,check_range=True):
+    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]
+        if threads==1 or not fastDL:
+            return get_nuced_raw_by_program(portnr,program,time_s,emi,T_version,version,threads,give_ERROR)
+        else:
+            exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error=get_calib_data(portnr,t0,t1,t6,emi,T_version,version)
+            FOV=get_FOV_mask(portnr)        
+            
             success=True
-            OP=get_OP_by_time(starttime)
+            OP=get_OP_by_time(t1)
             Cam=portcamdict[OP]['AEF'+str(portnr)]
             if Cam.split("_")[0]=="Infratec":#camera=="INFRATEC" or camera=="infratec" or camera=="Infratec":
                 if version==0:
                     version=get_latest_version("QRT_INFRATEC/"+"AEF"+str(portnr)+"_raw_DATASTREAM")
-                larchivepath="Test/raw/W7X/"+"QRT_INFRATEC/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
+                larchivepath=archivepath+"W7X/"+"QRT_INFRATEC/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
             elif Cam.split("_")[0]=="IRCam":#camera=="IRCAM" or camera=="IRcam" or camera=="ircam":
                 if version==0:
                     version=get_latest_version("QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM")
-                larchivepath="Test/raw/W7X/"+"QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
+                larchivepath=archivepath+"W7X/"+"QRT_IRCAM/"+"AEF"+str(portnr)+"_raw_DATASTREAM/V"+str(version)+"/0/raw"
             else:
                 raise Exception("Port number does not fit the known cameras")
             if type(time_s)==list:
@@ -1779,20 +1829,19 @@ def get_nuced_raw_by_program_fullthreads(portnr,program,time_s=0,emi=0.8,T_versi
                 tstop=time_s[1]
                 if tstop<tstart:
                     raise Exception("endtime before starttime")
-                stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9+tstart)
+                stdate=datetime.datetime.utcfromtimestamp((t1-100)/1e9+tstart)
                 stdate=stdate.isoformat()
-                enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+tstop)  
+                enddate=datetime.datetime.utcfromtimestamp((t1)/1e9+tstop)  
                 enddate=enddate.isoformat()
             else:
-                stdate=datetime.datetime.utcfromtimestamp((starttime-100)/1e9)
+                stdate=datetime.datetime.utcfromtimestamp((t1-100)/1e9)
                 stdate=stdate.isoformat()
                 if time_s==0:
-                    enddate=datetime.datetime.utcfromtimestamp(stoptime/1e9)        
+                    enddate=datetime.datetime.utcfromtimestamp(t6/1e9)        
                     enddate=enddate.isoformat()
                 else:
-                    enddate=datetime.datetime.utcfromtimestamp((starttime)/1e9+time_s)  
+                    enddate=datetime.datetime.utcfromtimestamp((t1)/1e9+time_s)  
                     enddate=enddate.isoformat()        
-        
             times=AKF_2.get_time_intervals(larchivepath,stdate.replace("T"," "),enddate.replace("T"," "))#
             lnt=len(times)
             tim=[]
@@ -1804,15 +1853,13 @@ def get_nuced_raw_by_program_fullthreads(portnr,program,time_s=0,emi=0.8,T_versi
                 intervalls.append(int(i*intervalSize))
             intervalls.append(lnt)
             jobs = []
-            out_q=multiprocessing.Queue()
+            resultdict = []
             for i in range(threads):
                 print("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 = 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)
                 jobs.append(p)
-                p.start()
-            resultdict = []
-            for i in range(threads):
-                resultdict.append(out_q.get())
+                p.start()            
             for p in jobs:
                 p.join()
             print("all threads are done")
@@ -1820,7 +1867,7 @@ def get_nuced_raw_by_program_fullthreads(portnr,program,time_s=0,emi=0.8,T_versi
             for ele in resultdict:
                 order.append(ele[0])
                 if len(np.where(np.asarray(ele[1])==False)[0])>0:
-                    success=False            
+                    success=False   
             times=[]#np.array(resultdict[order.index(0)][2])
             images=[]#np.array(resultdict[order.index(0)][3])
             for i in range(threads):
@@ -1828,15 +1875,16 @@ def get_nuced_raw_by_program_fullthreads(portnr,program,time_s=0,emi=0.8,T_versi
                 times=times+resultdict[order.index(i)][2]
             del resultdict
             valid=True
-        else:
-            success=False
-            times=[0]
-            images=[0]
-            valid=False
-            error_images=[0]
+#        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
+            return success,np.array(times),images,valid#,error_images
         else:
             return success,np.array(times),images,valid        
 
@@ -1950,30 +1998,32 @@ def get_cooling_water_temperature_by_time(time_ns):
         result_out=[False,0,0]
     return result_in[0] and result_out[0],inlet,outlet
         
-def get_calib_data(port,program,emissivity=0.8,Temp_V=2,version=0,back_emissivity=0.82, verbose=0):
+def get_calib_data(port,t0,t1,t6,emissivity=0.8,Temp_V=2,version=0,back_emissivity=0.82, verbose=0):
     """
     get_calib_data
     return exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error
     """
-    prog=get_program_from_PID(program)
-    OP=IR_tools.get_OP_by_time(program_str=program)
+#    prog=get_program_from_PID(program)
+    OP=IR_tools.get_OP_by_time(time_ns=t0)#program_str=program)
     exist=True
 #    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[1]['trigger']['1'][0]
-        t6=prog[1]['trigger']['6'][0]
+#    if prog[0]:
+#        t0=prog[1]['trigger']['0'][0]
+#        t1=prog[1]['trigger']['1'][0]
+#        t6=prog[1]['trigger']['6'][0]
 #    except Exception as E:
 #        print("Warning: Program was not found: ",E)  
 #        return 0,0,0,0,0,0,0,0,0,0
-    else:
-        raise Warning("cannot find the program!")
-        return False,0,0,0,0,0,0,0,0,0,0
+#    else:
+#        raise Warning("cannot find the program!")
+#        return False,0,0,0,0,0,0,0,0,0,0
+    print(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_program(program,version)
+        cf=get_INFRATEC_filter_by_times(starttime=t1,stoptime=t6)
         if cf[0]:
             cfilter=cf[2]
         else:
@@ -2096,7 +2146,7 @@ def get_calib_data(port,program,emissivity=0.8,Temp_V=2,version=0,back_emissivit
             if verbose>0:
                 print(datetime.datetime.now(),"Scanning for bad pixel")
             # initial list from config files
-            init_bp_list = IR_tools.read_bad_pixels_from_file(port, program=program)
+            init_bp_list = IR_tools.read_bad_pixels_from_file(port, time_ns=t1)
             # find more bad pixel
             badpixels = find_badpixels(port, gain, offset, init_bp_list=init_bp_list, niterations=10, tolerance=10, verbose=verbose-1)        
     return exist,background,LUT,refT,gain,offset,badpixels,t_exp,cfilter,gain_error,offset_error
@@ -2355,15 +2405,18 @@ end of the copied functions
     
 if __name__=='__main__':
     print("local function calling")                    
-    port="AEK51"
+    port="AEF51"
     prog="20180925.065"
-    status,time,images,valid=get_temp_from_raw_by_program(port,prog,time_s=[0,1],emi=0.82,T_version=2,version=0,threads=1,give_ERROR=False,use_firstframe_as_background=False,verbose=5)
-    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)
+#    status,time,images,valid=get_temp_from_raw_by_program(port,prog,time_s=[0,4],emi=0.82,T_version=2,version=0,threads=4,give_ERROR=False,use_firstframe_as_background=False,verbose=5)
+#    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)
+        
+#    bla=get_temp_from_raw_by_program_fullthreads(51,prog,time_s=[0,4],threads=4)
+    bla2=get_nuced_raw_by_program_fullthreads(51,prog,time_s=[0,4],threads=4)
 #    port=41
 #    program="20180925.013"
 #    prog=get_program_from_PID(program)
-- 
GitLab