Пример #1
0
 def import_files(self, file_list):
     file_import.import_files(self.chest, file_list)
     self.image_controller = MappableImageController(
         parent=self, treasure_chest=self.chest)
     self.cell_controller = CellController(parent=self,
                                           treasure_chest=self.chest)
     self.log_action(action="import", files=file_list)
Пример #2
0
 def open_treasure_chest(self, filename):
     if self.chest is not None:
         self.chest.close()
     chest = file_import.open_treasure_chest(filename)
     self.chest = chest
     self.image_controller = MappableImageController(parent=self,
                                                     treasure_chest=chest)
     self.cell_controller = CellController(parent=self,
                                           treasure_chest=chest)
     self.mda_controller = MDAViewController(parent=self,
                                             treasure_chest=chest)
     self.title = " - %s" % os.path.split(filename)[1]
     self.has_chest = True
Пример #3
0
 def import_files(self, file_list):
     file_import.import_files(self.chest, file_list)
     self.image_controller = MappableImageController(parent=self, 
                                                 treasure_chest=self.chest)
     self.cell_controller = CellController(parent=self,
                                           treasure_chest=self.chest)
     self.log_action(action="import", files=file_list)
Пример #4
0
 def new_treasure_chest(self, filename):
     if self.chest is not None:
         self.chest.close()
     # first, clear any existing controllers
     self.image_controller = MappableImageController(parent=self)
     self.cell_controller = CellController(parent=self)
     self.mda_controller = MDAViewController(parent=self)
     # open a new chest
     prefix, ext = os.path.splitext(filename)
     if "chest" in ext:
         filename = prefix
     chest = file_import.new_treasure_chest(filename)
     self.chest = chest
     self.image_controller = MappableImageController(parent=self, 
                                                 treasure_chest=chest)
     self.cell_controller = CellController(parent=self, 
                                           treasure_chest=chest)
     self.title = " - %s" % os.path.split(filename)[1]
     self.has_chest=True
Пример #5
0
 def new_treasure_chest(self, filename):
     if self.chest is not None:
         self.chest.close()
     # first, clear any existing controllers
     self.image_controller = MappableImageController(parent=self)
     self.cell_controller = CellController(parent=self)
     self.mda_controller = MDAViewController(parent=self)
     # open a new chest
     prefix, ext = os.path.splitext(filename)
     if "chest" in ext:
         filename = prefix
     chest = file_import.new_treasure_chest(filename)
     self.chest = chest
     self.image_controller = MappableImageController(parent=self,
                                                     treasure_chest=chest)
     self.cell_controller = CellController(parent=self,
                                           treasure_chest=chest)
     self.title = " - %s" % os.path.split(filename)[1]
     self.has_chest = True
Пример #6
0
 def open_treasure_chest(self, filename):
     if self.chest is not None:
         self.chest.close()
     chest = file_import.open_treasure_chest(filename)
     self.chest = chest
     self.image_controller = MappableImageController(parent=self, 
                                                 treasure_chest=chest)
     self.cell_controller = CellController(parent=self, 
                                           treasure_chest=chest)
     self.mda_controller = MDAViewController(parent=self, treasure_chest=chest)
     self.title = " - %s" % os.path.split(filename)[1]
     self.has_chest=True
Пример #7
0
 def update_cell_data(self):
     self.cell_controller = CellController(parent=self, 
                                           treasure_chest=self.chest)
Пример #8
0
 def __init__(self, *args, **kw):
     super(HighSeasAdventure, self).__init__(*args, **kw)
     self.image_controller = MappableImageController(parent=self)
     self.cell_controller = CellController(parent=self)
     self.mda_controller = MDAViewController(parent=self)
     self.chest = None
