135 lines
5.6 KiB
Python
135 lines
5.6 KiB
Python
|
# String(label="Please enter your name",description="Name field") name
|
||
|
# OUTPUT String greeting
|
||
|
|
||
|
# A Jython script with parameters.
|
||
|
# It is the duty of the scripting framework to harvest
|
||
|
# the 'name' parameter from the user, and then display
|
||
|
# the 'greeting' output parameter, based on its type.
|
||
|
from ij import IJ
|
||
|
|
||
|
# greeting = "Hello, " + name + "!"
|
||
|
|
||
|
|
||
|
# image prefix :
|
||
|
# AF
|
||
|
# blé : coupes de blé
|
||
|
# CA : coupe d'amande
|
||
|
# FE : feuille d'épinard
|
||
|
# GGH : globule gras humain
|
||
|
# CRF chloroplastes de feuille d'épinard
|
||
|
# OL : oléosome
|
||
|
# DARK : dark
|
||
|
# white :
|
||
|
#
|
||
|
# - cin1 : cinétique 1
|
||
|
# phiG_40x_1 : cinétique avant et après injection enzyme gastrique
|
||
|
# phiG_40x_Zstack20um_1 : stack
|
||
|
# 0mn : on commence à enregistrer et on attend 10mn (pour le bleaching) -> phiG_40x_1
|
||
|
# 10mn : debut injection phase gastrique (poussée)
|
||
|
# 13mn : la phase gastrique (le petit tuyau contient 20ul) arrive dans la cellule d'un coup (1 nanol)
|
||
|
# 15mn : on arrête l'injection
|
||
|
# 50mn : on fait un stack -> phiG_40x_Zstack20um_1
|
||
|
# 51mn : début d'injection phase intestinale (poussée) -> phiG_I_40x_1
|
||
|
# x mn : on arrête l'injection
|
||
|
# 90mn : on fait un stack -> phiG_I_40x_Zstack20um_1
|
||
|
# - cin2 : autre échantillon similaire à cin1
|
||
|
# - cond[5678] : condition non réalistes
|
||
|
import json
|
||
|
|
||
|
class Sequence(object):
|
||
|
def __init__(self, catalog, sequence_id, micro_manager_metadata_file_path):
|
||
|
self.catalog = catalog
|
||
|
self.sequence_id = sequence_id
|
||
|
self.micro_manager_metadata_file_path = micro_manager_metadata_file_path
|
||
|
print(micro_manager_metadata_file_path)
|
||
|
|
||
|
with open(micro_manager_metadata_file_path, "r") as mmm_file:
|
||
|
self.mmm = json.load(mmm_file, encoding='latin-1') # note : the micromanager metadata files are encoded in latin-1, not utf8 (see accents in comments)
|
||
|
@property
|
||
|
def num_frames(self):
|
||
|
summary = self.mmm['Summary']
|
||
|
return int(summary['Frames'])
|
||
|
|
||
|
@property
|
||
|
def width(self):
|
||
|
summary = self.mmm['Summary']
|
||
|
return int(summary['Width'])
|
||
|
|
||
|
@property
|
||
|
def height(self):
|
||
|
summary = self.mmm['Summary']
|
||
|
return int(summary['Height'])
|
||
|
|
||
|
@property
|
||
|
def num_channels(self):
|
||
|
summary = self.mmm['Summary']
|
||
|
return int(summary['Channels'])
|
||
|
|
||
|
@property
|
||
|
def num_slices(self):
|
||
|
summary = self.mmm['Summary']
|
||
|
return int(summary['Slices'])
|
||
|
|
||
|
@property
|
||
|
def num_bits_per_pixels(self):
|
||
|
summary = self.mmm['Summary']
|
||
|
return int(summary['BitDepth'])
|
||
|
|
||
|
def get_root_path(self):
|
||
|
return '/'.join(self.micro_manager_metadata_file_path.split('/')[:-1])
|
||
|
|
||
|
def get_image_file_path(self, channel_id, frame_index, z_index=0):
|
||
|
assert frame_index < self.num_frames
|
||
|
summary = self.mmm['Summary']
|
||
|
channel_index = summary['ChNames'].index(channel_id)
|
||
|
frame_info = self.mmm['FrameKey-%d-%d-%d' % (frame_index, channel_index, z_index) ]
|
||
|
rel_file_path = frame_info['FileName']
|
||
|
return self.get_root_path() + '/' + rel_file_path
|
||
|
|
||
|
def open_in_imagej(self):
|
||
|
#ip = IJ.createHyperStack(title=self.sequence_id, width=self.width, height= self.height, channels=1, slices=1, frames=self.get_num_frames(), bitdepth=16)
|
||
|
hyperstack = IJ.createHyperStack(self.sequence_id, self.width, self.height, self.num_channels, self.num_slices, self.num_frames, self.num_bits_per_pixels)
|
||
|
for channel_index in range(1): #self.num_channels):
|
||
|
for frame_index in range(self.num_frames):
|
||
|
slice_index = 0
|
||
|
src_image_file_path = self.get_image_file_path(channel_id='DM300_327-353_fluo', frame_index=frame_index)
|
||
|
src_image = IJ.openImage(src_image_file_path)
|
||
|
|
||
|
hyperstack.setPosition(channel_index+1, slice_index+1, frame_index+1)
|
||
|
hyperstack.setProcessor(src_image.getProcessor())
|
||
|
hyperstack.show()
|
||
|
|
||
|
class ImageCatalog(object):
|
||
|
def __init__(self, raw_images_root):
|
||
|
self.raw_images_root = raw_images_root
|
||
|
self.sequences = { }
|
||
|
sequence_id = 'GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos0'
|
||
|
micro_manager_metadata_file_path = raw_images_root + '/' + sequence_id + '/metadata.txt'
|
||
|
#micro_manager_metadata_file_path = '/tmp/toto.json'
|
||
|
self.sequences[ sequence_id ] = Sequence(self, sequence_id, micro_manager_metadata_file_path)
|
||
|
|
||
|
def __str__(self):
|
||
|
for sequence_id, sequence in self.sequences.iteritems():
|
||
|
return str(sequence_id) + ':' + str(sequence)
|
||
|
# self.add_micromanager_metadata(raw_images_root + '/GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos0/metadata.txt')
|
||
|
|
||
|
#def add_micromanager_metadata(self, micro_manager_metadata_file_path):
|
||
|
# self.sequences[ micro_manager_metadata_file_path ] = Sequence(self, micro_manager_metadata_file_path)
|
||
|
|
||
|
def run_script():
|
||
|
raw_images_root = '/Users/graffy/ownCloud/ipr/lipase/soleil-2018.test'
|
||
|
catalog = ImageCatalog(raw_images_root)
|
||
|
print(catalog)
|
||
|
catalog.sequences['GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos0'].open_in_imagej()
|
||
|
|
||
|
#src_image_file_path = catalog.sequences['GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos0'].get_image_file_path(channel_id='DM300_327-353_fluo', frame_index=3)
|
||
|
#src_image = IJ.openImage(src_image_file_path)
|
||
|
#dark_image = IJ.openImage(raw_images_root + '/GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos0/img_000000000_DM300_327-353_fluo_000.tif')
|
||
|
#src_image.show()
|
||
|
#assert src_image
|
||
|
|
||
|
# If a Jython script is run, the variable __name__ contains the string '__main__'.
|
||
|
# If a script is loaded as module, __name__ has a different value.
|
||
|
if __name__ in ['__builtin__','__main__']:
|
||
|
run_script()
|