Generated by Cython 3.0.11

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: extension.pyx

 001: from fcio_def cimport fcio_config
 002: 
 003: cimport numpy
 004: 
+005: cdef class FCIOExt:
struct __pyx_obj_4fcio_FCIOExt {
  PyObject_HEAD
  struct __pyx_vtabstruct_4fcio_FCIOExt *__pyx_vtab;
  fcio_config *_config_ptr;
  int *_timestamp;
  int *_timeoffset;
  int *_deadregion;
  PyArrayObject *_tracemap;
  PyArrayObject *_card_addresses;
  PyArrayObject *_card_channels;
  int _num_channels_per_card;
  int _maxtraces;
  __pyx_t_5numpy_int64_t _utc_unix_ns;
  __pyx_t_5numpy_float64_t _utc_unix;
  __pyx_t_5numpy_int64_t _fpga_time_ns;
  __pyx_t_5numpy_int32_t _allowed_gps_error_ns;
  PyArrayObject *_start_time_ns;
  PyArrayObject *_cur_dead_time_ns;
  PyArrayObject *_total_dead_time_ns;
  struct __pyx_obj_4fcio_DeadIntervalBuffer *_dead_interval_buffer;
  int _tag;
};
/* … */
struct __pyx_vtabstruct_4fcio_FCIOExt {
  PyObject *(*update)(struct __pyx_obj_4fcio_FCIOExt *);
};
static struct __pyx_vtabstruct_4fcio_FCIOExt *__pyx_vtabptr_4fcio_FCIOExt;

 006: 
 007:   cdef fcio_config *_config_ptr
 008:   cdef int* _timestamp
 009:   cdef int* _timeoffset
 010:   cdef int* _deadregion
 011: 
 012:   # derived from config
 013:   cdef numpy.ndarray _tracemap
 014:   cdef numpy.ndarray _card_addresses
 015:   cdef numpy.ndarray _card_channels
 016:   cdef int _num_channels_per_card
 017:   cdef int _maxtraces
 018: 
 019:   # derived from event / recevent base information
 020:   cdef numpy.int64_t _utc_unix_ns
 021:   cdef numpy.float64_t _utc_unix
 022: 
 023:   cdef numpy.int64_t _fpga_time_ns
 024: 
 025:   cdef numpy.int32_t _allowed_gps_error_ns
 026: 
 027:   cdef numpy.ndarray _start_time_ns
 028:   cdef numpy.ndarray _cur_dead_time_ns
 029:   cdef numpy.ndarray _total_dead_time_ns
 030: 
 031:   cdef DeadIntervalBuffer _dead_interval_buffer
 032: 
 033:   cdef int _tag
 034: 
