From c7fb9eed9fd74f43f07c51490635aaee842e99fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Le=20Guyader?= <loic.le.guyader@xfel.eu>
Date: Thu, 7 Nov 2019 10:47:49 +0100
Subject: [PATCH] discard DSSC1module saturated shots

---
 DSSC1module.py | 36 +++++++++++++++++++++++++++++++-----
 1 file changed, 31 insertions(+), 5 deletions(-)

diff --git a/DSSC1module.py b/DSSC1module.py
index 97ac5d8..380e0c9 100644
--- a/DSSC1module.py
+++ b/DSSC1module.py
@@ -55,6 +55,7 @@ class DSSC1module:
         self.max_fraction_memory = 0.8
         self.Nworker = 10
         self.rois = None
+        self.maxSaturatedPixel = 1
            
     def open_run(self, run_nr, t0=0.0):
         """ Open a run with karabo-data and prepare the virtual dataset for multiprocessing
@@ -98,7 +99,7 @@ class DSSC1module:
         print(f'Loading mono nrj data')
         self.nrj = self.run.get_array(tb.mnemonics['nrj']['source'],
                                       tb.mnemonics['nrj']['key'])
-        print(f'Loading daly line data')
+        print(f'Loading delay line data')
         try:
             self.delay_mm = self.run.get_array(tb.mnemonics['PP800_DelayLine']['source'],
                                                tb.mnemonics['PP800_DelayLine']['key'])
@@ -157,7 +158,8 @@ class DSSC1module:
             Nworker=self.Nworker,
             dark_data=dark,
             rois=rois,
-            mask=mask
+            mask=mask,
+            maxSaturatedPixel=self.maxSaturatedPixel
             ))
             
         timestamp = strftime('%X')
@@ -337,6 +339,7 @@ def process_one_module(job):
     rois = job['rois']
     mask = job['mask']
     h5fname = job['h5fname']
+    maxSaturatedPixel = job['maxSaturatedPixel']
     
     image_path = f"INSTRUMENT/SCS_DET_DSSC1M-1/DET/{module}CH0:xtdf/image/data"
     npulse_path = f"INDEX/SCS_DET_DSSC1M-1/DET/{module}CH0:xtdf/image/count"
@@ -388,9 +391,32 @@ def process_one_module(job):
             if rois is not None:
                 temp2 = temp.where(mask)
                 for k,v in rois.items():
-                    val = temp2.isel({'x':slice(v['x'][0], v['x'][1]),
-                                     'y':slice(v['y'][0], v['y'][1])}).sum(dim=['x','y'])
-                    module_data[k] = val
+                    bkg = dark_data.isel({'x':slice(v['x'][0], v['x'][1]),
+                                     'y':slice(v['y'][0], v['y'][1])})
+                    
+                    im = data.isel({'x':slice(v['x'][0], v['x'][1]),
+                                     'y':slice(v['y'][0], v['y'][1])})
+                    
+                    smask = mask.isel({'x':slice(v['x'][0], v['x'][1]),
+                                     'y':slice(v['y'][0], v['y'][1])})
+                    
+                    im = im.where(smask)
+                                        
+
+                    cim = im - bkg.where(smask)
+                    
+                    val = cim.sum(dim=['x','y'])
+                    
+                    tokeep = (im>254).sum(dim=['x', 'y']) < maxSaturatedPixel
+                    tokeep = tokeep.assign_coords(pulseId = val.coords['pulseId'].values)
+                    todrop = 1-tokeep
+                    
+                    Ndropped = todrop.sum().values
+                    percent_dropped = 100*Ndropped/(n_trains * fpt)
+                    
+                    print(f'Dropped: {Ndropped}, i.e. {percent_dropped:.2f}%')
+                    gval = val.where(tokeep, np.nan) 
+                    module_data[k] = gval
 
             module_data['dark_corrected_data'] += temp.sum(dim='trainId')
             module_data['std_data'] += (temp**2).sum(dim='trainId')
-- 
GitLab