From 727b04d5b9503ab205437657fe570abcd066f618 Mon Sep 17 00:00:00 2001
From: Marko Mecina <marko.mecina@univie.ac.at>
Date: Mon, 11 Dec 2023 18:13:03 +0100
Subject: [PATCH] flip CCD4 nodes in merged view (ED and FT)

---
 .../dataprocessing/smile_raw_ce_converter.py  | 52 ++++++++++---------
 1 file changed, 27 insertions(+), 25 deletions(-)

diff --git a/Ccs/tools/dataprocessing/smile_raw_ce_converter.py b/Ccs/tools/dataprocessing/smile_raw_ce_converter.py
index 4930f74..5300ed6 100755
--- a/Ccs/tools/dataprocessing/smile_raw_ce_converter.py
+++ b/Ccs/tools/dataprocessing/smile_raw_ce_converter.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Convert unprocessed CE raw data to FITS files. Product type is determined (guessed) based on CE size.
@@ -12,8 +12,12 @@ import numpy as np
 from astropy.io import fits
 
 # expected CE sizes in bytes
-SIZE_FF = 4511 * 4608 * 2
-SIZE_FT = 639 * 384 * 2  # 1 node
+NROWS_FF = 4511
+NCOLS_FF = 4608
+NROWS_FT = 639
+NCOLS_FT = 384
+SIZE_FF = NROWS_FF * NCOLS_FF * 2
+SIZE_FT = NROWS_FT * NCOLS_FT * 2  # 1 node
 SIZE_ED = 64  # 1 event
 
 FILE_PREFIX = 'SMILE_SXI_L1'
@@ -49,7 +53,7 @@ def convert_ce(cefile, fitsfile=None):
 
 def mk_ff(data):
     # create uint16 array from raw data and reshape
-    arr = np.frombuffer(data, dtype='>H').reshape(4511, -1)
+    arr = np.frombuffer(data, dtype='>H').reshape(NROWS_FF, NCOLS_FF)
     fnode = arr[:, ::2]
     enode = arr[:, 1::2][:, ::-1]
     ff = np.concatenate((fnode, enode), axis=1)
@@ -62,23 +66,16 @@ def mk_ff(data):
 
 
 def mk_ft(data):
-    arr = np.frombuffer(data, dtype='>H').reshape(-1, 639, 384)
+    arr = np.frombuffer(data, dtype='>H').reshape(-1, NROWS_FT, NCOLS_FT)
 
     hdl = _mk_hdl('FT')
     for n in range(arr.shape[0]):
         hdl.append(fits.ImageHDU(data=arr[n, :, :], name='FT_CCD_NODE_{}'.format(n)))
 
-    # arrange all nodes to full CCD view
+    # arrange all nodes to full CCD
     if arr.shape[0] == 4:
-        n00 = arr[0, :, :]  # CCD2 F-side
-        n01 = arr[1, :, ::-1]  # CCD2 E-side
-        n10 = arr[2, ::-1, :]  # CCD4 F-side
-        n11 = arr[3, ::-1, ::-1]  # CCD4 E-side
 
-        n0 = np.concatenate((n00, n01), 1)
-        n1 = np.concatenate((n10, n11), 1)
-
-        nn = np.concatenate((n0, n1), 0)  # [::-1, :]
+        nn = _assemble_ft_frames_to_fp_view(arr)
 
         hdl.append(fits.ImageHDU(data=nn, name='FULLCCD'))
 
@@ -87,14 +84,14 @@ def mk_ft(data):
 
 def mk_ed(data):
     # reshape into array of evt packets
-    arr = np.frombuffer(data, dtype='>H').reshape(-1, 32)
+    arr = np.frombuffer(data, dtype='>H').reshape(-1, SIZE_ED // 2)
 
     hdl = _mk_hdl('FT')
     ts = int(hdl['PRIMARY'].header['OBS_ID'])
     bindata = np.array([_mk_bin_entry(evt, ts) for evt in arr], dtype=ED_BIN_DTYPE)
 
     # also add an HDU with event map
-    nodes = np.zeros((2, 2, 639, 384))
+    nodes = np.zeros((2, 2, NROWS_FT, NCOLS_FT))
     nodes[:] = np.nan
 
     for _, _, ccd, col, row, node, fx in bindata:
@@ -103,15 +100,7 @@ def mk_ed(data):
         except:
             print(col, row, 'FAILED')
 
-    n00 = nodes[0, 0, :, :]  # CCD2 F-side
-    n01 = nodes[0, 1, :, :][:, ::-1]  # CCD2 E-side
-    n10 = nodes[1, 0, :, :][::-1, :]  # CCD4 F-side
-    n11 = nodes[1, 1, :, :][::-1, ::-1]  # CCD4 E-side
-
-    n0 = np.concatenate((n00, n01), 1)
-    n1 = np.concatenate((n10, n11), 1)
-
-    ed_img = np.concatenate((n0, n1), 0)  # [::-1, :]
+    ed_img = _assemble_ft_frames_to_fp_view(nodes)
 
     hdl.append(fits.ImageHDU(data=ed_img, name='EVTMAP'))
 
@@ -129,6 +118,19 @@ def _mk_bin_entry(data, timestamp):
     return timestamp, fc, ccdnr, col, row, node, evts
 
 
+def _assemble_ft_frames_to_fp_view(arr3d):
+
+    n00 = arr3d[0, :, :]  # CCD2 F-side (lower left in FP view)
+    n01 = arr3d[1, :, ::-1]  # CCD2 E-side (lower right in FP view)
+    n10 = arr3d[2, ::-1, ::-1]  # CCD4 F-side (upper right in FP view)
+    n11 = arr3d[3, ::-1, :]  # CCD4 E-side (upper left in FP view)
+
+    n0 = np.concatenate((n00, n01), axis=1)  # CCD2
+    n1 = np.concatenate((n11, n10), axis=1)  # CCD4
+
+    return np.concatenate((n0, n1), axis=0)
+
+
 def _mk_hdl(dmode):
     hdl = fits.HDUList()
     phdu = fits.PrimaryHDU()
-- 
GitLab