+035:   def __cinit__(self, fcio : FCIO):
/* Python wrapper */
static int __pyx_pw_4fcio_7FCIOExt_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_4fcio_7FCIOExt_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  struct __pyx_obj_4fcio_FCIO *__pyx_v_fcio = 0;
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
  #endif
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fcio,0};
  PyObject* values[1] = {0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_fcio)) != 0)) {
          (void)__Pyx_Arg_NewRef_VARARGS(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 35, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(2, 35, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs != 1)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0);
    }
    __pyx_v_fcio = ((struct __pyx_obj_4fcio_FCIO *)values[0]);
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, __pyx_nargs); __PYX_ERR(2, 35, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("fcio.FCIOExt.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fcio), __pyx_ptype_4fcio_FCIO, 0, "fcio", 0))) __PYX_ERR(2, 35, __pyx_L1_error)
  __pyx_r = __pyx_pf_4fcio_7FCIOExt___cinit__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self), __pyx_v_fcio);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = -1;
  __pyx_L0:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_4fcio_7FCIOExt___cinit__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self, struct __pyx_obj_4fcio_FCIO *__pyx_v_fcio) {
  __Pyx_memviewslice __pyx_v_tracemap_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF((PyObject *)__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("fcio.FCIOExt.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __PYX_XCLEAR_MEMVIEW(&__pyx_v_tracemap_view, 1);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 036: 
+037:     if isinstance(self, Event):
  __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_self), __pyx_ptype_4fcio_Event); 
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+038:       self._timestamp = fcio._fcio_data.event.timestamp
    __pyx_t_2 = __pyx_v_fcio->_fcio_data->event.timestamp;
    __pyx_v_self->_timestamp = __pyx_t_2;
+039:       self._timeoffset = fcio._fcio_data.event.timeoffset
    __pyx_t_2 = __pyx_v_fcio->_fcio_data->event.timeoffset;
    __pyx_v_self->_timeoffset = __pyx_t_2;
+040:       self._deadregion = fcio._fcio_data.event.deadregion
    __pyx_t_2 = __pyx_v_fcio->_fcio_data->event.deadregion;
    __pyx_v_self->_deadregion = __pyx_t_2;
+041:     elif isinstance(self, RecEvent):
  __pyx_t_1 = __Pyx_TypeCheck(((PyObject *)__pyx_v_self), __pyx_ptype_4fcio_RecEvent); 
  if (likely(__pyx_t_1)) {
/* … */
    goto __pyx_L3;
  }
+042:       self._timestamp = fcio._fcio_data.recevent.timestamp
    __pyx_t_2 = __pyx_v_fcio->_fcio_data->recevent.timestamp;
    __pyx_v_self->_timestamp = __pyx_t_2;
+043:       self._timeoffset = fcio._fcio_data.recevent.timeoffset
    __pyx_t_2 = __pyx_v_fcio->_fcio_data->recevent.timeoffset;
    __pyx_v_self->_timeoffset = __pyx_t_2;
+044:       self._deadregion = fcio._fcio_data.recevent.deadregion
    __pyx_t_2 = __pyx_v_fcio->_fcio_data->recevent.deadregion;
    __pyx_v_self->_deadregion = __pyx_t_2;
 045:     else:
+046:       raise NotImplemented("FCIOExt does not implement an interface {type(self)}")
  /*else*/ {
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_NotImplemented, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 46, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(2, 46, __pyx_L1_error)
  }
  __pyx_L3:;
/* … */
  __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_FCIOExt_does_not_implement_an_in); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(2, 46, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__20);
  __Pyx_GIVEREF(__pyx_tuple__20);
 047: 
+048:     self._config_ptr = &fcio._fcio_data.config
  __pyx_v_self->_config_ptr = (&__pyx_v_fcio->_fcio_data->config);
 049: 
+050:     self._dead_interval_buffer = DeadIntervalBuffer()
  __pyx_t_3 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_4fcio_DeadIntervalBuffer)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 50, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF((PyObject *)__pyx_v_self->_dead_interval_buffer);
  __Pyx_DECREF((PyObject *)__pyx_v_self->_dead_interval_buffer);
  __pyx_v_self->_dead_interval_buffer = ((struct __pyx_obj_4fcio_DeadIntervalBuffer *)__pyx_t_3);
  __pyx_t_3 = 0;
 051: 
 052:     # helper variables
+053:     self._maxtraces = self._config_ptr.adcs + self._config_ptr.triggers
  __pyx_v_self->_maxtraces = (__pyx_v_self->_config_ptr->adcs + __pyx_v_self->_config_ptr->triggers);
 054: 
