From 012e23d32ac13cef3a63b6b96f60c5308214667a Mon Sep 17 00:00:00 2001
From: sldesnoo-Delft <s.l.desnoo@tudelft.nl>
Date: Sat, 28 Jan 2023 16:10:27 +0100
Subject: [PATCH] Addded get_last_upload utility to analyse upload after an
 exception

---
 pulse_lib/tests/utils/last_upload.py | 68 ++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)
 create mode 100644 pulse_lib/tests/utils/last_upload.py

diff --git a/pulse_lib/tests/utils/last_upload.py b/pulse_lib/tests/utils/last_upload.py
new file mode 100644
index 00000000..0cb41b0a
--- /dev/null
+++ b/pulse_lib/tests/utils/last_upload.py
@@ -0,0 +1,68 @@
+
+from pulse_lib.segments.data_classes.data_pulse import OffsetRamp, PhaseShift, custom_pulse_element
+from pulse_lib.segments.data_classes.data_IQ import IQ_data_single
+from pulse_lib.segments.conditional_segment import conditional_segment
+
+def get_last_upload(pulse):
+    jobs = pulse.uploader.jobs
+    if len(jobs) == 0:
+        print("No jobs...  :-(")
+        return
+    job = jobs[-1]
+    return LastUpload(job)
+
+
+class LastUpload:
+    def __init__(self, job):
+        self.job = job
+        self.index = job.index
+        self.segments = job.sequence
+        self.segment_start = []
+        print(f'job index:{job.index}')
+        print(f'sequence: {len(self.segments)} segments')
+        end = 0
+        for segment in self.segments:
+            duration = segment.get_total_time(self.index)
+            start = end
+            end += duration
+            self.segment_start.append(start)
+            print(f'  {start:8.1f} - {end:8.1f}, ({duration:8.1f}), shape:{segment.shape}')
+
+    def describe(self, segment=None, channels=None):
+        if segment is None:
+            segments = self.segments
+        else:
+            segments = [self.segments[segment]]
+        if channels is None:
+            channels = list(self.segments[0].channels.keys())
+
+        for channel in channels:
+            print(f'Channel: {channel}')
+            for i,seg in enumerate(segments):
+                seg_offset = self.segment_start[i]
+                if isinstance(seg, conditional_segment):
+                    for j,branch in enumerate(seg.branches):
+                        seg_ch = branch[channel]
+                        data = seg_ch._get_data_all_at(self.index).get_data_elements()
+                        if len(data):
+                            print(f'Segment: {i} - Branch: {j}')
+                            self._describe_segment(data, seg_offset)
+                else:
+                    seg_ch = seg[channel]
+                    data = seg_ch._get_data_all_at(self.index).get_data_elements()
+                    if len(data):
+                        print(f'Segment: {i}')
+                        self._describe_segment(data, seg_offset)
+
+    def _describe_segment(self, data, seg_offset):
+        for e in data:
+            print(f'{e.start+seg_offset:8.1f} - {e.stop+seg_offset:8.1f} ', end='')
+            if isinstance(e, OffsetRamp):
+                print(f'ramp {e.v_start:6.2f}, {e.v_stop:6.2f} mV')
+            elif isinstance(e, custom_pulse_element):
+                print(f'custom {e.amplitude:6.2f} (*{e.scaling:5.3f}), {e.kwargs}')
+            elif isinstance(e, PhaseShift):
+                print(f'shift phase {e.phase_shift:+6.3f} rad ({e.channel_name})')
+            elif isinstance(e, IQ_data_single):
+                print(f'MW pulse {e.amplitude:6.2f} {e.frequency/1e6:6.1f} MHz {e.start_phase:+6.3f} rad ({e.ref_channel})')
+
-- 
GitLab