Example #1
0
    def collect(self):
        '''collect all data.

        Data is stored in a multi-level dictionary (DataTree)
        '''

        self.tree = odict()

        self.debug("%s: collecting data paths." % (self.tracker))
        is_function, datapaths = self.getDataPaths(self.tracker)
        self.debug("%s: collected data paths." % (self.tracker))

        # if function, no datapaths
        if is_function:
            d = self.getData(())

            # save in data tree as leaf
            DataTree.setLeaf(self.tree, ("all",), d)

            self.debug("%s: collecting data finished for function." %
                       (self.tracker))
            return

        # if no tracks, error
        if len(datapaths) == 0 or len(datapaths[0]) == 0:
            self.warn("%s: no tracks found - no output" % self.tracker)
            return

        # filter data paths
        self.debug("%s: filtering data paths: %s" %
                   (self.tracker, datapaths))
        datapaths = self.filterDataPaths(datapaths)
        self.debug("%s: filtered data paths: %s" %
                   (self.tracker, datapaths))

        # if no tracks, error
        if len(datapaths) == 0 or len(datapaths[0]) == 0:
            self.warn(
                "%s: no tracks remain after filtering "
                "- no output" % self.tracker)
            return

        self.debug("%s: building all_paths" % (self.tracker))
        if len(datapaths) > MAX_PATH_NESTING:
            self.warn("%s: number of nesting in data paths too large: %i" % (
                self.tracker, len(datapaths)))
            raise ValueError(
                "%s: number of nesting in data paths too large: %i" % (
                    self.tracker, len(datapaths)))

        all_paths = list(itertools.product(*datapaths))
        self.debug(
            "%s: collecting data started for %i data paths" % (
                self.tracker,
                len(all_paths)))

        self.tree = odict()
        for path in all_paths:

            d = self.getData(path)

            # ignore empty data sets
            if d is None:
                continue

            # save in data tree as leaf
            DataTree.setLeaf(self.tree, path, d)

        self.debug(
            "%s: collecting data finished for %i data paths" % (
                self.tracker,
                len(all_paths)))
        return self.tree