+055:     cdef unsigned int[::1] tracemap_view = self._config_ptr.tracemap
  __pyx_t_4 = __pyx_v_self->_config_ptr->tracemap;
  if (!__pyx_t_4) {
    PyErr_SetString(PyExc_ValueError,"Cannot create cython.array from NULL pointer");
    __PYX_ERR(2, 55, __pyx_L1_error)
  }
  __pyx_t_6 = __pyx_format_from_typeinfo(&__Pyx_TypeInfo_unsigned_int); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 55, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = Py_BuildValue((char*) "("  __PYX_BUILD_PY_SSIZE_T  ")", ((Py_ssize_t)FCIOMaxChannels)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 55, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __pyx_array_new(__pyx_t_3, sizeof(unsigned int), PyBytes_AS_STRING(__pyx_t_6), (char *) "fortran", (char *) __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 55, __pyx_L1_error)
  __Pyx_GOTREF((PyObject *)__pyx_t_5);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dc_unsigned_int(((PyObject *)__pyx_t_5), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(2, 55, __pyx_L1_error)
  __Pyx_DECREF((PyObject *)__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_tracemap_view = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
+056:     self._tracemap = numpy.ndarray(shape=(self._maxtraces,), dtype=numpy.uint32, offset=0, buffer=tracemap_view)
  __pyx_t_6 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->_maxtraces); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_GIVEREF(__pyx_t_3);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3)) __PYX_ERR(2, 56, __pyx_L1_error);
  __pyx_t_3 = 0;
  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_shape, __pyx_t_8) < 0) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_numpy); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_uint32); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_offset, __pyx_int_0) < 0) __PYX_ERR(2, 56, __pyx_L1_error)
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_tracemap_view, 1, (PyObject *(*)(char *)) __pyx_memview_get_unsigned_int, (int (*)(char *, PyObject *)) __pyx_memview_set_unsigned_int, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_buffer, __pyx_t_3) < 0) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_5numpy_ndarray), __pyx_empty_tuple, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF((PyObject *)__pyx_v_self->_tracemap);
  __Pyx_DECREF((PyObject *)__pyx_v_self->_tracemap);
  __pyx_v_self->_tracemap = ((PyArrayObject *)__pyx_t_3);
  __pyx_t_3 = 0;
 057: 
+058:     self._card_addresses = self._tracemap >> 16 # upper 16bit
  __pyx_t_3 = PyNumber_Rshift(((PyObject *)__pyx_v_self->_tracemap), __pyx_int_16); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 58, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(2, 58, __pyx_L1_error)
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF((PyObject *)__pyx_v_self->_card_addresses);
  __Pyx_DECREF((PyObject *)__pyx_v_self->_card_addresses);
  __pyx_v_self->_card_addresses = ((PyArrayObject *)__pyx_t_3);
  __pyx_t_3 = 0;
+059:     self._card_channels = self._tracemap % (1 << 16) # lower 16bit
  __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_v_self->_tracemap), __pyx_int_65536); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(2, 59, __pyx_L1_error)
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF((PyObject *)__pyx_v_self->_card_channels);
  __Pyx_DECREF((PyObject *)__pyx_v_self->_card_channels);
  __pyx_v_self->_card_channels = ((PyArrayObject *)__pyx_t_3);
  __pyx_t_3 = 0;
 060: 
+061:     self._start_time_ns = numpy.zeros(shape=(self._config_ptr.adcs,),dtype=numpy.int64)
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_numpy); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_self->_config_ptr->adcs); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_8);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_8)) __PYX_ERR(2, 61, __pyx_L1_error);
  __pyx_t_8 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_shape, __pyx_t_9) < 0) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_numpy); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_int64); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_8) < 0) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_empty_tuple, __pyx_t_3); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_8) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_8, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(2, 61, __pyx_L1_error)
  __Pyx_GIVEREF(__pyx_t_8);
  __Pyx_GOTREF((PyObject *)__pyx_v_self->_start_time_ns);
  __Pyx_DECREF((PyObject *)__pyx_v_self->_start_time_ns);
  __pyx_v_self->_start_time_ns = ((PyArrayObject *)__pyx_t_8);
  __pyx_t_8 = 0;
+062:     self._start_time_ns[:] = -1
  if (__Pyx_PyObject_SetSlice(((PyObject *)__pyx_v_self->_start_time_ns), __pyx_int_neg_1, 0, 0, NULL, NULL, &__pyx_slice__5, 0, 0, 1) < 0) __PYX_ERR(2, 62, __pyx_L1_error)
 063: 
+064:     self._cur_dead_time_ns = numpy.zeros(shape=(self._config_ptr.adcs,),dtype=numpy.int64)
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_numpy); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_t_8 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->_config_ptr->adcs); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_6);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_6)) __PYX_ERR(2, 64, __pyx_L1_error);
  __pyx_t_6 = 0;
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_shape, __pyx_t_9) < 0) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_numpy); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_int64); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_8); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(2, 64, __pyx_L1_error)
  __Pyx_GIVEREF(__pyx_t_6);
  __Pyx_GOTREF((PyObject *)__pyx_v_self->_cur_dead_time_ns);
  __Pyx_DECREF((PyObject *)__pyx_v_self->_cur_dead_time_ns);
  __pyx_v_self->_cur_dead_time_ns = ((PyArrayObject *)__pyx_t_6);
  __pyx_t_6 = 0;
