Added the ability of the user to choose the channel for which he wants to compute the white estimate.

As a result the Estimate White plugin is now usable.
This commit is contained in:
Guillaume Raffy 2019-09-26 15:11:59 +02:00
parent e6217b38a3
commit d71793ad9c
2 changed files with 72 additions and 2 deletions

View File

@ -28,13 +28,79 @@ from lipase.imagej.ijimageengine import IJImageEngine
from lipase.preprocessing import WhiteEstimator from lipase.preprocessing import WhiteEstimator
from lipase.catalog import ImageCatalog from lipase.catalog import ImageCatalog
from ij import IJ
from ij.gui import GenericDialog, DialogListener
from java.awt.event import ItemListener
# class MyListener(DialogListener):
# def dialogItemChanged(self, gd, event):
# IJ.log("Something was changed (event = %s)" % event)
# IJ.log("event's attributes : %s" % str(dir(event)))
# # Something was changed (event = java.awt.event.ItemEvent[ITEM_STATE_CHANGED,item=res_soleil2018/DARK/DARK_40X_60min_1 im pae min_1/Pos0,stateChange=SELECTED] on choice0)
# # event's attributes : ['ACTION_EVENT_MASK', 'ADJUSTMENT_EVENT_MASK', 'COMPONENT_EVENT_MASK', 'CONTAINER_EVENT_MASK', 'DESELECTED', 'FOCUS_EVENT_MASK', 'HIERARCHY_BOUNDS_EVENT_MASK', 'HIERARCHY_EVENT_MASK', 'ID', 'INPUT_METHOD_EVENT_MASK', 'INVOCATION_EVENT_MASK', 'ITEM_EVENT_MASK', 'ITEM_FIRST', 'ITEM_LAST', 'ITEM_STATE_CHANGED', 'KEY_EVENT_MASK', 'MOUSE_EVENT_MASK', 'MOUSE_MOTION_EVENT_MASK', 'MOUSE_WHEEL_EVENT_MASK', 'PAINT_EVENT_MASK', 'RESERVED_ID_MAX', 'SELECTED', 'TEXT_EVENT_MASK', 'WINDOW_EVENT_MASK', 'WINDOW_FOCUS_EVENT_MASK', 'WINDOW_STATE_EVENT_MASK', '__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__', '__ensure_finalizer__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasshook__', '__unicode__', 'class', 'equals', 'getClass', 'getID', 'getItem', 'getItemSelectable', 'getSource', 'getStateChange', 'hashCode', 'item', 'itemSelectable', 'notify', 'notifyAll', 'paramString', 'setSource', 'source', 'stateChange', 'toString', 'wait']
class SequenceChoiceListener(ItemListener):
def __init__(self, channel_choice, catalog):
ItemListener.__init__(self)
self.channel_choice = channel_choice
self.catalog = catalog
def itemStateChanged(self, event):
IJ.log("SequenceChoiceListener : Something was changed (event = %s)" % event)
# SequenceChoiceListener : Something was changed (event = java.awt.event.ItemEvent[ITEM_STATE_CHANGED,item=res_soleil2018/DARK/DARK_40X_60min_1 im pae min_1/Pos0,stateChange=SELECTED] on choice3)
IJ.log("SequenceChoiceListener : event's attributes : %s" % str(dir(event)))
# SequenceChoiceListener : event's attributes : ['ACTION_EVENT_MASK', 'ADJUSTMENT_EVENT_MASK', 'COMPONENT_EVENT_MASK', 'CONTAINER_EVENT_MASK', 'DESELECTED', 'FOCUS_EVENT_MASK', 'HIERARCHY_BOUNDS_EVENT_MASK', 'HIERARCHY_EVENT_MASK', 'ID', 'INPUT_METHOD_EVENT_MASK', 'INVOCATION_EVENT_MASK', 'ITEM_EVENT_MASK', 'ITEM_FIRST', 'ITEM_LAST', 'ITEM_STATE_CHANGED', 'KEY_EVENT_MASK', 'MOUSE_EVENT_MASK', 'MOUSE_MOTION_EVENT_MASK', 'MOUSE_WHEEL_EVENT_MASK', 'PAINT_EVENT_MASK', 'RESERVED_ID_MAX', 'SELECTED', 'TEXT_EVENT_MASK', 'WINDOW_EVENT_MASK', 'WINDOW_FOCUS_EVENT_MASK', 'WINDOW_STATE_EVENT_MASK', '__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__', '__ensure_finalizer__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasshook__', '__unicode__', 'class', 'equals', 'getClass', 'getID', 'getItem', 'getItemSelectable', 'getSource', 'getStateChange', 'hashCode', 'item', 'itemSelectable', 'notify', 'notifyAll', 'paramString', 'setSource', 'source', 'stateChange', 'toString', 'wait']
IJ.log("SequenceChoiceListener : event.item : %s" % str(event.item))
IJ.log("SequenceChoiceListener : type(event.item) : %s" % str(type(event.item)))
selected_sequence_id = event.item
selected_sequence = self.catalog.sequences[selected_sequence_id]
channel_ids = selected_sequence.get_channel_names()
self.channel_choice.removeAll()
for channel_id in channel_ids:
self.channel_choice.add(channel_id)
def ask_for_sequence(catalog):
title = 'select the sequence to process'
gd = GenericDialog(title)
# gd.addDialogListener(MyListener())
sequence_ids = catalog.sequences.keys()
assert len(sequence_ids) > 0
default_sequence_id = sequence_ids[0]
gd.addChoice('sequence', sequence_ids, default_sequence_id)
channel_ids = catalog.sequences[default_sequence_id].get_channel_names()
gd.addChoice('channel', channel_ids, channel_ids[0])
choices = gd.getChoices()
IJ.log("choices = %s" % choices)
sequence_choice = choices[0]
channel_choice = choices[1]
sequence_choice.addItemListener(SequenceChoiceListener(channel_choice, catalog))
gd.showDialog()
if gd.wasCanceled():
return {}
selected_sequence_id = sequence_ids[gd.getNextChoiceIndex()] # eg 'res_soleil2018/GGH/GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos2'
selected_channel_id = catalog.sequences[selected_sequence_id].get_channel_names()[gd.getNextChoiceIndex()] # eg 'DM300_327-353_fluo'
print("chosen sequence : %s" % selected_sequence_id)
print("chosen channel : %s" % selected_channel_id)
return {'sequence': catalog.sequences[selected_sequence_id], 'channel_id':selected_channel_id}
def run_script(): def run_script():
user_settings = UserSettings() user_settings = UserSettings()
IImageEngine.set_instance(IJImageEngine()) IImageEngine.set_instance(IJImageEngine())
catalog = ImageCatalog(user_settings.raw_images_root_path) catalog = ImageCatalog(user_settings.raw_images_root_path)
sequence = catalog.sequences['res_soleil2018/GGH/GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos2'] user_selection = ask_for_sequence(catalog)
if len(user_selection) == 0:
return
sequence = user_selection['sequence']
channel_id = user_selection['channel_id']
white_estimator = WhiteEstimator(open_size=75, close_size=75, average_size=75) white_estimator = WhiteEstimator(open_size=75, close_size=75, average_size=75)
white_estimate = white_estimator.estimate_white([sequence], ['DM300_327-353_fluo']) white_estimate = white_estimator.estimate_white([sequence], [channel_id])
print(type(white_estimate)) print(type(white_estimate))
global WHITE_ESTIMATE global WHITE_ESTIMATE
WHITE_ESTIMATE = white_estimate.ij_image WHITE_ESTIMATE = white_estimate.ij_image

View File

@ -98,6 +98,10 @@ class Sequence(object):
summary = self.mmm['Summary'] summary = self.mmm['Summary']
return summary['ChNames'][channel_index] return summary['ChNames'][channel_index]
def get_channel_names(self):
summary = self.mmm['Summary']
return summary['ChNames']
def get_black(self): def get_black(self):
''' returns the black sequence related to the the sequence self ''' returns the black sequence related to the the sequence self