Пример #9
0
class HighSeasAdventure(Atom):
    has_chest = Bool(False)
    show_image_view = Bool(False)
    show_cell_view = Bool(False)
    show_score_view = Bool(False)
    show_factor_view = Bool(False)
    title = Unicode("")

    image_controller = Instance(MappableImageController)
    cell_controller = Instance(CellController)
    mda_controller = Instance(MDAViewController)
    chest = Instance(tb.File)
    
    def __init__(self, *args, **kw):
        super(HighSeasAdventure, self).__init__(*args, **kw)
        self.image_controller = MappableImageController(parent=self)
        self.cell_controller = CellController(parent=self)
        self.mda_controller = MDAViewController(parent=self)
        self.chest = None

    def update_cell_data(self):
        self.cell_controller = CellController(parent=self, 
                                              treasure_chest=self.chest)
        
    def add_cell_data(self, data, name):
        self.cell_controller.add_cell_data(data,name)

    def update_mda_data(self):
        self.mda_controller = MDAViewController(parent=self, 
                                              treasure_chest=self.chest)
        self.show_factor_view = True
        self.show_score_view = True
        
    def update_image_data(self):
        self.image_controller.data_updated()
        self.crop_controller.data_updated()

    def new_treasure_chest(self, filename):
        if self.chest is not None:
            self.chest.close()
        # first, clear any existing controllers
        self.image_controller = MappableImageController(parent=self)
        self.cell_controller = CellController(parent=self)
        self.mda_controller = MDAViewController(parent=self)
        # open a new chest
        prefix, ext = os.path.splitext(filename)
        if "chest" in ext:
            filename = prefix
        chest = file_import.new_treasure_chest(filename)
        self.chest = chest
        self.image_controller = MappableImageController(parent=self, 
                                                    treasure_chest=chest)
        self.cell_controller = CellController(parent=self, 
                                              treasure_chest=chest)
        self.title = " - %s" % os.path.split(filename)[1]
        self.has_chest=True

    def open_treasure_chest(self, filename):
        if self.chest is not None:
            self.chest.close()
        chest = file_import.open_treasure_chest(filename)
        self.chest = chest
        self.image_controller = MappableImageController(parent=self, 
                                                    treasure_chest=chest)
        self.cell_controller = CellController(parent=self, 
                                              treasure_chest=chest)
        self.mda_controller = MDAViewController(parent=self, treasure_chest=chest)
        self.title = " - %s" % os.path.split(filename)[1]
        self.has_chest=True

    def import_files(self, file_list):
        file_import.import_files(self.chest, file_list)
        self.image_controller = MappableImageController(parent=self, 
                                                    treasure_chest=self.chest)
        self.cell_controller = CellController(parent=self,
                                              treasure_chest=self.chest)
        self.log_action(action="import", files=file_list)

    def load_test_data(self):
        # create the test pattern
        tp = get_test_pattern((256,256))
        # save it as a file, for user's reference, and because we have
        #    to load files into chests (TODO: fix this to be more generic?)
        imsave('tp.png', tp)
        # create a new project
        self.new_treasure_chest('test_pattern')
        # import the newly saved test pattern file
        self.import_files(['tp.png'])
        # delete the file for cleanliness?

    def characterize_peaks(self):
        has_cells = self.cell_controller._can_change_idx
        # TODO: need to make peak width a user-specified value, or some
        #   auto-detect algorithm...
        self.image_controller.characterize_peaks()
        #if has_cells:
            # TODO: cell_controller accesses the database for 
            #  the image controller here.  Need to clean up.
            #self.cell_controller.map_peaks_to_cells()

    def open_crop_UI(self):
        crop_controller = CellCropController(parent=self,
                                                  treasure_chest=self.chest)
        cell_cropper = simple_session('cropper', 'Cell cropper', CellCropperInterface, 
                                      controller=crop_controller)
        Application.instance().add_factories([cell_cropper])
        session_id = Application.instance().start_session('cropper')
        crop_controller._session_id = session_id
        
    def open_MDA_UI(self):
        mda_controller = MDAExecutionController(parent=self, 
                                             treasure_chest=self.chest)
        mda_dialog = simple_session('mda', 'MDA dialog', MDAInterface, 
                                      controller=mda_controller)
        Application.instance().add_factories([mda_dialog])
        session_id = Application.instance().start_session('mda')
        mda_controller._session_id = session_id
        
    def log_action(self, action, **parameters):
        """
        action - a short string describing the action itself (e.g. crop cells)
        parameters - pass any number of named parameters.  These will be recorded as
            a string that can then be recovered as a dictionary at some later date.
        version - the version of analyzarr used to perform that action
        """
        row = self.chest.root.log.row
        row['date']=time()
        row['action']=action
        # record parameter dictionary as string.  Can be brought back with:
        #   dict2 = eval(string_from_table)
        # http://stackoverflow.com/questions/4547274/convert-a-python-dict-to-a-string-and-back
        row['parameters'] = parameters
        row['version'] = version
        row.append()
        self.chest.root.log.flush()