+065:     self._total_dead_time_ns = numpy.zeros(shape=(self._config_ptr.adcs,),dtype=numpy.int64)
  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_numpy); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_zeros); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyDict_NewPresized(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->_config_ptr->adcs); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_3);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3)) __PYX_ERR(2, 65, __pyx_L1_error);
  __pyx_t_3 = 0;
  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_shape, __pyx_t_9) < 0) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_numpy); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_int64); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_empty_tuple, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(2, 65, __pyx_L1_error)
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF((PyObject *)__pyx_v_self->_total_dead_time_ns);
  __Pyx_DECREF((PyObject *)__pyx_v_self->_total_dead_time_ns);
  __pyx_v_self->_total_dead_time_ns = ((PyArrayObject *)__pyx_t_3);
  __pyx_t_3 = 0;
 066: 
+067:     if self._config_ptr.adcbits == 12:
  switch (__pyx_v_self->_config_ptr->adcbits) {
    case 12:
/* … */
    break;
    case 16:
+068:       self._num_channels_per_card = 24
    __pyx_v_self->_num_channels_per_card = 24;
+069:     elif self._config_ptr.adcbits == 16:
    break;
    default: break;
  }
+070:       self._num_channels_per_card = 6
    __pyx_v_self->_num_channels_per_card = 6;
 071: 
+072:     self._allowed_gps_error_ns = self._config_ptr.gps
  __pyx_t_10 = __pyx_v_self->_config_ptr->gps;
  __pyx_v_self->_allowed_gps_error_ns = __pyx_t_10;
 073: 
