mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-21 19:30:03 +02:00
143 lines
3.5 KiB
ReStructuredText
Executable File
143 lines
3.5 KiB
ReStructuredText
Executable File
Examples
|
|
================
|
|
|
|
Some short hints on how to use the detector
|
|
|
|
------------------------
|
|
Simple threshold scan
|
|
------------------------
|
|
|
|
Assuming you have set up your detector with exposure time, period, enabled
|
|
file writing etc.
|
|
|
|
.. code-block:: python
|
|
|
|
from sls_detector import Eiger
|
|
|
|
d = Eiger()
|
|
threshold = range(0, 2000, 200)
|
|
for th in threshold:
|
|
d.vthreshold = th
|
|
d.acq()
|
|
|
|
|
|
If we want to control the shutter of for example, the big X-ray box we can add
|
|
this line in our code. It then opens the shutter just before the measurement
|
|
and closes is afterwards.
|
|
|
|
::
|
|
|
|
with xrf_shutter_open(box, 'Fe'):
|
|
for th in threshold:
|
|
d.vthreshold = th
|
|
d.acq()
|
|
|
|
|
|
-----------------------
|
|
Reading temperatures
|
|
-----------------------
|
|
|
|
::
|
|
|
|
d.temp
|
|
>>
|
|
temp_fpga : 43.19°C, 51.83°C
|
|
temp_fpgaext : 38.50°C, 38.50°C
|
|
temp_10ge : 39.50°C, 39.50°C
|
|
temp_dcdc : 42.50°C, 42.50°C
|
|
temp_sodl : 39.50°C, 40.50°C
|
|
temp_sodr : 39.50°C, 40.50°C
|
|
temp_fpgafl : 40.87°C, 37.61°C
|
|
temp_fpgafr : 34.51°C, 35.63°C
|
|
|
|
d.temp.fpga
|
|
>> temp_fpga : 40.84°C, 39.31°C
|
|
|
|
t = d.temp.fpga[0]
|
|
t
|
|
>> 40.551
|
|
|
|
t = d.temp.fpga[:]
|
|
t
|
|
>> [40.566, 39.128]
|
|
|
|
|
|
-----------------------
|
|
Non blocking acquire
|
|
-----------------------
|
|
|
|
There are mainly two ways to achieve a non blocking acquire when calling from the Python API. One is to manually start
|
|
the detector and the second one is to launch the normal acquire from a different process. Depending on your measurement
|
|
it might also be better to run the other task in a seperate process and use acq in the main thread.
|
|
But lets start looking at the at the manual way:
|
|
|
|
::
|
|
|
|
import time
|
|
from sls_detector import Eiger
|
|
d = Eiger()
|
|
|
|
n = 10
|
|
t = 1
|
|
|
|
d.exposure_time = t
|
|
d.n_frames = n
|
|
d.reset_frames_caught()
|
|
|
|
#Start the measurement
|
|
t0 = time.time()
|
|
d.start_receiver()
|
|
d.start_detector()
|
|
|
|
#Wait for the detector to be ready or do other important stuff
|
|
time.sleep(t*n)
|
|
|
|
#check if the detector is ready otherwise wait a bit longer
|
|
while d.status != '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.stop_receiver()
|
|
|
|
lost = d.frames_caught - n
|
|
print(f'{n} frames of {t}s took {time.time()-t0:{.3}}s with {lost} frames lost ')
|
|
|
|
#Reset to not interfere with a potential next measurement
|
|
d.reset_frames_caught()
|
|
|
|
Instead launching d.acq() from a different process is a bit easier since the control of receiver and detector
|
|
is handled in the acq call. However, you need to join the process used otherwise a lot of zombie processes would
|
|
hang around until the main process exits.
|
|
|
|
::
|
|
|
|
import time
|
|
from multiprocessing import Process
|
|
from sls_detector import Eiger
|
|
|
|
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()
|
|
|
|
#Process to run acquire
|
|
p = Process(target=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)
|
|
time.sleep(0.1)
|
|
|
|
#Join the process
|
|
p.join() |