Beispiel #1
0
    def go(self):
        pi = self.progress.indicator
        nstates = len(self.state_labels)
        if self.interface == 'matplotlib':
            with pi:
                if 'state_pop_evolution' in self.stateprobs_file:
                    pi.new_operation('plotting populations', nstates)
                    for istate in range(nstates):
                        self.plot_pop(istate)
                        pi.progress += 1

                if 'color_prob_evolution' in self.stateprobs_file:
                    pi.new_operation('plotting ensemble populations', nstates)
                    for istate in range(nstates):
                        self.plot_color(istate)
                        pi.progress += 1
                else:
                    print('population evolution not available')
        else:
            plotter = Plotter(self.stateprobs_file,
                              'state_pop_evolution',
                              iteration=-1,
                              interface='text')
            for istate in range(nstates):
                plotter.plot(istate)
            plotter = Plotter(self.stateprobs_file,
                              'color_prob_evolution',
                              iteration=-1,
                              interface='text')
            for istate in range(nstates):
                plotter.plot(istate)
Beispiel #2
0
    def go(self):
        pi = self.progress.indicator
        nstates = len(self.state_labels)
        if self.interface == 'matplotlib':
            with pi:
                # if --evolution-mode wasn't specified, neither of these exist:
                if 'target_flux_evolution' in self.kinavg_file:
                    pi.new_operation('plotting fluxes', nstates)
                    for istate in range(nstates):
                        self.plot_flux(istate)
                        pi.progress += 1

                # if --evolution-mode wasn't specified, we won't get this either
                if 'rate_evolution' in self.kinavg_file:
                    pi.new_operation('plotting rates', nstates * nstates)
                    for istate in range(nstates):
                        for jstate in range(nstates):
                            self.plot_rate(istate, jstate)
                            pi.progress += 1
                else:
                    print('rate evolution not available')
        else:
            plotter = Plotter(self.kinavg_file, 'rate_evolution', iteration=-1, interface='text')
            for istate in range(nstates):
                for jstate in range(nstates):
                    if istate != jstate:
                        plotter.plot(istate, jstate)
            plotter = Plotter(self.kinavg_file, 'conditional_flux_evolution', iteration=-1, interface='text')
            for istate in range(nstates):
                for jstate in range(nstates):
                    if istate != jstate:
                        plotter.plot(istate, jstate)
Beispiel #3
0
    def __getitem__(self, value):
        '''
        Responsible for handling whether this is treated like a dictionary of data sets, or an array of walker data.
        '''
        # Check to see if we're indexing via any of the active string types.  We should probably break it down via string or int, instead of 'what exists and what doesn't', but it works for now.
        # active_items = [
        # 'kinavg',
        # 'statepops',
        # 'weights',
        # 'pcoord',
        # 'auxdata',
        # 'parents',
        # 'summary',
        # 'seg_id',
        # 'walkers',
        # 'states',
        # 'bins',
        # 'populations',
        # 'plot',
        # 'instant_matrix',
        # 'kinrw',
        # 'matrix',
        # 'rwstatepops',
        # ]
        # if value in active_items:
        if isinstance(value, str):
            # This should handle everything.  Otherwise...
            try:
                return self.raw[value]
            except Exception:
                print('{} is not a valid data structure.'.format(value))
        elif isinstance(value, int) or isinstance(value, np.int64):
            # Otherwise, we assume they're trying to index for a seg_id.
            if value < self.walkers:
                current = {}
                current['plotter'] = {}
                for i in ['pcoord']:
                    current[i] = WIPIDataset(raw=self.raw[i][value, :, :], key=i)
                    current[i].plotter = Plotter(self.raw[i][value, :, :], i, iteration=self.iteration, interface='text')
                    current[i].plot = current[i].plotter.plot

                current['states'] = self.raw['states'][value, :]
                current['bins'] = self.raw['bins'][value, :]
                current['parents'] = self.raw['parents'][value]
                current['seg_id'] = self.raw['seg_id'][value]
                current['weights'] = self.raw['weights'][value]
                try:
                    current['auxdata'] = {}
                    for key in list(self.raw['auxdata'].keys()):
                        current['auxdata'][key] = self.raw['auxdata'][key][value]
                except Exception:
                    pass
                current = WIPIDataset(current, 'Segment {} in Iter {}'.format(value, self.iteration))
                return current
            else:
                print('INVALID SEG_ID {}.  SEG_ID should be less than {}.'.format(value, self.walkers))