+074:   cdef update(self):
static PyObject *__pyx_f_4fcio_7FCIOExt_update(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PY_LONG_LONG __pyx_v_NS_PER_S;
  PY_LONG_LONG __pyx_v_EXPECTED_MAX_TICKS;
  PY_LONG_LONG __pyx_v_NS_PER_TICK;
  PY_LONG_LONG __pyx_v__daq_synchronized_timestamp_ns;
  CYTHON_UNUSED int __pyx_v__current_clock_offset;
  int __pyx_v_dr_start;
  int __pyx_v_dr_end;
  PY_LONG_LONG __pyx_v__dead_interval_start_ns;
  PY_LONG_LONG __pyx_v__dead_interval_stop_ns;
  CYTHON_UNUSED PY_LONG_LONG __pyx_v__dead_interval_ns;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF((PyObject *)__pyx_t_10);
  __Pyx_AddTraceback("fcio.FCIOExt.update", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 075: 
 076:     # No const in cython :/
+077:     cdef long long NS_PER_S = 1000000000
  __pyx_v_NS_PER_S = 0x3B9ACA00;
+078:     cdef long long EXPECTED_MAX_TICKS = 249999999
  __pyx_v_EXPECTED_MAX_TICKS = 0xEE6B27F;
+079:     cdef long long NS_PER_TICK = 4
  __pyx_v_NS_PER_TICK = 4;
 080: 
 081:     # update current pps/clk counters
+082:     cdef long long _daq_synchronized_timestamp_ns = (NS_PER_S * self._timestamp[1] + 4 * self._timestamp[2])
  __pyx_v__daq_synchronized_timestamp_ns = ((__pyx_v_NS_PER_S * (__pyx_v_self->_timestamp[1])) + (4 * (__pyx_v_self->_timestamp[2])));
+083:     self._fpga_time_ns = _daq_synchronized_timestamp_ns
  __pyx_v_self->_fpga_time_ns = __pyx_v__daq_synchronized_timestamp_ns;
 084: 
 085:     # update absolute time information
+086:     if self._config_ptr.gps != 0:
  __pyx_t_1 = (__pyx_v_self->_config_ptr->gps != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
 087:       # we have an external clock (likely from a timeserver or gps clock)
+088:       self._utc_unix_ns = _daq_synchronized_timestamp_ns + self._timeoffset[2] * NS_PER_S
    __pyx_v_self->_utc_unix_ns = (__pyx_v__daq_synchronized_timestamp_ns + ((__pyx_v_self->_timeoffset[2]) * __pyx_v_NS_PER_S));
 089:     else:
 090:       # synchronization via server clock (likely from NTP server)
+091:       self._utc_unix_ns = _daq_synchronized_timestamp_ns + NS_PER_S * self._timeoffset[0] + 1000 * self._timeoffset[1]
  /*else*/ {
    __pyx_v_self->_utc_unix_ns = ((__pyx_v__daq_synchronized_timestamp_ns + (__pyx_v_NS_PER_S * (__pyx_v_self->_timeoffset[0]))) + (0x3E8 * (__pyx_v_self->_timeoffset[1])));
  }
  __pyx_L3:;
 092: 
+093:     self._utc_unix = self._utc_unix_ns / NS_PER_S
  if (unlikely(__pyx_v_NS_PER_S == 0)) {
    PyErr_SetString(PyExc_ZeroDivisionError, "float division");
    __PYX_ERR(2, 93, __pyx_L1_error)
  }
  __pyx_v_self->_utc_unix = (((double)__pyx_v_self->_utc_unix_ns) / ((double)__pyx_v_NS_PER_S));
 094: 
+095:     cdef int _current_clock_offset = abs(self._timestamp[3] - EXPECTED_MAX_TICKS) * NS_PER_TICK
  __pyx_t_2 = __Pyx_abs_longlong(((__pyx_v_self->_timestamp[3]) - __pyx_v_EXPECTED_MAX_TICKS)); 
  __pyx_v__current_clock_offset = (__pyx_t_2 * __pyx_v_NS_PER_TICK);
 096:     # if _current_clock_offset > self._allowed_gps_error_ns:
 097:     #   print(f"WARNING fcio: max_ticks of last pps cycle {self.timestamp[3]} with { _current_clock_offset } > {self._allowed_gps_error_ns}",file=sys.stderr)
 098: 
 099:     # default deadtimes are the same for all channels
 100:     # only dr_start is used to track progress
+101:     cdef int dr_start = 0
  __pyx_v_dr_start = 0;
+102:     cdef int dr_end = self._config_ptr.adcs
  __pyx_t_3 = __pyx_v_self->_config_ptr->adcs;
  __pyx_v_dr_end = __pyx_t_3;
 103: 
 104:     # for daqmode 12 (event.type 11), each card has it's own eventnumbers, clock counters and deadregions
 105:     # need to track them separately, but will do it on a channel list basis
 106: 
+107:     if self.type == 11:
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_type); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 107, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = (__Pyx_PyInt_BoolEqObjC(__pyx_t_4, __pyx_int_11, 11, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(2, 107, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__pyx_t_1) {
/* … */
  }
+108:       dr_start = self._deadregion[5]
    __pyx_v_dr_start = (__pyx_v_self->_deadregion[5]);
+109:       dr_end = self._deadregion[5] + self._deadregion[6]
    __pyx_v_dr_end = ((__pyx_v_self->_deadregion[5]) + (__pyx_v_self->_deadregion[6]));
 110: 
+111:     cdef long long _dead_interval_start_ns = self._deadregion[0] * NS_PER_S + self._deadregion[1] * NS_PER_TICK
  __pyx_v__dead_interval_start_ns = (((__pyx_v_self->_deadregion[0]) * __pyx_v_NS_PER_S) + ((__pyx_v_self->_deadregion[1]) * __pyx_v_NS_PER_TICK));
+112:     cdef long long _dead_interval_stop_ns = self._deadregion[2] * NS_PER_S + self._deadregion[3] * NS_PER_TICK
  __pyx_v__dead_interval_stop_ns = (((__pyx_v_self->_deadregion[2]) * __pyx_v_NS_PER_S) + ((__pyx_v_self->_deadregion[3]) * __pyx_v_NS_PER_TICK));
+113:     cdef long long _dead_interval_ns = _dead_interval_stop_ns - _dead_interval_start_ns
  __pyx_v__dead_interval_ns = (__pyx_v__dead_interval_stop_ns - __pyx_v__dead_interval_start_ns);
 114: 
+115:     if numpy.any(self._start_time_ns[dr_start : dr_end] == -1):
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_numpy); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 115, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_any); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 115, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyObject_GetSlice(((PyObject *)__pyx_v_self->_start_time_ns), __pyx_v_dr_start, __pyx_v_dr_end, NULL, NULL, NULL, 1, 1, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 115, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_7 = __Pyx_PyInt_EqObjC(__pyx_t_5, __pyx_int_neg_1, -1L, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 115, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = NULL;
  __pyx_t_8 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_6))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_6);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_6, function);
      __pyx_t_8 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_7};
    __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_6, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8);
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 115, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  }
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(2, 115, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__pyx_t_1) {
/* … */
  }
 116:       # start times not set yet
