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