From 66b9f977a44392a618fc91d49f79b5a60351d5db Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Le=20Guyader?= <loic.le.guyader@xfel.eu>
Date: Tue, 11 Apr 2023 14:21:47 +0200
Subject: [PATCH] Improve automatic BOZ ROIs determination

---
 src/toolbox_scs/routines/boz.py | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/toolbox_scs/routines/boz.py b/src/toolbox_scs/routines/boz.py
index c15821c..9ba0d96 100644
--- a/src/toolbox_scs/routines/boz.py
+++ b/src/toolbox_scs/routines/boz.py
@@ -647,25 +647,32 @@ def find_rois(data_mean, threshold, extended=False):
     pX = data_mean.mean(axis=0)
     pX = pX[:256]  # half the ladder since there is a gap in the middle
     pY = data_mean.mean(axis=1)
+    pX = pX/np.max(pX)
+    pY = pY/np.max(pY)
 
     # along X
-    lowX = int(np.argmax(pX[:64] > threshold))  # 1st occurrence returned
-    highX = int(np.argmax(pX[192:] <= threshold) + 192)  # 1st occ. returned
+    lowX = int(np.argmax(pX > threshold))  # 1st occurrence returned
+    highX = int(pX.shape[0] - np.argmax(pX[::-1] > threshold) - 1)  # last occ. returned
 
-    leftX = int(np.argmin(pX[64:128]) + 64)
-    rightX = int(np.argmin(pX[128:192]) + 128)
+    midX = int(0.5*(lowX+highX))
+
+    leftX2 = int(np.argmax(pX[lowX+5:midX-5] < threshold)) + lowX + 5
+    midX2 = int(np.argmax(pX[midX+5:highX-5] < threshold)) + midX + 5
+
+    midX1 = int(midX - 5 - np.argmax(pX[midX-5:lowX+5:-1] < threshold))
+    rightX1 = int(highX - 5 - np.argmax(pX[highX-5:midX+5:-1] < threshold))
 
     # along Y
     lowY = int(np.argmax(pY > threshold))  # 1st occurrence returned
-    highY = int(pY.shape[0] - np.argmax(pY[::-1] > threshold) - 1)  # 1st occ. returned
+    highY = int(pY.shape[0] - np.argmax(pY[::-1] > threshold) - 1)  # last occ. returned
 
     # define rois
     rois = {}
 
     # beam roi
-    rois['n'] = {'xl': lowX, 'xh': leftX, 'yl': lowY, 'yh': highY}
-    rois['0'] = {'xl': leftX, 'xh': rightX, 'yl': lowY, 'yh': highY}
-    rois['p'] = {'xl': rightX, 'xh': highX, 'yl': lowY, 'yh': highY}
+    rois['n'] = {'xl': lowX, 'xh': leftX2, 'yl': lowY, 'yh': highY}
+    rois['0'] = {'xl': midX1, 'xh': midX2, 'yl': lowY, 'yh': highY}
+    rois['p'] = {'xl': rightX1, 'xh': highX, 'yl': lowY, 'yh': highY}
 
     # saturation roi
     rois['sat'] = {'xl': lowX, 'xh': highX, 'yl': lowY, 'yh': highY}
-- 
GitLab