+117:       if _dead_interval_start_ns == 0 and _dead_interval_stop_ns > 0:
    __pyx_t_9 = (__pyx_v__dead_interval_start_ns == 0);
    if (__pyx_t_9) {
    } else {
      __pyx_t_1 = __pyx_t_9;
      goto __pyx_L7_bool_binop_done;
    }
    __pyx_t_9 = (__pyx_v__dead_interval_stop_ns > 0);
    __pyx_t_1 = __pyx_t_9;
    __pyx_L7_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
      goto __pyx_L6;
    }
 118:         # if only start is zero, it's daqmode 12 per card and we can estimate the trigger enable timestamp from that
+119:         self._start_time_ns[dr_start : dr_end] = _dead_interval_stop_ns
      __pyx_t_4 = __Pyx_PyInt_From_PY_LONG_LONG(__pyx_v__dead_interval_stop_ns); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 119, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      if (__Pyx_PyObject_SetSlice(((PyObject *)__pyx_v_self->_start_time_ns), __pyx_t_4, __pyx_v_dr_start, __pyx_v_dr_end, NULL, NULL, NULL, 1, 1, 1) < 0) __PYX_ERR(2, 119, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+120:       elif _dead_interval_start_ns == 0 and _dead_interval_stop_ns == 0:
    __pyx_t_9 = (__pyx_v__dead_interval_start_ns == 0);
    if (__pyx_t_9) {
    } else {
      __pyx_t_1 = __pyx_t_9;
      goto __pyx_L9_bool_binop_done;
    }
    __pyx_t_9 = (__pyx_v__dead_interval_stop_ns == 0);
    __pyx_t_1 = __pyx_t_9;
    __pyx_L9_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
    }
    __pyx_L6:;