Пример #10
0
class HighSeasAdventure(HasTraits):
    has_chest = Bool(False)
    show_image_view = Bool(False)
    show_cell_view = Bool(False)
    show_score_view = Bool(False)
    show_factor_view = Bool(False)
    title = String("")

    image_controller = Instance(MappableImageController)
    cell_controller = Instance(CellController)
    mda_controller = Instance(MDAViewController)
    
    def __init__(self, *args, **kw):
        super(HighSeasAdventure, self).__init__(*args, **kw)
        self.image_controller = MappableImageController(parent=self)
        self.cell_controller = CellController(parent=self)
        self.mda_controller = MDAViewController(parent=self)
        self.chest = None

    def update_cell_data(self):
        self.cell_controller = CellController(parent=self, 
                                              treasure_chest=self.chest)
        
    def add_image_data(self, data, name):
        self.image_controller.add_data(data,name)
        
    def add_cell_data(self, data, name):
        self.cell_controller.add_data(data,name)

    def update_mda_data(self):
        self.mda_controller = MDAViewController(parent=self, 
                                              treasure_chest=self.chest)
        self.show_factor_view = True
        self.show_score_view = True
        
    def update_image_data(self):
        self.image_controller.data_updated()
        self.crop_controller.data_updated()

    def new_treasure_chest(self, filename):
        if self.chest is not None:
            self.chest.close()
        # first, clear any existing controllers
        self.image_controller = MappableImageController(parent=self)
        self.cell_controller = CellController(parent=self)
        self.mda_controller = MDAViewController(parent=self)
        # open a new chest
        prefix, ext = os.path.splitext(filename)
        if "chest" in ext:
            filename = prefix
        chest = file_import.new_treasure_chest(filename)
        self.chest = chest
        self.image_controller = MappableImageController(parent=self, 
                                                    treasure_chest=chest)
        self.cell_controller = CellController(parent=self, 
                                              treasure_chest=chest)
        self.title = " - %s" % os.path.split(filename)[1]
        self.has_chest=True

    def open_treasure_chest(self, filename):
        if self.chest is not None:
            self.chest.close()
        chest = file_import.open_treasure_chest(filename)
        self.chest = chest
        self.image_controller = MappableImageController(parent=self, 
                                                    treasure_chest=chest)
        self.cell_controller = CellController(parent=self, 
                                              treasure_chest=chest)
        self.mda_controller = MDAViewController(parent=self, treasure_chest=chest)
        self.title = " - %s" % os.path.split(filename)[1]
        self.has_chest=True

    def import_files(self, file_list):
        file_import.import_files(self.chest, file_list)
        self.image_controller = MappableImageController(parent=self, 
                                                    treasure_chest=self.chest)
        self.cell_controller = CellController(parent=self,
                                              treasure_chest=self.chest)
        self.log_action(action="import", files=file_list)

    def load_test_data(self):
        # create the test pattern
        tp = get_test_pattern((256,256))
        # save it as a file, for user's reference, and because we have
        #    to load files into chests (TODO: fix this to be more generic?)
        imsave('tp.png', tp)
        # create a new project
        self.new_treasure_chest('test_pattern')
        # import the newly saved test pattern file
        self.import_files(['tp.png'])
        # delete the file for cleanliness?

    def characterize_peaks(self):
        has_cells = self.cell_controller.get_num_files()>0
        # TODO: need to make peak width a user-specified value, or some
        #   auto-detect algorithm...
        self.image_controller.characterize_peaks()
        if has_cells:
            # TODO: cell_controller accesses the database for 
            #  the image controller here.  Need to clean up.
            self.map_global_peaks_to_cells()

    def open_crop_UI(self):
        crop_controller = CellCropController(parent=self,
                                                  treasure_chest=self.chest)
        cell_cropper = simple_session('cropper', 'Cell cropper', CellCropperInterface, 
                                      controller=crop_controller)
        Application.instance().add_factories([cell_cropper])
        session_id = Application.instance().start_session('cropper')
        crop_controller._session_id = session_id
        
    def open_MDA_UI(self):
        mda_controller = MDAExecutionController(parent=self, 
                                             treasure_chest=self.chest)
        mda_dialog = simple_session('mda', 'MDA dialog', MDAInterface, 
                                      controller=mda_controller)
        Application.instance().add_factories([mda_dialog])
        session_id = Application.instance().start_session('mda')
        mda_controller._session_id = session_id
        
    def log_action(self, action, **parameters):
        """
        action - a short string describing the action itself (e.g. crop cells)
        parameters - pass any number of named parameters.  These will be recorded as
            a string that can then be recovered as a dictionary at some later date.
        version - the version of analyzarr used to perform that action
        """
        row = self.chest.root.log.row
        row['date']=time()
        row['action']=action
        # record parameter dictionary as string.  Can be brought back with:
        #   dict2 = eval(string_from_table)
        # http://stackoverflow.com/questions/4547274/convert-a-python-dict-to-a-string-and-back
        row['parameters'] = parameters
        row['version'] = version
        row.append()
        self.chest.root.log.flush()

    def get_peak_data(self, node_name):
        indices = self.chest.get_node('/image_peaks').get_where_list(
                    '(filename=="%s")'%node_name)
        return self.chest.root.image_peaks[indices]

    def find_best_matching_global_peaks(self, target_locations_x_y, node_name):
        coords_x=self.image_controller.get_expression_data("x", "/image_peaks", node_name)
        coords_y=self.image_controller.get_expression_data("y", "/image_peaks", node_name)
        coords = np.vstack((coords_x, coords_y)).T
        indices=[pc.best_match(coords, target) for target in target_locations_x_y]
        return self.get_peak_data(node_name=node_name)[indices]

    def map_global_peaks_to_cells(self):        
        try:
            # wipe out old results
            self.chest.remove_node('/cell_peaks')        
        except:
            # any errors will be because the table doesn't exist. That's OK.
            pass                
        # get the average cell image and find peaks on it
        peaks=pc.two_dim_findpeaks(self.cell_controller.get_average_cell(), 
                                   xc_filter=False, kill_edges=False)
        # generate a list of column names
        names = [('x%i, y%i, dx%i, dy%i, h%i, o%i, e%i, sx%i, sy%i' % ((x,)*9)).split(', ') 
                 for x in xrange(peaks.shape[0])]
        # flatten that from a list of lists to a simple list
        names = [item for sublist in names for item in sublist]
        # make tuples of each column name and 'f8' for the data type
        dtypes = zip(names, ['f8', ] * peaks.shape[0]*9)
        # prepend the filename and index columns
        dtypes = [('filename', '|S250'), ('file_idx', 'i4'), ('omit', 'bool')] + dtypes
        # create an empty recarray with our data type
        desc = np.recarray((0,), dtype=dtypes)
        # create the table using the empty description recarray
        self.chest.create_table(self.chest.root,
                               'cell_peaks', description=desc)
        
        self.chest.set_node_attr('/cell_peaks','number_of_peaks', peaks.shape[0])
        self.chest.flush()
        
        # loop over each peak, finding the peak that best matches this cell's position
        #     plus the offset for the peak.
        for node in self.image_controller.get_node_iterator():
            cell_data = self.cell_controller.get_cell_set(node.name)
            data = np.zeros((cell_data.shape[0]),dtype=dtypes)
            data["filename"] = node.name
            data['file_idx'] = np.arange(cell_data.shape[0])
            for idx, peak in enumerate(peaks):            
                #TODO: need to rework this whole get_expression_data concept.  It is
                #    a column accessor.
                target_x = self.image_controller.get_expression_data("x_coordinate", 
                                                    table_loc="/cell_description",
                                                    filename=node.name)+peak[0]
                target_y = self.image_controller.get_expression_data("y_coordinate", 
                                                    table_loc="/cell_description",
                                                    filename=node.name)+peak[1]
                if target_x.shape[0]>0:
                    chars = self.find_best_matching_global_peaks(np.array([target_x,target_y]).T, 
                                                                 node.name)
                    # add the peak ids (or data) to table representing cell peak characteristics
                    
                    
                    data["x%i"%idx] = chars["x"]-target_x+peak[0]
                    data["y%i"%idx] = chars["y"]-target_y+peak[1]
                    data["dx%i"%idx] = chars["x"]-target_x
                    data["dy%i"%idx] = chars["y"]-target_y
                    data["h%i"%idx] = chars["h"]
                    data["o%i"%idx] = chars["o"]
                    data["e%i"%idx] = chars["e"]
                    data["sx%i"%idx] = chars["sx"]
                    data["sy%i"%idx] = chars["sy"]
                
            
            # commit the data to the table
            self.chest.root.cell_peaks.append(data)
            self.chest.root.cell_peaks.flush()
        self.chest.flush()
        self.cell_controller._can_show_peak_ids=True
            
        
