From f68b7f7528b7b97e61bd4215c9516ae87a66241d Mon Sep 17 00:00:00 2001
From: Hampus Wikmark Kreuger <hampus.wikmark@physics.uu.se>
Date: Mon, 30 May 2022 17:19:22 +0200
Subject: [PATCH] Load_dark optionally generates a mask to filter bad pixels

---
 src/toolbox_scs/detectors/hrixs.py | 36 ++++++++++++++++++++++++------
 1 file changed, 29 insertions(+), 7 deletions(-)

diff --git a/src/toolbox_scs/detectors/hrixs.py b/src/toolbox_scs/detectors/hrixs.py
index 88aaeec..8af3c81 100644
--- a/src/toolbox_scs/detectors/hrixs.py
+++ b/src/toolbox_scs/detectors/hrixs.py
@@ -295,7 +295,13 @@ class hRIXS:
     BINS = abs(np.subtract(*RANGE)) * FACTOR
 
     METHOD = 'centroid'  # ['centroid', 'integral']
+    
+    # Dark image and mask treatment
     USE_DARK = False
+    USE_DARK_MASK = False
+    DARK_MASK_THRESHOLD = 100
+    MASK_AVG_X = np.s_[1850:2000]
+    MASK_AVG_Y = np.s_[500:1500]
 
     ENERGY_INTERCEPT = 0
     ENERGY_SLOPE = 1
@@ -322,7 +328,10 @@ class hRIXS:
 
         return data
 
-    def load_dark(self, runNB, proposal=None):
+    def load_dark(self, runNB, proposal=None, use_dark=True, mask=True,
+                  mask_threshold=None):
+        if mask_threshold == None:
+            mask_threshold = self.DARK_MASK_THRESHOLD
         try:
             # Checks to see if runNB can be iterated over (is list-like)
             data_list = []
@@ -334,7 +343,15 @@ class hRIXS:
             data = self.from_run(runNB, proposal)
         self.dark_image = data['hRIXS_det'].mean(dim='trainId')
         self.dark_im_array = self.dark_image.to_numpy()
-        self.USE_DARK = True
+        if use_dark:
+            self.USE_DARK = True
+        if mask:
+            dark_avg = np.mean(self.dark_im_array[self.MASK_AVG_Y,
+                                                              self.MASK_AVG_X], (0, 1))
+            self.dark_mask = np.abs(self.dark_im_array - dark_avg) > mask_threshold
+            self.dark_im_array_m = np.array(self.dark_im_array)
+            self.dark_im_array_m[self.dark_mask] = dark_avg
+            self.USE_DARK_MASK = True
 
     def find_curvature(self, runNB, proposal=None, plot=True, args=None, **kwargs):
         data = self.from_run(runNB, proposal)
@@ -356,10 +373,15 @@ class hRIXS:
         hit_y = []
         ret = np.zeros((len(data["hRIXS_det"]), bins))
         for image, r in zip(data["hRIXS_det"], ret):
-            if self.USE_DARK:
-                use_image = image.to_numpy() - self.dark_im_array
+            use_image = image.to_numpy()
+            if self.USE_DARK_MASK:
+                use_image[self.dark_mask] = np.mean(use_image[self.MASK_AVG_Y,
+                                                              self.MASK_AVG_X], (0, 1))
+                if self.USE_DARK:
+                    use_image = use_image - self.dark_im_array_m
             else:
-                use_image = image.to_numpy()
+                if self.USE_DARK:
+                    use_image = use_image - self.dark_im_array
             c = centroid(
                 use_image[self.X_RANGE, self.Y_RANGE].T,
                 threshold=self.THRESHOLD,
@@ -371,8 +393,8 @@ class hRIXS:
             rc = np.array(c)
             
             if return_hits:
-                hit_x.append(rc[:,0])
-                hit_y.append(rc[:,1])
+                hit_x.append(rc[:, 0])
+                hit_y.append(rc[:, 1])
 
             hy, hx = np.histogram(
                 rc[:, 0], bins=bins,
-- 
GitLab