diff --git a/python/slsdet/pattern.py b/python/slsdet/pattern.py index 2852e444c..fc223ff8e 100644 --- a/python/slsdet/pattern.py +++ b/python/slsdet/pattern.py @@ -2,6 +2,7 @@ import _slsdet from _slsdet import Pattern + class patternParameters(_slsdet.patternParameters): def __init__(self): super().__init__() @@ -15,13 +16,38 @@ class patternParameters(_slsdet.patternParameters): raise KeyError(f"Key: {name} not found") def __setattr__(self, name, value): - if name in ['view', 'names']: + if name in ["view", "names"]: self.__dict__[name] = value elif name in self.names: self.view[name] = value - else: + else: 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): return self.names \ No newline at end of file diff --git a/python/src/pattern.cpp b/python/src/pattern.cpp index 51f2f4761..35e1bca01 100644 --- a/python/src/pattern.cpp +++ b/python/src/pattern.cpp @@ -20,23 +20,28 @@ void init_pattern(py::module &m) { pat &o = obj.cast(); return py::array_t(1, &o, obj); }); + //.def_readwrite("name", &Pet::name) + // patternParameters.def_property( + // "some", + // [](py::object &obj) { + // pat &o = obj.cast(); + // return py::array_t(1, &o, obj); + // }, + // [](py::object &obj) { + // pat &o = obj.cast(); + // return py::array_t(1, &o, obj); + // }); - // m.def("get_memoryview1d", []() { - // return py::memoryview::from_memory( - // buffer, // buffer pointer - // sizeof(uint8_t) * 8 // buffer size - // ); - // }) - // patternParameters.def("load", &pat::load); + // patternParameters.def_property_readonly( + // "loop", + // [](py::object &obj) { + // pat &o = obj.cast(); + // return py::array_t(6, &o.loop[0], obj); + // }); py::class_ Pattern(m, "Pattern"); Pattern.def(py::init()); Pattern.def("load", &sls::Pattern::load); - 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 - // ); - // }); + Pattern.def("data", (pat * (sls::Pattern::*)()) & sls::Pattern::data, + py::return_value_policy::reference); } diff --git a/slsDetectorSoftware/include/sls/Pattern.h b/slsDetectorSoftware/include/sls/Pattern.h index d43f4180d..bea7e82bd 100644 --- a/slsDetectorSoftware/include/sls/Pattern.h +++ b/slsDetectorSoftware/include/sls/Pattern.h @@ -7,7 +7,8 @@ namespace sls { #endif // 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 ioctrl; uint32_t limits[2]; @@ -30,7 +31,7 @@ class Pattern { bool operator!=(const Pattern &other) const; patternParameters *data(); patternParameters *data() const; - const size_t size() const noexcept { return sizeof(patternParameters); } + size_t size() const noexcept { return sizeof(patternParameters); } void validate() const; void load(const std::string &fname); void save(const std::string &fname);