lipase/lipase.py

159 lines
7.1 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_index, frame_index, z_index=0):
assert frame_index < self.num_frames
assert channel_index < self.num_channels
summary = self.mmm['Summary']
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 get_channel_index(self, channel_id):
summary = self.mmm['Summary']
channel_index = summary['ChNames'].index(channel_id)
return
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(self.num_channels):
for frame_index in range(self.num_frames):
slice_index = 0
src_image_file_path = self.get_image_file_path(channel_index=channel_index, frame_index=frame_index)
# print(src_image_file_path)
src_image = IJ.openImage(src_image_file_path)
# print(src_image.getProperties())
hyperstack.setPositionWithoutUpdate(channel_index+1, slice_index+1, frame_index+1)
hyperstack.setProcessor(src_image.getProcessor())
hyperstack.show()
for channel_index in range(self.num_channels):
hyperstack.setPositionWithoutUpdate(channel_index+1, 1, 1)
IJ.run("Enhance Contrast", "saturated=0.35")
class ImageCatalog(object):
def __init__(self, raw_images_root):
self.raw_images_root = raw_images_root
self.sequences = { }
# nb : we use the path as sequence id because the "Comment" field in the summary section of the metadata file is not guaranteed to be unique (eg they are the same in res_soleil2018/white/white_24112018_1/Pos0 and in res_soleil2018/white/white_24112018_2/Pos0)
sequence_ids = []
sequence_ids.append('res_soleil2018/GGH/GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos0')
sequence_ids.append('res_soleil2018/GGH/GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos2')
sequence_ids.append('res_soleil2018/DARK/DARK_40X_60min_1 im pae min_1/Pos0')
# sequence_ids.append('res_soleil2018/white/white_24112018_1/Pos0') # this sequence seems broken (only 5 images while there's supposed to be 201 frames)
sequence_ids.append('res_soleil2018/white/white_24112018_2/Pos0')
for sequence_id in sequence_ids:
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/raw-images'
catalog = ImageCatalog(raw_images_root)
print(catalog)
#catalog.sequences['GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos0'].open_in_imagej()
catalog.sequences['res_soleil2018/GGH/GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos2'].open_in_imagej()
#catalog.sequences['DARK_40X_60min_1 im pae min_1/Pos0'].open_in_imagej()
#catalog.sequences['white_24112018_1/Pos0'].open_in_imagej()
if False:
sequence = catalog.sequences['GGH_2018_cin2_phiG_I_327_vis_-40_1/Pos0']
src_image_file_path = sequence.get_image_file_path(channel_index=sequence.get_channel_index('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()