+121:         self._start_time_ns[dr_start : dr_end] = _daq_synchronized_timestamp_ns
      __pyx_t_4 = __Pyx_PyInt_From_PY_LONG_LONG(__pyx_v__daq_synchronized_timestamp_ns); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 121, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      if (__Pyx_PyObject_SetSlice(((PyObject *)__pyx_v_self->_start_time_ns), __pyx_t_4, __pyx_v_dr_start, __pyx_v_dr_end, NULL, NULL, NULL, 1, 1, 1) < 0) __PYX_ERR(2, 121, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 122: 
+123:     if _dead_interval_start_ns > 0:
  __pyx_t_1 = (__pyx_v__dead_interval_start_ns > 0);
  if (__pyx_t_1) {
/* … */
  }
 124:       # if first event contains start and stop stamps, it's a true dead interval between events, add it
+125:       self._dead_interval_buffer.add(_dead_interval_start_ns, _dead_interval_stop_ns, dr_start, dr_end)
    __pyx_t_4 = ((struct __pyx_vtabstruct_4fcio_DeadIntervalBuffer *)__pyx_v_self->_dead_interval_buffer->__pyx_vtab)->add(__pyx_v_self->_dead_interval_buffer, __pyx_v__dead_interval_start_ns, __pyx_v__dead_interval_stop_ns, __pyx_v_dr_start, __pyx_v_dr_end); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 125, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 126: 
+127:     self._cur_dead_time_ns[dr_start : dr_end] = 0
  if (__Pyx_PyObject_SetSlice(((PyObject *)__pyx_v_self->_cur_dead_time_ns), __pyx_int_0, __pyx_v_dr_start, __pyx_v_dr_end, NULL, NULL, NULL, 1, 1, 1) < 0) __PYX_ERR(2, 127, __pyx_L1_error)
+128:     while self._dead_interval_buffer.is_before(_daq_synchronized_timestamp_ns, dr_start, dr_end):
  while (1) {
    __pyx_t_4 = ((struct __pyx_vtabstruct_4fcio_DeadIntervalBuffer *)__pyx_v_self->_dead_interval_buffer->__pyx_vtab)->is_before(__pyx_v_self->_dead_interval_buffer, __pyx_v__daq_synchronized_timestamp_ns, __pyx_v_dr_start, __pyx_v_dr_end); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 128, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(2, 128, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (!__pyx_t_1) break;
+129:       self._cur_dead_time_ns[dr_start : dr_end] = self._dead_interval_buffer.read(dr_start, dr_end)
    __pyx_t_4 = ((struct __pyx_vtabstruct_4fcio_DeadIntervalBuffer *)__pyx_v_self->_dead_interval_buffer->__pyx_vtab)->read(__pyx_v_self->_dead_interval_buffer, __pyx_v_dr_start, __pyx_v_dr_end); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 129, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    if (__Pyx_PyObject_SetSlice(((PyObject *)__pyx_v_self->_cur_dead_time_ns), __pyx_t_4, __pyx_v_dr_start, __pyx_v_dr_end, NULL, NULL, NULL, 1, 1, 1) < 0) __PYX_ERR(2, 129, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+130:       self._total_dead_time_ns[dr_start : dr_end] += self._cur_dead_time_ns[dr_start : dr_end]
    __Pyx_INCREF((PyObject *)__pyx_v_self->_total_dead_time_ns);
    __pyx_t_10 = __pyx_v_self->_total_dead_time_ns;
    __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_dr_start); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 130, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_dr_end); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 130, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = PySlice_New(__pyx_t_4, __pyx_t_6, Py_None); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 130, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_t_10), __pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 130, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_4 = __Pyx_PyObject_GetSlice(((PyObject *)__pyx_v_self->_cur_dead_time_ns), __pyx_v_dr_start, __pyx_v_dr_end, NULL, NULL, NULL, 1, 1, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 130, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_t_6, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 130, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely((PyObject_SetItem(((PyObject *)__pyx_t_10), __pyx_t_7, __pyx_t_5) < 0))) __PYX_ERR(2, 130, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF((PyObject *)__pyx_t_10); __pyx_t_10 = 0;
  }
 131: 
+132:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_16cur_dead_time_ns_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_16cur_dead_time_ns_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_16cur_dead_time_ns___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_16cur_dead_time_ns___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("fcio.FCIOExt.cur_dead_time_ns.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 133:   def cur_dead_time_ns(self):
 134:     """
 135:     The dead time since the last triggered event in nanoseconds.
 136:     """
+137:     return self._cur_dead_time_ns[self.trace_list]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_list); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self->_cur_dead_time_ns), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 137, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 138: 
+139:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_13start_time_ns_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_13start_time_ns_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_13start_time_ns___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_13start_time_ns___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("fcio.FCIOExt.start_time_ns.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 140:   def start_time_ns(self):
 141:     """
 142:     Contains a best guess
 143:     """
+144:     return self._start_time_ns[self.trace_list]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_list); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 144, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self->_start_time_ns), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 144, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 145: 
+146:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_12dead_time_ns_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_12dead_time_ns_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_12dead_time_ns___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_12dead_time_ns___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("fcio.FCIOExt.dead_time_ns.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 147:   def dead_time_ns(self):
 148:     """
 149:     The total dead time since the last DAQ reset (start of run) in nanoseconds.
 150:     """
+151:     return self._total_dead_time_ns[self.trace_list]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_list); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self->_total_dead_time_ns), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 152: 
+153:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_12card_address_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_12card_address_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_12card_address___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_12card_address___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("fcio.FCIOExt.card_address.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 154:   def card_address(self):
 155:     """
 156:     List of corresponding MAC addresses of the FADC Card per channel.
 157:     Display in human readable form as hex(car_address[index])
 158:     """
+159:     return self._card_addresses[self.trace_list]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_list); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 159, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self->_card_addresses), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 159, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 160: 
+161:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_12card_channel_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_12card_channel_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_12card_channel___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_12card_channel___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("fcio.FCIOExt.card_channel.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 162:   def card_channel(self):
 163:     """
 164:     List of input RJ45 Jacks of the FADC Card per channel.
 165:     Must be within [0,5] for 16-bit firmware and [0,23] for 12-bit firmware.
 166:     """
+167:     return self._card_channels[self.trace_list]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_trace_list); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 167, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self->_card_channels), __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 167, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 168: 
+169:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_12eventsamples_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_12eventsamples_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_12eventsamples___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_12eventsamples___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("fcio.FCIOExt.eventsamples.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 170:   def eventsamples(self):
 171:     """
 172:     The number of samples of each waveform.
 173:     This parameter is taken from the Config Record and exposed here for convenience.
 174:     """
+175:     return numpy.int32(self._config_ptr.eventsamples)
  __Pyx_XDECREF(__pyx_r);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_numpy); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 175, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int32); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 175, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->_config_ptr->eventsamples); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 175, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = NULL;
  __pyx_t_5 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_5 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 175, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 176: 
