Exemplo n.º 1
0
 def apply(self, func, *args, recurse=False, **kwargs):
     """
     apply function to all channels of the link
     """
     outchildren = {}
     for cID, child in self.children.items():
         logging.info(self.name + ' ' + cID)
         mattrs = Attributes.merged([self, child])
         if recurse is True:
             outchild = child.apply(func, mattrs, *args, **kwargs)
         else:
             outchild = func(child, mattrs, *args, **kwargs)
         if outchild is not None:
             outchildren[cID] = outchild
     return self._new(outchildren, self.name, self.attrs, self.handles)
Exemplo n.º 2
0
    def __getitem__(self, key):
        if isinstance(key, (cb.Array, Node)) and key.dtype == bool:
            return self.mask(~key)

        if isinstance(key, tuple):
            if len(key) == 1:
                return self[key[0]]
            elif key[0] is Ellipsis:
                if self.level == len(key) - 1:
                    return self[key[1:]]
                elif self.level >= len(key):
                    return self[(slice(None),) + key]

            elif key[0] == slice(None):
                new = type(self)(name=self.name, attrs=self.attrs)
                for cID, child in self.children.items():
                    try:
                        grandchild = child[key[1:]]
                    except KeyError:
                        continue
                    else:
                        if not hasattr(grandchild, 'keys'):
                            grandchild.attrs = Attributes.merged([grandchild, child])
                        new.children[cID] = grandchild
                return new
            elif isinstance(key[0], list):
                newchildren = OrderedDict((k, v[key[1:]])
                                          for k, v in self.children.items()
                                          if k in key[0])
                return self._new(newchildren, self.name, self.attrs,
                                 self.handles)
            else:
                new = self.children[key[0]][key[1:]]
                return new
        elif isinstance(key, list):
            newchildren = OrderedDict((k, v) for k, v in self.children.items()
                                   if k in key)
            return self._new(newchildren, self.name, self.attrs, self.handles)
        else:
            new = self.children[key]
            #new.attrs = Attributes.merged([new, self])
            return new
Exemplo n.º 3
0
    def merged(cls, datlist, xdim=None, **kwargs):
        """
        concatenate sequence of station level containers into one container
        """
        if not datlist:
            return cls()

        datlist = com.prep_merger(datlist)
        dat0 = next(iter(datlist.values()))
        if len(datlist) <= 1:
            return dat0

        dd = com.defaultdict(OrderedDict)
        handles = set()
        for i, idat in datlist.items():
            if not (hasattr(idat, 'degree') and idat.degree == cls.degree):
                continue
            for cID, child in idat.children.items():
                dd[cID][i] = child
            handles |= idat.handles
        for i, idat in datlist.items():
            if hasattr(idat, 'degree') and idat.degree == cls.degree:
                continue
            cID = idat.name
            dd[cID][i] = idat
            handles |= idat.handles

        if xdim is None:
            attrs = Attributes.merged(datlist)
        else:
            attrs, xdim = cb.merge_attrs(datlist, xdim)
        cdat = cls(name=dat0.name, attrs=attrs)
        cdat._sub = dat0._sub
        for cID in dd.keys():
            cdat.children[cID] = cdat._sub.merged(dd[cID], xdim=xdim, **kwargs)
        return cdat