From d1c66c32308e696ae9fe8161198a6febf744145d Mon Sep 17 00:00:00 2001
From: Laurent Mercadier <laurent.mercadier@xfel.eu>
Date: Thu, 23 Apr 2020 09:59:30 +0200
Subject: [PATCH] calibrateXGMs(): attempts to load slowTrain data and adds
 plot

---
 xgm.py | 62 ++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 41 insertions(+), 21 deletions(-)

diff --git a/xgm.py b/xgm.py
index edade0b..ecb78ef 100644
--- a/xgm.py
+++ b/xgm.py
@@ -234,29 +234,49 @@ def calibrateXGMs(data, rollingWindow=200, plot=False):
             factors: numpy ndarray of shape 1 x 2 containing 
                      [XTD10 calibration factor, SCS calibration factor]
     '''
-    XTD10_factor = np.nan
-    SCS_factor = np.nan
-    if "XTD10_slowTrain" in data or "SCS_slowTrain" in data:
-        if "XTD10_slowTrain" in data:
-            XTD10_factor = np.mean(data.XTD10_photonFlux/data.XTD10_slowTrain)
-            
-        else:
-            print('no XTD10 XGM data. Skipping calibration for XTD10 XGM')
-        if "SCS_slowTrain" in data:
-            #XTD10_SA3_contrib = data.XTD10_slowTrain_SA3 * data.npulses_sase3 / (
-            #                data.XTD10_slowTrain * (data.npulses_sase3+data.npulses_sase1))
-            #SCS_SA3_SLOW = data.SCS_photonFlux*(data.npulses_sase3+
-            #                                    data.npulses_sase1)*XTD10_SA3_contrib/data.npulses_sase3
-            #SCS_factor = np.mean(SCS_SA3_SLOW/data.SCS_slowTrain_SA3)
-            SCS_factor = np.mean(data.SCS_photonFlux/data.SCS_slowTrain)
+    noSlowTrain=False
+    results = np.array([np.nan, np.nan], dtype=float)
+    slowTrainTraces = []
+    for i,whichXgm in enumerate(['XTD10', 'SCS']):
+        if f'{whichXgm}_slowTrain' not in data:
+            mnemo = tb.mnemonics[f'{whichXgm}_slowTrain']
+            if mnemo['key'] in data.attrs['run'].keys_for_source(mnemo['source']):
+                slowTrain = data.attrs['run'].get_array(mnemo['source'], mnemo['key'])
+            else:
+                noSlowTrain=True
+                print('No averages of fast data (slowTrain) available.'+
+                      ' Attempting calibration from fast data.')
+                break
         else:
-            print('no SCS XGM data. Skipping calibration for SCS XGM')
-            
-        #TODO: plot the results of calibration
-        return np.array([XTD10_factor, SCS_factor])
-    else:
+            slowTrain = data[f'{whichXgm}_slowTrain']
+        results[i] = np.mean(data[f'{whichXgm}_photonFlux']/slowTrain)
+        slowTrainTraces.append(slowTrain)
+    if noSlowTrain:
         return calibrateXGMsFromAllPulses(data, rollingWindow, plot)
-        
+    else:
+        if plot:
+            plt.figure(figsize=(8,4))
+            plt.subplot(211)
+            plt.plot(data['XTD10_photonFlux'], label='XTD10 photon flux')
+            plt.plot(slowTrainTraces[0]*results[0], label='calibrated XTD10 fast signal')
+            plt.ylabel(r'Energy [$\mu$J]')
+            plt.xlabel('train Id')
+            plt.legend(fontsize=8, loc='upper left')
+            plt.twinx()
+            plt.plot(slowTrainTraces[0], label='uncalibrated XTD10 fast signal', color='C4')
+            plt.ylabel(r'Uncalibrated energy')
+            plt.legend(fontsize=8, loc='upper right')
+            plt.subplot(212)
+            plt.plot(data['SCS_photonFlux'], label='SCS photon flux')
+            plt.plot(slowTrainTraces[1]*results[1], label='calibrated SCS fast signal')
+            plt.ylabel(r'Energy [$\mu$J]')
+            plt.xlabel('train Id')
+            plt.legend(fontsize=8, loc='upper left')
+            plt.twinx()
+            plt.plot(slowTrainTraces[1], label='uncalibrated SCS fast signal', color='C4')
+            plt.ylabel(r'Uncalibrated energy')
+            plt.legend(fontsize=8, loc='upper right')
+        return results
         
 def calibrateXGMsFromAllPulses(data, rollingWindow=200, plot=False):
     ''' Calibrate the fast (pulse-resolved) signals of the XTD10 and SCS XGM 
-- 
GitLab