Пример #11
0
 def update_cell_data(self):
     self.cell_controller = CellController(parent=self,
                                           treasure_chest=self.chest)
Пример #12
0
 def __init__(self, *args, **kw):
     super(HighSeasAdventure, self).__init__(*args, **kw)
     self.image_controller = MappableImageController(parent=self)
     self.cell_controller = CellController(parent=self)
     self.mda_controller = MDAViewController(parent=self)
     self.chest = None
Пример #13
0
class HighSeasAdventure(HasTraits):
    has_chest = Bool(False)
    show_image_view = Bool(False)
    show_cell_view = Bool(False)
    show_score_view = Bool(False)
    show_factor_view = Bool(False)
    title = String("")

    image_controller = Instance(MappableImageController)
    cell_controller = Instance(CellController)
    mda_controller = Instance(MDAViewController)

    def __init__(self, *args, **kw):
        super(HighSeasAdventure, self).__init__(*args, **kw)
        self.image_controller = MappableImageController(parent=self)
        self.cell_controller = CellController(parent=self)
        self.mda_controller = MDAViewController(parent=self)
        self.chest = None

    def update_cell_data(self):
        self.cell_controller = CellController(parent=self,
                                              treasure_chest=self.chest)

    def add_image_data(self, data, name):
        self.image_controller.add_data(data, name)

    def add_cell_data(self, data, name):
        self.cell_controller.add_data(data, name)

    def update_mda_data(self):
        self.mda_controller = MDAViewController(parent=self,
                                                treasure_chest=self.chest)
        self.show_factor_view = True
        self.show_score_view = True

    def update_image_data(self):
        self.image_controller.data_updated()
        self.crop_controller.data_updated()

    def new_treasure_chest(self, filename):
        if self.chest is not None:
            self.chest.close()
        # first, clear any existing controllers
        self.image_controller = MappableImageController(parent=self)
        self.cell_controller = CellController(parent=self)
        self.mda_controller = MDAViewController(parent=self)
        # open a new chest
        prefix, ext = os.path.splitext(filename)
        if "chest" in ext:
            filename = prefix
        chest = file_import.new_treasure_chest(filename)
        self.chest = chest
        self.image_controller = MappableImageController(parent=self,
                                                        treasure_chest=chest)
        self.cell_controller = CellController(parent=self,
                                              treasure_chest=chest)
        self.title = " - %s" % os.path.split(filename)[1]
        self.has_chest = True

    def open_treasure_chest(self, filename):
        if self.chest is not None:
            self.chest.close()
        chest = file_import.open_treasure_chest(filename)
        self.chest = chest
        self.image_controller = MappableImageController(parent=self,
                                                        treasure_chest=chest)
        self.cell_controller = CellController(parent=self,
                                              treasure_chest=chest)
        self.mda_controller = MDAViewController(parent=self,
                                                treasure_chest=chest)
        self.title = " - %s" % os.path.split(filename)[1]
        self.has_chest = True

    def import_files(self, file_list):
        file_import.import_files(self.chest, file_list)
        self.image_controller = MappableImageController(
            parent=self, treasure_chest=self.chest)
        self.cell_controller = CellController(parent=self,
                                              treasure_chest=self.chest)
        self.log_action(action="import", files=file_list)

    def load_test_data(self):
        # create the test pattern
        tp = get_test_pattern((256, 256))
        # save it as a file, for user's reference, and because we have
        #    to load files into chests (TODO: fix this to be more generic?)
        imsave('tp.png', tp)
        # create a new project
        self.new_treasure_chest('test_pattern')
        # import the newly saved test pattern file
        self.import_files(['tp.png'])
        # delete the file for cleanliness?

    def characterize_peaks(self):
        has_cells = self.cell_controller.get_num_files() > 0
        # TODO: need to make peak width a user-specified value, or some
        #   auto-detect algorithm...
        self.image_controller.characterize_peaks()
        if has_cells:
            # TODO: cell_controller accesses the database for
            #  the image controller here.  Need to clean up.
            self.map_global_peaks_to_cells()

    def open_crop_UI(self):
        crop_controller = CellCropController(parent=self,
                                             treasure_chest=self.chest)
        cell_cropper = simple_session('cropper',
                                      'Cell cropper',
                                      CellCropperInterface,
                                      controller=crop_controller)
        Application.instance().add_factories([cell_cropper])
        session_id = Application.instance().start_session('cropper')
        crop_controller._session_id = session_id

    def open_MDA_UI(self):
        mda_controller = MDAExecutionController(parent=self,
                                                treasure_chest=self.chest)
        mda_dialog = simple_session('mda',
                                    'MDA dialog',
                                    MDAInterface,
                                    controller=mda_controller)
        Application.instance().add_factories([mda_dialog])
        session_id = Application.instance().start_session('mda')
        mda_controller._session_id = session_id

    def log_action(self, action, **parameters):
        """
        action - a short string describing the action itself (e.g. crop cells)
        parameters - pass any number of named parameters.  These will be recorded as
            a string that can then be recovered as a dictionary at some later date.
        version - the version of analyzarr used to perform that action
        """
        row = self.chest.root.log.row
        row['date'] = time()
        row['action'] = action
        # record parameter dictionary as string.  Can be brought back with:
        #   dict2 = eval(string_from_table)
        # http://stackoverflow.com/questions/4547274/convert-a-python-dict-to-a-string-and-back
        row['parameters'] = parameters
        row['version'] = version
        row.append()
        self.chest.root.log.flush()

    def get_peak_data(self, node_name):
        indices = self.chest.get_node('/image_peaks').get_where_list(
            '(filename=="%s")' % node_name)
        return self.chest.root.image_peaks[indices]

    def find_best_matching_global_peaks(self, target_locations_x_y, node_name):
        coords_x = self.image_controller.get_expression_data(
            "x", "/image_peaks", node_name)
        coords_y = self.image_controller.get_expression_data(
            "y", "/image_peaks", node_name)
        coords = np.vstack((coords_x, coords_y)).T
        indices = [
            pc.best_match(coords, target) for target in target_locations_x_y
        ]
        return self.get_peak_data(node_name=node_name)[indices]

    def map_global_peaks_to_cells(self):
        try:
            # wipe out old results
            self.chest.remove_node('/cell_peaks')
        except:
            # any errors will be because the table doesn't exist. That's OK.
            pass
        # get the average cell image and find peaks on it
        peaks = pc.two_dim_findpeaks(self.cell_controller.get_average_cell(),
                                     xc_filter=False,
                                     kill_edges=False)
        # generate a list of column names
        names = [('x%i, y%i, dx%i, dy%i, h%i, o%i, e%i, sx%i, sy%i' %
                  ((x, ) * 9)).split(', ') for x in xrange(peaks.shape[0])]
        # flatten that from a list of lists to a simple list
        names = [item for sublist in names for item in sublist]
        # make tuples of each column name and 'f8' for the data type
        dtypes = zip(names, [
            'f8',
        ] * peaks.shape[0] * 9)
        # prepend the filename and index columns
        dtypes = [('filename', '|S250'), ('file_idx', 'i4'),
                  ('omit', 'bool')] + dtypes
        # create an empty recarray with our data type
        desc = np.recarray((0, ), dtype=dtypes)
        # create the table using the empty description recarray
        self.chest.create_table(self.chest.root,
                                'cell_peaks',
                                description=desc)

        self.chest.set_node_attr('/cell_peaks', 'number_of_peaks',
                                 peaks.shape[0])
        self.chest.flush()

        # loop over each peak, finding the peak that best matches this cell's position
        #     plus the offset for the peak.
        for node in self.image_controller.get_node_iterator():
            cell_data = self.cell_controller.get_cell_set(node.name)
            data = np.zeros((cell_data.shape[0]), dtype=dtypes)
            data["filename"] = node.name
            data['file_idx'] = np.arange(cell_data.shape[0])
            for idx, peak in enumerate(peaks):
                #TODO: need to rework this whole get_expression_data concept.  It is
                #    a column accessor.
                target_x = self.image_controller.get_expression_data(
                    "x_coordinate",
                    table_loc="/cell_description",
                    filename=node.name) + peak[0]
                target_y = self.image_controller.get_expression_data(
                    "y_coordinate",
                    table_loc="/cell_description",
                    filename=node.name) + peak[1]
                if target_x.shape[0] > 0:
                    chars = self.find_best_matching_global_peaks(
                        np.array([target_x, target_y]).T, node.name)
                    # add the peak ids (or data) to table representing cell peak characteristics

                    data["x%i" % idx] = chars["x"] - target_x + peak[0]
                    data["y%i" % idx] = chars["y"] - target_y + peak[1]
                    data["dx%i" % idx] = chars["x"] - target_x
                    data["dy%i" % idx] = chars["y"] - target_y
                    data["h%i" % idx] = chars["h"]
                    data["o%i" % idx] = chars["o"]
                    data["e%i" % idx] = chars["e"]
                    data["sx%i" % idx] = chars["sx"]
                    data["sy%i" % idx] = chars["sy"]

            # commit the data to the table
            self.chest.root.cell_peaks.append(data)
            self.chest.root.cell_peaks.flush()
        self.chest.flush()
        self.cell_controller._can_show_peak_ids = True