63#pragma GCC diagnostic push
64#pragma GCC diagnostic ignored "-Wcast-align"
66#pragma GCC diagnostic pop
71#include <lal/LALAtomicDatatypes.h>
94 PyObject *template_id = PyObject_GetAttrString(
event,
"template_id");
100 val = PyLong_AsLong(template_id);
101 Py_DECREF(template_id);
117 PyObject *
end = PyObject_GetAttrString(
event,
"end");
119 PyObject *ns = PyObject_CallMethod(
end,
"ns", NULL);
122 val = PyLong_AsLong(ns);
137 double offset_ns = PyFloat_AsDouble(offset);
138 double coinc_window_ns = PyFloat_AsDouble(coinc_window);
140 if((end_ns == -1 || offset_ns == -1. || coinc_window_ns == -1.) && PyErr_Occurred())
143 coinc_window_ns *= 1e9;
145 *start_ns = end_ns + lround(offset_ns - coinc_window_ns);
146 *stop_ns = end_ns + lround(offset_ns + coinc_window_ns);
201 if((
template_id == -1 || end_ns == -1) && PyErr_Occurred())
210 struct event_sequence *
new = realloc(*event_sequences, (*
n + 1) *
sizeof(**event_sequences));
212 PyErr_SetString(PyExc_MemoryError,
"realloc() failed");
215 *event_sequences =
new;
230 PyErr_SetString(PyExc_MemoryError,
"realloc() failed");
263 free(event_sequences);
272 Py_ssize_t mid = (lo + hi) / 2;
273 if(items[mid].end_ns < end_ns)
295 result = PyTuple_New(hi - lo);
298 for(
i = 0; lo < hi;
i++, lo++) {
301 PyTuple_SET_ITEM(result,
i, item);
343 self->ob_type->tp_free(self);
356 PyObject **item, **last;
359 PyErr_SetString(PyExc_ValueError,
"unexpected keyword arguments");
362 if(!PyArg_ParseTuple(
args,
"O", &events))
370 item = PySequence_Fast_ITEMS(events);
373 last = item + PySequence_Length(events);
374 for(; item < last; item++)
396 PyObject *coinc_window;
399 INT8 start_ns, stop_ns;
402 PyErr_SetString(PyExc_ValueError,
"unexpected keyword arguments");
405 if(!PyArg_ParseTuple(
args,
"OOO", &event_a, &offset_a, &coinc_window))
435 PyVarObject_HEAD_INIT(NULL, 0)
436 .tp_name = MODULE_NAME
".get_coincs",
441 .tp_flags = Py_TPFLAGS_DEFAULT,
443 .tp_new = PyType_GenericNew,
459 static struct PyModuleDef modef = {
460 PyModuleDef_HEAD_INIT,
461 .m_name = MODULE_NAME,
466 PyObject *module = PyModule_Create(&modef);
474 if(PyModule_AddObject(module,
"get_coincs", (PyObject *) &
get_coincs_Type) < 0) {
static Py_ssize_t bisect_left(struct event *items, Py_ssize_t hi, INT8 end_ns)
static PyObject * event_sequence_extract(struct event_sequence *event_sequence, INT8 start_ns, INT8 stop_ns)
static int event_sequence_insert(struct event_sequence **event_sequences, int *n, PyObject *event)
static INT8 get_end_ns(PyObject *event)
static int event_sequence_get_cmp(const void *key, const void *obj)
static void event_sequence_free(struct event_sequence *event_sequences, int n)
PyMODINIT_FUNC PyInit__thinca(void)
static PyObject * get_coincs__call__(PyObject *self, PyObject *args, PyObject *kwds)
static long get_template_id(PyObject *event)
static struct event_sequence * event_sequence_get(struct event_sequence *event_sequences, int n, long template_id)
static int event_sequence_sort_cmp(const void *a, const void *b)
static void get_coincs__del__(PyObject *self)
static int get_coincs__init__(PyObject *self, PyObject *args, PyObject *kwds)
static PyTypeObject get_coincs_Type
static int compute_start_stop(INT8 *start_ns, INT8 *stop_ns, PyObject *event, PyObject *offset, PyObject *coinc_window)
PyObject_HEAD struct event_sequence * event_sequences