Beispiel #4
0
 def __1D_with_error__(self, h5key, index, assign):
     self.step_iter = (self.h5file[h5key]['iter_stop'][0] - self.h5file[h5key]['iter_start'][0])[1]
     value = (index - self.h5file.attrs['iter_start']) // self.step_iter
     if value < 0:
         value = 0
     raw = self.h5file[h5key][value, :]
     error = (raw['ci_ubound'] - raw['ci_lbound']) / (2 * raw['expected'])
     # expected = raw['expected']
     raw = self.__custom_dataset__(raw, assign, h5key)
     raw.error = error
     raw.plotter = Plotter(self.h5file, h5key, iteration=value, interface='text')
     raw.plot = raw.plotter.plot
     return raw
Beispiel #5
0
 def __2D_with_error__(self, h5key, index, assign):
     # Check the start and stop, calculate the block size, and index appropriately.
     # While we could try and automatically generate this above, it's a little more consistent to try it here.
     # This should show the first block for which the current iteration has contributed data.
     self.step_iter = (self.h5file[h5key]['iter_stop'][0] - self.h5file[h5key]['iter_start'][0])[1, 0]
     value = (index - self.h5file.attrs['iter_start']) // self.step_iter
     if value < 0:
         value = 0
     raw = self.h5file[h5key][value, :, :]
     error = (raw['ci_ubound'] - raw['ci_lbound']) / (2 * raw['expected'])
     # expected = raw['expected']
     raw = self.__custom_dataset__(raw, assign, h5key)
     raw.error = error
     raw.plotter = Plotter(self.h5file, h5key, iteration=value, interface='text')
     raw.plot = raw.plotter.plot
     return raw
Beispiel #6
0
    def trace(self, seg_id):
        '''
        Runs a trace on a seg_id within the current iteration, all the way back to the beginning,
        returning a dictionary containing all interesting information:

            seg_id, pcoord, states, bins, weights, iteration, auxdata (optional)

        sorted in chronological order.


        Call with a seg_id.
        '''
        if seg_id >= self.current.walkers:
            print("Walker seg_id # {} is beyond the max count of {} walkers.".
                  format(seg_id, self.current.walkers))
            return 1
        pi = self.progress.indicator
        with pi:
            pi.new_operation(
                'Tracing scheme:iter:seg_id {}:{}:{}'.format(
                    self.scheme, self.iteration, seg_id), self.iteration)
            current = {
                'seg_id': [],
                'pcoord': [],
                'states': [],
                'weights': [],
                'iteration': [],
                'bins': []
            }
            keys = []
            try:
                current['auxdata'] = {}
                for key in list(self.current['auxdata'].keys()):
                    current['auxdata'][key] = []
                    key = []
            except Exception:
                pass
            for iter in reversed(list(range(1, self.iteration + 1))):
                iter_group = self.data_reader.get_iter_group(iter)
                current['pcoord'].append(iter_group['pcoord'][seg_id, :, :])
                current['states'].append(self.assign['trajlabels'][iter - 1,
                                                                   seg_id, :])
                current['bins'].append(self.assign['assignments'][iter - 1,
                                                                  seg_id, :])
                current['seg_id'].append(seg_id)
                current['weights'].append(
                    iter_group['seg_index']['weight'][seg_id])
                current['iteration'].append(iter)
                try:
                    for key in keys:
                        current['auxdata'][key].append(
                            iter_group['auxdata'][key][seg_id])
                except Exception:
                    pass
                seg_id = iter_group['seg_index']['parent_id'][seg_id]
                if seg_id < 0:
                    # Necessary for steady state simulations.  This means they started in that iteration.
                    break
                pi.progress += 1
        current['seg_id'] = list(reversed(current['seg_id']))
        current['iteration'] = list(reversed(current['iteration']))
        current['states'] = np.concatenate(
            np.array(list(reversed(current['states']))))
        current['bins'] = np.concatenate(
            np.array(list(reversed(current['bins']))))
        current['weights'] = np.array(list(reversed(current['weights'])))
        current['pcoord'] = np.concatenate(
            np.array(list(reversed(current['pcoord']))))
        try:
            for key in keys():
                current['auxdata'][key] = np.concatenate(
                    np.array(list(reversed(current['auxdata'][key]))))
        except Exception:
            pass
        current['state_labels'] = self.assign['state_labels']
        for i in ['pcoord', 'states', 'bins', 'weights']:
            current[i] = WIPIDataset(raw=current[i], key=i)
            if i == 'weights':
                current[i].plotter = Plotter(np.log10(current[i].raw),
                                             str('log10 of ' + str(i)),
                                             iteration=current[i].raw.shape[0],
                                             interface=self.interface)
            else:
                current[i].plotter = Plotter(current[i].raw,
                                             i,
                                             iteration=current[i].raw.shape[0],
                                             interface=self.interface)
            current[i].plot = current[i].plotter.plot
        return WIPIDataset(raw=current, key=seg_id)