From c7259538e9791193e1cf889ef1e514b0eaaac2ed Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 18 Apr 2019 13:39:43 +0200 Subject: [PATCH 1/4] python commands --- python/scripts/basic.py | 20 +----- python/sls_detector/detector.py | 21 ++++++- python/sls_detector/experimental.py | 8 +++ python/src/Detector.h | 9 ++- python/src/main.cpp | 98 ++++++++++++++++------------- 5 files changed, 88 insertions(+), 68 deletions(-) diff --git a/python/scripts/basic.py b/python/scripts/basic.py index 561ce38e4..2536d91ff 100755 --- a/python/scripts/basic.py +++ b/python/scripts/basic.py @@ -2,27 +2,11 @@ import os import sys import numpy as np sys.path.append(os.path.join(os.getcwd(), 'bin')) -from sls_detector import Eiger +from sls_detector import Eiger, Detector from sls_detector import ExperimentalDetector from _sls_detector.io import read_my302_file -d = Eiger() +d = Detector() e = ExperimentalDetector() - -# for i in range(200): -# a = read_my302_file('/home/l_frojdh/Downloads/run_d0_5.raw', i, 24) -# print(f'{i}: {(a==5).sum()}') - - - -# a = read_my302_file('/home/l_frojdh/Downloads/run_d0_5.raw', 104, 24) -# ncols = 192 -# start = 600 -# end = 1800 -# nrows = end-start -# data = np.zeros((nrows, ncols)) - -# for i in range(nrows): -# data[i, :] = read_ctb_file(f'/home/l_frojdh/mythendata/MoKbZr_30kV60mA_1s_200V_thr{start+i}_1.raw', 8, 24) \ No newline at end of file diff --git a/python/sls_detector/detector.py b/python/sls_detector/detector.py index 389cb57ed..460dacdeb 100755 --- a/python/sls_detector/detector.py +++ b/python/sls_detector/detector.py @@ -16,6 +16,7 @@ from .errors import DetectorError, DetectorValueError from .registers import Register from .utils import element_if_equal +import numpy as np class Detector: """ @@ -1358,7 +1359,7 @@ class Detector: #TODO! can we make this one function? @property def patnloop0(self): - return self._api.getPatternLoops(0, -1) + return self._api.getPatternLoops(0, -1)[2] @patnloop0.setter def patnloop0(self, n): @@ -1366,7 +1367,7 @@ class Detector: @property def patnloop1(self): - return self._api.getPatternLoops(1, -1) + return self._api.getPatternLoops(1, -1)[2] @patnloop1.setter def patnloop1(self, n): @@ -1374,7 +1375,7 @@ class Detector: @property def patnloop2(self): - return self._api.getPatternLoops(2, -1) + return self._api.getPatternLoops(2, -1)[2] @patnloop2.setter def patnloop2(self, n): @@ -1386,6 +1387,20 @@ class Detector: def setPatternLoops(self, level, start, stop, n, det_id=-1): self._api.setPatternLoops(level, start, stop, n, det_id) + @property + def patioctrl(self): + self._api.setPatternWord(-1,-1,-1) + + @patioctrl.setter + def patioctrl(self, word): + self._api.setPatternWord(-1, word, -1) + + @property + def patlimits(self): + return self._api.getPatternLoops(np.uint64(-1),-1)[0:2] + + + def free_shared_memory(multi_id=0): """ diff --git a/python/sls_detector/experimental.py b/python/sls_detector/experimental.py index 5d0f19a2a..cd815ad97 100755 --- a/python/sls_detector/experimental.py +++ b/python/sls_detector/experimental.py @@ -4,7 +4,15 @@ from _sls_detector import multiDetectorApi class ExperimentalDetector(multiDetectorApi): def __init__(self): super().__init__(0) + self.online = True + @property + def online(self): + return self._setOnline() == 1 + + @online.setter + def online(self, value): + self._setOnline(value) @property def rx_udpip(self): diff --git a/python/src/Detector.h b/python/src/Detector.h index 28fca8053..096eea882 100755 --- a/python/src/Detector.h +++ b/python/src/Detector.h @@ -244,18 +244,17 @@ class Detector { std::vector getRateCorrection(); - - - void setPatternLoops(uint64_t level, uint64_t start, uint64_t stop, - uint64_t n, int detPos) { + void setPatternLoops(int level, int start, int stop, + int n, int detPos) { det.setPatternLoops(level, start, stop, n, detPos); } + std::array getPatternLoops(uint64_t level, int detPos) { return det.getPatternLoops(level, detPos); } - void setPatternWord(int addr, uint64_t word, int detPos){ + void setPatternWord(int addr, uint64_t word, int detPos) { det.setPatternWord(addr, word, detPos); } diff --git a/python/src/main.cpp b/python/src/main.cpp index 0d8babd75..34ae6617c 100755 --- a/python/src/main.cpp +++ b/python/src/main.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -6,8 +7,7 @@ namespace py = pybind11; -PYBIND11_MODULE(_sls_detector, m) -{ +PYBIND11_MODULE(_sls_detector, m) { m.doc() = R"pbdoc( C/C++ API ----------------------- @@ -45,8 +45,7 @@ PYBIND11_MODULE(_sls_detector, m) >> 10 )pbdoc"); - DetectorApi - .def(py::init()) + DetectorApi.def(py::init()) .def("freeSharedMemory", &Detector::freeSharedMemory) .def("getMultiDetectorId", &Detector::getMultiDetectorId) .def("acq", &Detector::acquire) @@ -129,10 +128,16 @@ PYBIND11_MODULE(_sls_detector, m) .def("startReceiver", &Detector::startReceiver) .def("stopReceiver", &Detector::stopReceiver) - .def("getFilePath", (std::string(Detector::*)()) & Detector::getFilePath, "Using multiSlsDetector") - .def("getFilePath", (std::string(Detector::*)(int)) & Detector::getFilePath, "File path for individual detector") - .def("setFilePath", (void (Detector::*)(std::string)) & Detector::setFilePath) - .def("setFilePath", (void (Detector::*)(std::string, int)) & Detector::setFilePath) + .def("getFilePath", + (std::string(Detector::*)()) & Detector::getFilePath, + "Using multiSlsDetector") + .def("getFilePath", + (std::string(Detector::*)(int)) & Detector::getFilePath, + "File path for individual detector") + .def("setFilePath", + (void (Detector::*)(std::string)) & Detector::setFilePath) + .def("setFilePath", + (void (Detector::*)(std::string, int)) & Detector::setFilePath) .def("setFileName", &Detector::setFileName) .def("getFileName", &Detector::getFileName) @@ -157,7 +162,6 @@ PYBIND11_MODULE(_sls_detector, m) .def("getDelay", &Detector::getDelay) .def("setDelay", &Detector::setDelay) - .def("setStoragecellStart", &Detector::setStoragecellStart) .def("getStoragecellStart", &Detector::getStoragecellStart) .def("setNumberOfStorageCells", &Detector::setNumberOfStorageCells) @@ -178,7 +182,7 @@ PYBIND11_MODULE(_sls_detector, m) .def("getRxDataStreamStatus", &Detector::getRxDataStreamStatus) .def("setRxDataStreamStatus", &Detector::setRxDataStreamStatus) - //Network stuff + // Network stuff .def("getReceiverHostname", &Detector::getReceiverHostname) .def("setReceiverHostname", &Detector::setReceiverHostname) .def("getReceiverStreamingPort", &Detector::getReceiverStreamingPort) @@ -191,11 +195,12 @@ PYBIND11_MODULE(_sls_detector, m) .def("getReceiverUDPIP", &Detector::getReceiverUDPIP) .def("getReceiverUDPMAC", &Detector::getReceiverUDPMAC) .def("setReceiverUDPMAC", &Detector::setReceiverUDPMAC) - + .def("getReceiverPort", &Detector::getReceiverPort) .def("setReceiverPort", &Detector::setReceiverPort) - .def("configureNetworkParameters", &Detector::configureNetworkParameters) + .def("configureNetworkParameters", + &Detector::configureNetworkParameters) .def("getDelayFrame", &Detector::getDelayFrame) .def("setDelayFrame", &Detector::setDelayFrame) .def("getDelayLeft", &Detector::getDelayLeft) @@ -210,18 +215,21 @@ PYBIND11_MODULE(_sls_detector, m) .def("setReceiverFifoDepth", &Detector::setReceiverFifoDepth) .def("getReceiverFifoDepth", &Detector::getReceiverFifoDepth) - .def("getReceiverFrameDiscardPolicy", &Detector::getReceiverFrameDiscardPolicy) - .def("setReceiverFramesDiscardPolicy", &Detector::setReceiverFramesDiscardPolicy) + .def("getReceiverFrameDiscardPolicy", + &Detector::getReceiverFrameDiscardPolicy) + .def("setReceiverFramesDiscardPolicy", + &Detector::setReceiverFramesDiscardPolicy) .def("setPartialFramesPadding", &Detector::setPartialFramesPadding) .def("getPartialFramesPadding", &Detector::getPartialFramesPadding) .def("getUserDetails", &Detector::getUserDetails) - .def("isClientAndDetectorCompatible", &Detector::isClientAndDetectorCompatible) - .def("isClientAndReceiverCompatible", &Detector::isClientAndReceiverCompatible) + .def("isClientAndDetectorCompatible", + &Detector::isClientAndDetectorCompatible) + .def("isClientAndReceiverCompatible", + &Detector::isClientAndReceiverCompatible) .def("getMeasuredPeriod", &Detector::getMeasuredPeriod) .def("getMeasuredSubPeriod", &Detector::getMeasuredSubPeriod) - .def("setFileWrite", &Detector::setFileWrite) .def("getFileWrite", &Detector::getFileWrite) .def("setFileOverWrite", &Detector::setFileOverWrite) @@ -231,13 +239,15 @@ PYBIND11_MODULE(_sls_detector, m) .def("setNumberOfFrames", &Detector::setNumberOfFrames) .def("getNumberOfFrames", &Detector::getNumberOfFrames) - //Overloaded calls - .def("getFramesCaughtByReceiver", (int (Detector::*)() ) & Detector::getFramesCaughtByReceiver) - .def("getFramesCaughtByReceiver", (int (Detector::*)(int)) & Detector::getFramesCaughtByReceiver) - + // Overloaded calls + .def("getFramesCaughtByReceiver", + (int (Detector::*)()) & Detector::getFramesCaughtByReceiver) + .def("getFramesCaughtByReceiver", + (int (Detector::*)(int)) & Detector::getFramesCaughtByReceiver) .def("resetFramesCaught", &Detector::resetFramesCaught) - .def("getReceiverCurrentFrameIndex", &Detector::getReceiverCurrentFrameIndex) + .def("getReceiverCurrentFrameIndex", + &Detector::getReceiverCurrentFrameIndex) .def("getGapPixels", &Detector::getGapPixels) .def("setGapPixels", &Detector::setGapPixels) .def("getFlippedDataX", &Detector::getFlippedDataX) @@ -264,39 +274,43 @@ PYBIND11_MODULE(_sls_detector, m) .def("getPatternLoops", &Detector::getPatternLoops) .def("setPatternLoops", &Detector::setPatternLoops) - .def("setPatternWord", &Detector::setPatternWord) + .def("setPatternWord", &Detector::setPatternWord, py::arg("addr"), py::arg("word"), py::arg("det_id") = -1 ) .def("getImageSize", &Detector::getImageSize) .def("setImageSize", &Detector::setImageSize) .def("getNumberOfDetectors", &Detector::getNumberOfDetectors) .def("getDetectorGeometry", &Detector::getDetectorGeometry); + // Experimental API to use the multi directly and inherit from to reduce + // code duplication need to investigate how to handle documentation + py::class_ multiDetectorApi(m, "multiDetectorApi"); + multiDetectorApi.def(py::init()) + .def("acquire", &multiSlsDetector::acquire) + .def("_setOnline", &multiSlsDetector::setOnline, py::arg("flag") = -1, + py::arg("det_id") = -1) - - -//Experimental API to use the multi directly and inherit from to reduce -//code duplication need to investigate how to handle documentation -py::class_ multiDetectorApi(m, "multiDetectorApi"); - multiDetectorApi - .def(py::init()) - .def_property("busy", - py::cpp_function(&multiSlsDetector::getAcquiringFlag), - py::cpp_function(&multiSlsDetector::setAcquiringFlag)) - .def_property_readonly("rx_tcpport", - py::cpp_function(&multiSlsDetector::getReceiverPort)) - .def_property_readonly("detectornumber", - py::cpp_function(&multiSlsDetector::getDetectorNumber)) + .def_property_readonly( + "hostname", py::cpp_function(&multiSlsDetector::getHostname, + py::arg(), py::arg("det_id") = -1)) + .def_property("busy", + py::cpp_function(&multiSlsDetector::getAcquiringFlag), + py::cpp_function(&multiSlsDetector::setAcquiringFlag)) + .def_property_readonly( + "rx_tcpport", py::cpp_function(&multiSlsDetector::getReceiverPort)) + .def_property_readonly( + "detectornumber", + py::cpp_function(&multiSlsDetector::getDetectorNumber)) .def("_getReceiverUDPIP", &multiSlsDetector::getReceiverUDPIP) .def("_setReceiverUDPIP", &multiSlsDetector::setReceiverUDPIP) - .def("_getPatternLoops", &multiSlsDetector::getPatternLoops) - .def("_setPatternLoops", &multiSlsDetector::setPatternLoops) - .def("_setPatternWord", &multiSlsDetector::setPatternWord) - ; + .def("getPatternLoops", &multiSlsDetector::getPatternLoops, + py::arg("level"), py::arg("det_id") = -1) + .def("setPatternLoops", &multiSlsDetector::setPatternLoops) + .def("setPatternWord", &multiSlsDetector::setPatternWord, + py::arg("addr"), py::arg("word"), py::arg("det_id") = -1); py::module io = m.def_submodule("io", "Submodule for io"); io.def("read_my302_file", &read_my302_file, "some"); - #ifdef VERSION_INFO m.attr("__version__") = VERSION_INFO; #else From 86afb2bd0ea465600d06a5626b7be1e0539e343e Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 18 Apr 2019 15:03:01 +0200 Subject: [PATCH 2/4] more ctb commands --- python/sls_detector/detector.py | 115 +++++++++++++++++++++++- python/src/Detector.h | 20 +++++ python/src/main.cpp | 22 ++++- slsDetectorSoftware/src/slsDetector.cpp | 3 - 4 files changed, 152 insertions(+), 8 deletions(-) diff --git a/python/sls_detector/detector.py b/python/sls_detector/detector.py index 460dacdeb..2e0b2e5fe 100755 --- a/python/sls_detector/detector.py +++ b/python/sls_detector/detector.py @@ -1381,25 +1381,136 @@ class Detector: def patnloop2(self, n): self._api.setPatternLoops(2, -1, -1, n, -1) + @property + def patloop0(self): + return self._api.getPatternLoops(0)[0:2] + + @patloop0.setter + def patloop0(self, value): + start, stop = value + self._api.setPatternLoops(0, start, stop, -1) + + @property + def patloop1(self): + return self._api.getPatternLoops(1)[0:2] + + @patloop1.setter + def patloop1(self, value): + start, stop = value + self._api.setPatternLoops(1, start, stop, -1) + + @property + def patloop2(self): + return self._api.getPatternLoops(2)[0:2] + + @patloop2.setter + def patloop2(self, value): + start, stop = value + self._api.setPatternLoops(2, start, stop, -1) + def setPatternWord(self, addr, word, det_id = -1): self._api.setPatternWord(addr, word, det_id) def setPatternLoops(self, level, start, stop, n, det_id=-1): self._api.setPatternLoops(level, start, stop, n, det_id) + def getPatternLoops(self, level): + return self._api.getPatternLoops(level) + + def getPatternWaitAddr(self, level): + return self._api.getPatternWaitAddr(level) + + def setPatternWaitAddr(self, level, addr): + self._api.setPatternWaitAddr(level, addr) + + @property + def patwait0(self): + return self._api.getPatternWaitAddr(0) + + @patwait0.setter + def patwait0(self, addr): + self._api.setPatternWaitAddr(0, addr) + + @property + def patwait1(self): + return self._api.getPatternWaitAddr(1) + + @patwait1.setter + def patwait1(self, addr): + self._api.setPatternWaitAddr(1, addr) + + @property + def patwait2(self): + return self._api.getPatternWaitAddr(0) + + @patwait2.setter + def patwait2(self, addr): + self._api.setPatternWaitAddr(2, addr) + + + def setPatternWaitTime(self, level, duration): + self._api.setPatternWaitTime(level, duration) + + def getPatternWaitTime(self, level): + return self._api.getPatternWaitTime(level) + + @property + def patwaittime0(self): + return self._api.getPatternWaitTime(0) + + @patwaittime0.setter + def patwaittime0(self, duration): + self._api.setPatternWaitTime(0, duration) + + @property + def patwaittime1(self): + return self._api.getPatternWaitTime(1) + + @patwaittime1.setter + def patwaittime1(self, duration): + self._api.setPatternWaitTime(1, duration) + + @property + def patwaittime2(self): + return self._api.getPatternWaitTime(2) + + @patwaittime2.setter + def patwaittime2(self, duration): + self._api.setPatternWaitTime(2, duration) + @property def patioctrl(self): - self._api.setPatternWord(-1,-1,-1) + return self._api.getPatternWord(-1) @patioctrl.setter def patioctrl(self, word): - self._api.setPatternWord(-1, word, -1) + self._api.setPatternWord(-1, np.uint64(word)) @property def patlimits(self): return self._api.getPatternLoops(np.uint64(-1),-1)[0:2] + @patlimits.setter + def patlimits(self, value): + start, stop = value + self._api.setPatternLoops(-1, start, stop, -1) + @property + def patword(self): + print('Can\'t read') + + @patword.setter + def patword(self, value): + addr, word = value + self._api.setPatternWord(addr, word) + + @property + def patclkctrl(self): + return self._api.getPatternWord(-2) + + @patclkctrl.setter + def patclkctrl(self, value): + self._api.setPatternWord(-2, value) def free_shared_memory(multi_id=0): diff --git a/python/src/Detector.h b/python/src/Detector.h index 096eea882..a40ca2545 100755 --- a/python/src/Detector.h +++ b/python/src/Detector.h @@ -258,6 +258,26 @@ class Detector { det.setPatternWord(addr, word, detPos); } + uint64_t getPatternWord(int addr, int detPos){ + return det.setPatternWord(addr, -1, detPos); + } + + void setPatternWaitAddr(int level, int addr, int detPos){ + det.setPatternWaitAddr(level, addr, detPos); + } + + int getPatternWaitAddr(int level, int detPos){ + return det.setPatternWaitAddr(level, -1, detPos); + } + + void setPatternWaitTime(int level, uint64_t duration, int detPos){ + det.setPatternWaitTime(level, duration, detPos) + } + + uint64_t getPatternWaitTime(int level, int detPos){ + det.setPatternWaitTime(level, -1, detPos) + } + bool getFlippedDataX(int i) { return det.getFlippedData(slsDetectorDefs::dimension::X, i); } diff --git a/python/src/main.cpp b/python/src/main.cpp index 34ae6617c..c129330d8 100755 --- a/python/src/main.cpp +++ b/python/src/main.cpp @@ -272,9 +272,25 @@ PYBIND11_MODULE(_sls_detector, m) { .def("getTenGigabitEthernet", &Detector::getTenGigabitEthernet) .def("setTenGigabitEthernet", &Detector::setTenGigabitEthernet) - .def("getPatternLoops", &Detector::getPatternLoops) - .def("setPatternLoops", &Detector::setPatternLoops) - .def("setPatternWord", &Detector::setPatternWord, py::arg("addr"), py::arg("word"), py::arg("det_id") = -1 ) + .def("getPatternLoops", &Detector::getPatternLoops, py::arg("level"), + py::arg("det_id") = -1) + .def("setPatternLoops", &Detector::setPatternLoops, py::arg("level"), + py::arg("start"), py::arg("stop"), py::arg("n"), + py::arg("det_id") = -1) + .def("setPatternWord", &Detector::setPatternWord, py::arg("addr"), + py::arg("word"), py::arg("det_id") = -1) + .def("getPatternWord", &Detector::getPatternWord, py::arg("addr"), + py::arg("det_id") = -1) + + .def("setPatternWaitAddr", &Detector::setPatternWaitAddr, + py::arg("level"), py::arg("addr"), py::arg("det_id") = -1) + .def("getPatternWaitAddr", &Detector::getPatternWaitAddr, + py::arg("level"), py::arg("det_id") = -1) + + .def("setPatternWaitTime", &Detector::setPatternWaitTime, + py::arg("level"), py::arg("duration"), py::arg("det_id") = -1) + .def("getPatternWaitTime", &Detector::getPatternWaitTime, + py::arg("level"), py::arg("det_id") = -1) .def("getImageSize", &Detector::getImageSize) .def("setImageSize", &Detector::setImageSize) diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index 6d60ebe30..1e65a9f5d 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -4516,9 +4516,6 @@ int slsDetector::setPatternLoops(uint64_t level, uint64_t start, uint64_t stop, sizeof(retvals)); FILE_LOG(logDEBUG1) << "Set Pat Loops: " << retvals[0] << ", " << retvals[1] << ", " << retvals[2]; - assert(start == retvals[0]); - assert(stop == retvals[1]); - assert(n == retvals[2]); } if (ret == FORCE_UPDATE) { updateDetector(); From 7aaaeae30c6200ad2a77ab1bef3c938129f7934a Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 18 Apr 2019 15:06:17 +0200 Subject: [PATCH 3/4] minor --- python/src/Detector.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/src/Detector.h b/python/src/Detector.h index a40ca2545..ae62149d8 100755 --- a/python/src/Detector.h +++ b/python/src/Detector.h @@ -271,11 +271,11 @@ class Detector { } void setPatternWaitTime(int level, uint64_t duration, int detPos){ - det.setPatternWaitTime(level, duration, detPos) + det.setPatternWaitTime(level, duration, detPos); } uint64_t getPatternWaitTime(int level, int detPos){ - det.setPatternWaitTime(level, -1, detPos) + det.setPatternWaitTime(level, -1, detPos); } bool getFlippedDataX(int i) { From faf7e0db8259bc8df4cccfc3f2f95c1515de07c9 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 18 Apr 2019 15:09:36 +0200 Subject: [PATCH 4/4] fix --- python/src/Detector.h | 2 +- python/src/main.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/python/src/Detector.h b/python/src/Detector.h index ae62149d8..4833772ed 100755 --- a/python/src/Detector.h +++ b/python/src/Detector.h @@ -275,7 +275,7 @@ class Detector { } uint64_t getPatternWaitTime(int level, int detPos){ - det.setPatternWaitTime(level, -1, detPos); + return det.setPatternWaitTime(level, -1, detPos); } bool getFlippedDataX(int i) { diff --git a/python/src/main.cpp b/python/src/main.cpp index c129330d8..4b67a1aa0 100755 --- a/python/src/main.cpp +++ b/python/src/main.cpp @@ -289,6 +289,7 @@ PYBIND11_MODULE(_sls_detector, m) { .def("setPatternWaitTime", &Detector::setPatternWaitTime, py::arg("level"), py::arg("duration"), py::arg("det_id") = -1) + .def("getPatternWaitTime", &Detector::getPatternWaitTime, py::arg("level"), py::arg("det_id") = -1)