docs: def select(self, key=None, val=None, log='any', out=bool):
          """ The the indices of all channels matching the (key,val) pairs """
          assert out in [bool, int], "Arg out is not valid (int or bool) !"
          C0 = key is None or val is None
          if C0:
              if out is bool:
                  ind = np.ones((self._nch,), dtype=bool)
              else:
                  ind = np.arange(0, self._nch)
              return ind
  
          lt0 = [list, tuple, np.ndarray]
          lt1 = [str, int, float, np.int64, np.float64, bool]
          C0 = log in ['any', 'all']
          C1 = type(log) in lt0 and all([ll in ['any', 'all'] for ll in log])
          assert C0 or C1, "Arg out is not valid ('any','all' or an iterable) !"
          C2 = isinstance(key, str) and key in self._dchans.keys()
          assert C2, "Arg key not valid: provide key of self.dchans"
          C4 = type(val) in lt1
          C5 = type(val) in lt0 and all([type(vv) in lt1 for vv in val])
          assert C4 or C5, "Arg val not valid, should be in %s !"%str(lt1)
          if C4:
              val = [val]
          nv = len(val)
          ind = np.vstack([self._dchans[key] == vv for vv in val])
          if log == 'any':
              ind = np.any(ind,axis=0)
          else:
              ind = np.all(ind,axis=0)
  
          # To be finsihed: add operators and str operations + not
  
          return ind