+177:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_11eventnumber_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_11eventnumber_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_11eventnumber___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_11eventnumber___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("fcio.FCIOExt.eventnumber.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 178:   def eventnumber(self):
 179:     """
 180:     The event counter from the Top Master Card of this event for FCIOEvent records,
 181:     and the event counter from the corresponding FADC Card for FCIOSparseEvent records.
 182:     """
+183:     return numpy.int32(self._timestamp[0])
  __Pyx_XDECREF(__pyx_r);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_numpy); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 183, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int32); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 183, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int((__pyx_v_self->_timestamp[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 183, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = NULL;
  __pyx_t_5 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_5 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 183, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 184: 
+185:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_3gps_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_3gps_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_3gps___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_3gps___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("fcio.FCIOExt.gps.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 186:   def gps(self):
 187:     """
 188:     The maximum time difference between fpga pps and readout server second.
 189:     If no external clock is used, this parameter is 0.
 190:     """
+191:     return numpy.int32(self._config_ptr.gps)
  __Pyx_XDECREF(__pyx_r);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_numpy); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 191, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int32); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 191, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->_config_ptr->gps); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 191, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = NULL;
  __pyx_t_5 = 0;
  #if CYTHON_UNPACK_METHODS
  if (unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_5 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_t_2};
    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 191, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 192: 
+193:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_12fpga_time_ns_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_12fpga_time_ns_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_12fpga_time_ns___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_12fpga_time_ns___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("fcio.FCIOExt.fpga_time_ns.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 194:   def fpga_time_ns(self):
 195:     """
 196:     The number of nanoseconds since daq reset.
 197:     """
+198:     return self._fpga_time_ns
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_npy_int64(__pyx_v_self->_fpga_time_ns); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 198, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 199: 
+200:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_11utc_unix_ns_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_11utc_unix_ns_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_11utc_unix_ns___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_11utc_unix_ns___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("fcio.FCIOExt.utc_unix_ns.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 201:   def utc_unix_ns(self):
 202:     """
 203:     The number of nanoseconds since 1970 (UTC unix timestamps).
 204:     """
+205:     return self._utc_unix_ns
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_npy_int64(__pyx_v_self->_utc_unix_ns); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 205, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 206: 
+207:   @property
/* Python wrapper */
static PyObject *__pyx_pw_4fcio_7FCIOExt_8utc_unix_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_4fcio_7FCIOExt_8utc_unix_1__get__(PyObject *__pyx_v_self) {
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  __pyx_r = __pyx_pf_4fcio_7FCIOExt_8utc_unix___get__(((struct __pyx_obj_4fcio_FCIOExt *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_4fcio_7FCIOExt_8utc_unix___get__(struct __pyx_obj_4fcio_FCIOExt *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("fcio.FCIOExt.utc_unix.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 208:   def utc_unix(self):
 209:     """
 210:     utc_unix_ns in seconds as float64.
 211:     Be aware that float64 on your machine probably doesn't allow for a precision better than microseconds.
 212:     """
+213:     return self._utc_unix
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->_utc_unix); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 213, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;