From 9b26f5a6c8afbe88f1b909627590d4b09ffa0c59 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 20 Aug 2020 09:21:59 +0200 Subject: [PATCH] added python examples in source --- docs/src/pyexamples.rst | 56 +++++++++---------- .../examples/non-blocking-acquire-process.py | 21 +++++++ python/examples/non-blocking-acquire.py | 33 +++++++++++ 3 files changed, 80 insertions(+), 30 deletions(-) create mode 100644 python/examples/non-blocking-acquire-process.py create mode 100644 python/examples/non-blocking-acquire.py diff --git a/docs/src/pyexamples.rst b/docs/src/pyexamples.rst index ad3f67865..781145c12 100755 --- a/docs/src/pyexamples.rst +++ b/docs/src/pyexamples.rst @@ -74,34 +74,38 @@ But lets start looking at the at the manual way: :: import time - from slsdet import Eiger, runStatus - d = Eiger() - - n = 10 - t = 1 - - d.exptime = t - d.frames = n + from slsdet import Detector, runStatus - #Start the measurement + n_frames = 10 + t_exp = 1 + + # Set exposure time and number of frames + d = Detector() + d.exptime = t_exp + d.frames = n_frames + + # Start the measurement t0 = time.time() d.startDetector() d.startReceiver() - #Wait for the detector to be ready or do other important stuff - time.sleep(t*n) + # Wait for the detector to be ready or do other important stuff + time.sleep(t_exp * n_frames) - #check if the detector is ready otherwise wait a bit longer + # check if the detector is ready otherwise wait a bit longer while d.status != runStatus.IDLE: time.sleep(0.1) - #Stop the receiver after we got the frames - #Detector is already idle so we don't need to stop it + # Stop the receiver after we got the frames + # Detector is already idle so we don't need to stop it d.stopReceiver() - lost = d.rx_framescaught - n - print(f'{n} frames of {t}s took {time.time()-t0:{.3}}s with {lost} frames lost ') + lost = d.rx_framescaught - n_frames + print( + f"{n_frames} frames of {t_exp}s took {time.time()-t0:{.3}}s with {lost} frames lost " + ) + Instead launching d.acq() from a different process is a bit easier since the control of receiver and detector @@ -112,29 +116,21 @@ hang around until the main process exits. import time from multiprocessing import Process - from slsdet import Eiger + from slsdet import Detector, runStatus - def acquire(): - """ - Create a new Eiger object that still referes to the same actual detector - and same shared memory. Then launch acq. - """ - detector = Eiger() - detector.acq() - #This is the detector we use throughout the session - d = Eiger() + d = Detector() - #Process to run acquire - p = Process(target=acquire) + #Create a separate process to run acquire in + p = Process(target=d.acquire) #Start the thread and short sleep to allow the acq to start p.start() time.sleep(0.01) #Do some other work - while d.busy is True: - print(d.busy) + while d.status != runStatus.IDLE: + print("Working") time.sleep(0.1) #Join the process diff --git a/python/examples/non-blocking-acquire-process.py b/python/examples/non-blocking-acquire-process.py new file mode 100644 index 000000000..486a3dd93 --- /dev/null +++ b/python/examples/non-blocking-acquire-process.py @@ -0,0 +1,21 @@ +import time +from multiprocessing import Process +from slsdet import Detector, runStatus + + +d = Detector() + +#Create a separate process to run acquire in +p = Process(target=d.acquire) + +#Start the thread and short sleep to allow the acq to start +p.start() +time.sleep(0.01) + +#Do some other work +while d.status != runStatus.IDLE: + print("Working") + time.sleep(0.1) + +#Join the process +p.join() \ No newline at end of file diff --git a/python/examples/non-blocking-acquire.py b/python/examples/non-blocking-acquire.py new file mode 100644 index 000000000..dd434b2a0 --- /dev/null +++ b/python/examples/non-blocking-acquire.py @@ -0,0 +1,33 @@ +import time +from slsdet import Detector, runStatus + + +n_frames = 10 +t_exp = 1 + +# Set exposure time and number of frames +d = Detector() +d.exptime = t_exp +d.frames = n_frames + +# Start the measurement +t0 = time.time() +d.startDetector() +d.startReceiver() + +# Wait for the detector to be ready or do other important stuff +time.sleep(t_exp * n_frames) + +# check if the detector is ready otherwise wait a bit longer +while d.status != runStatus.IDLE: + time.sleep(0.1) + +# Stop the receiver after we got the frames +# Detector is already idle so we don't need to stop it +d.stopReceiver() + +lost = d.rx_framescaught - n_frames +print( + f"{n_frames} frames of {t_exp}s took {time.time()-t0:{.3}}s with {lost} frames lost " +) +