Python binding for Pattern

This commit is contained in:
Erik Frojdh 2020-11-27 17:05:39 +01:00
parent 95fe1720c0
commit d69e238e67
3 changed files with 51 additions and 19 deletions

View File

@ -2,6 +2,7 @@ import _slsdet
from _slsdet import Pattern from _slsdet import Pattern
class patternParameters(_slsdet.patternParameters): class patternParameters(_slsdet.patternParameters):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@ -15,13 +16,38 @@ class patternParameters(_slsdet.patternParameters):
raise KeyError(f"Key: {name} not found") raise KeyError(f"Key: {name} not found")
def __setattr__(self, name, value): def __setattr__(self, name, value):
if name in ['view', 'names']: if name in ["view", "names"]:
self.__dict__[name] = value self.__dict__[name] = value
elif name in self.names: elif name in self.names:
self.view[name] = value self.view[name] = value
else: else:
raise KeyError(f"Key: {name} not found") raise KeyError(f"Key: {name} not found")
#Provide custom dir for tab completion # Provide custom dir for tab completion
def __dir__(self):
return self.names
class Pattern(_slsdet.Pattern):
def __init__(self):
super().__init__()
self.view = self.data().numpy_view()
self.names = self.view.dtype.names
def __getattr__(self, name):
if name in self.names:
return self.view[name][0]
else:
raise KeyError(f"Key: {name} not found")
def __setattr__(self, name, value):
if name in ["view", "names"]:
self.__dict__[name] = value
elif name in self.names:
self.view[name] = value
else:
raise KeyError(f"Key: {name} not found")
# Provide custom dir for tab completion
def __dir__(self): def __dir__(self):
return self.names return self.names

View File

@ -20,23 +20,28 @@ void init_pattern(py::module &m) {
pat &o = obj.cast<pat &>(); pat &o = obj.cast<pat &>();
return py::array_t<pat>(1, &o, obj); return py::array_t<pat>(1, &o, obj);
}); });
//.def_readwrite("name", &Pet::name)
// patternParameters.def_property(
// "some",
// [](py::object &obj) {
// pat &o = obj.cast<pat &>();
// return py::array_t<pat>(1, &o, obj);
// },
// [](py::object &obj) {
// pat &o = obj.cast<pat &>();
// return py::array_t<pat>(1, &o, obj);
// });
// m.def("get_memoryview1d", []() { // patternParameters.def_property_readonly(
// return py::memoryview::from_memory( // "loop",
// buffer, // buffer pointer // [](py::object &obj) {
// sizeof(uint8_t) * 8 // buffer size // pat &o = obj.cast<pat &>();
// ); // return py::array_t<uint32_t>(6, &o.loop[0], obj);
// }) // });
// patternParameters.def("load", &pat::load);
py::class_<sls::Pattern> Pattern(m, "Pattern"); py::class_<sls::Pattern> Pattern(m, "Pattern");
Pattern.def(py::init()); Pattern.def(py::init());
Pattern.def("load", &sls::Pattern::load); Pattern.def("load", &sls::Pattern::load);
Pattern.def("data", (pat * (sls::Pattern::*)()) & sls::Pattern::data, py::return_value_policy::reference); Pattern.def("data", (pat * (sls::Pattern::*)()) & sls::Pattern::data,
py::return_value_policy::reference);
// m.def("get_memoryview1d", []() {
// return py::memoryview::from_memory(data(), // buffer pointer
// sizeof(pat) // buffer size
// );
// });
} }

View File

@ -7,7 +7,8 @@ namespace sls {
#endif #endif
// Common C/C++ structure to handle pattern data // Common C/C++ structure to handle pattern data
typedef struct __attribute__((packed)) { // typedef struct __attribute__((packed)) {
typedef struct {
uint64_t word[MAX_PATTERN_LENGTH]; uint64_t word[MAX_PATTERN_LENGTH];
uint64_t ioctrl; uint64_t ioctrl;
uint32_t limits[2]; uint32_t limits[2];
@ -30,7 +31,7 @@ class Pattern {
bool operator!=(const Pattern &other) const; bool operator!=(const Pattern &other) const;
patternParameters *data(); patternParameters *data();
patternParameters *data() const; patternParameters *data() const;
const size_t size() const noexcept { return sizeof(patternParameters); } size_t size() const noexcept { return sizeof(patternParameters); }
void validate() const; void validate() const;
void load(const std::string &fname); void load(const std::string &fname);
void save(const std::string &fname); void save(const std::string &fname);