def make_grid(self):
        """
        return grid
        """
        changes = None
        # if there is a MagicDataFrame, extract data from it
        if isinstance(self.magic_dataframe, cb.MagicDataFrame):
            # get columns and reorder slightly
            col_labels = list(self.magic_dataframe.df.columns)
            for ex_col in self.exclude_cols:
                col_labels.pop(ex_col)
            if self.grid_type == 'ages':
                levels = ['specimen', 'sample', 'site', 'location']
                for label in levels[:]:
                    if label in col_labels:
                        col_labels.remove(label)
                    else:
                        levels.remove(label)
                col_labels[:0] = levels
            else:
                if self.parent_type:
                    if self.parent_type[:-1] in col_labels:
                        col_labels.remove(self.parent_type[:-1])
                    col_labels[:0] = [self.parent_type[:-1]]
                if self.grid_type[:-1] in col_labels:
                    col_labels.remove(self.grid_type[:-1])
                col_labels[:0] = (self.grid_type[:-1],)
            for col in col_labels:
                if col not in self.magic_dataframe.df.columns:
                    self.magic_dataframe.df[col] = None
            self.magic_dataframe.df = self.magic_dataframe.df[col_labels]
            self.magic_dataframe.sort_dataframe_cols()
            col_labels = list(self.magic_dataframe.df.columns)
            row_labels = self.magic_dataframe.df.index
            # make sure minimum defaults are present
            for header in self.reqd_headers:
                if header not in col_labels:
                    changes = set([1])
                    col_labels.append(header)
        # if there is no pre-existing MagicDataFrame,
        # make a blank grid with do some defaults:
        else:
            # default headers
            #col_labels = list(self.data_model.get_headers(self.grid_type, 'Names'))
            #col_labels[:0] = self.reqd_headers
            col_labels = list(self.reqd_headers)
            if self.grid_type in ['specimens', 'samples', 'sites']:
                col_labels.extend(['age', 'age_sigma'])
            ## use the following line if you want sorted column labels:
            #col_labels = sorted(set(col_labels))
            # defaults are different for ages
            if self.grid_type == 'ages':
                levels = ['specimen', 'sample', 'site', 'location']
                for label in levels:
                    if label in col_labels:
                        col_labels.remove(label)
                col_labels[:0] = levels
            else:
                if self.parent_type:
                    col_labels.remove(self.parent_type[:-1])
                    col_labels[:0] = [self.parent_type[:-1]]
                col_labels.remove(self.grid_type[:-1])
                col_labels[:0] = [self.grid_type[:-1]]
        # make sure all reqd cols are in magic_dataframe
        for col in col_labels:
            if col not in self.magic_dataframe.df.columns:
                self.magic_dataframe.df[col] = None
        # make the grid
        if not self.huge:
            grid = magic_grid.MagicGrid(parent=self.panel, name=self.grid_type,
                                        row_labels=[], col_labels=col_labels)
        # make the huge grid
        else:
            row_labels = self.magic_dataframe.df.index
            grid = magic_grid.HugeMagicGrid(parent=self.panel, name=self.grid_type,
                            row_labels=row_labels, col_labels=col_labels)
        grid.do_event_bindings()
        grid.changes = changes

        self.grid = grid
        return grid
return grid