def Z1_metadata(sourcefile):
	# Access header of Z1 lighsheet data to determine nb views
    reader = ImageReader()
    omeMeta = MetadataTools.createOMEXMLMetadata()
    reader.setMetadataStore(omeMeta)
    reader.setId(sourcefile)
    seriesCount = reader.getSeriesCount()
    reader.close()
    return seriesCount
def getFrameIntervalFromImage(image_path):
    from loci.formats import ImageReader
    from loci.formats import MetadataTools
    r = ImageReader()
    meta = MetadataTools.createOMEXMLMetadata()
    r.setMetadataStore(meta)
    r.setId(image_path)
    frame_interval = meta.getPixelsTimeIncrement(0).value()
    log("Detected frame rate: %s (%s)" % (frame_interval, image_path))
    return frame_interval
def link_slices(output_path,channel,sizeZ,theC,physX,physY,physZ):

	IJ.log("Linking z slices")

	# number of slices will determine filename format
	digits = "00"
	if sizeZ < 100:
		digits = "0"
	if sizeZ < 10:
		digits = ""

	# get the base metadata from the first fused image
	z0meta = MetadataTools.createOMEXMLMetadata()
	fused = glob.glob(output_path + "fused*")
	first_fused = fused[0]
	reader = get_reader(first_fused,z0meta)
	z0meta.setPixelsSizeZ(PositiveInteger(sizeZ),0)
	reader.close()

	for z in range(sizeZ):
		fpath = fused[z]
		IJ.log("writing metadata to slice %s"%os.path.basename(fpath))
		m = MetadataTools.createOMEXMLMetadata()
		r = get_reader(fpath,m)

		# set the TiffData elements on the first plane
		# setTiffData(IFD, image index, TiffData index)
		z0meta.setTiffDataIFD(NNI(0),0,z)
		# setTiffDataPlaneCount(planecount, image index, TiffData index)
		z0meta.setTiffDataPlaneCount(NNI(1),0,z)
		# setTiffDataFirstC(firstC, image index, TiffData index)
		z0meta.setTiffDataFirstC(NNI(0),0,z)
		# setTiffDataFirstC(firstT, image index, TiffData index)
		z0meta.setTiffDataFirstT(NNI(0),0,z)
		# setTiffDataFirstC(firstZ, image index, TiffData index)
		z0meta.setTiffDataFirstZ(NNI(0),z,z)
		# setUUIDFileName(filename, image index, TiffData index)
		z0meta.setUUIDFileName(m.getUUIDFileName(0,0),0,0)
		# setUUIDValue(value, image index, TiffData index)
		z0meta.setUUIDValue(m.getUUIDValue(0,0),0,0)

		# set the physical pixel sizes on each plane
		m.setPixelsPhysicalSizeX(physX,0)
		m.setPixelsPhysicalSizeY(physY,0)
		m.setPixelsPhysicalSizeZ(physZ,0)

		# set the channel attributes on each plane
		m.setChannelID("Channel:0:" + str(0), 0, 0)
		spp = channel['spp']
		m.setChannelSamplesPerPixel(spp, 0, 0)
		name = channel['name']
		color = channel['color']
		m.setChannelName(name,0,0)
		m.setChannelColor(color,0,0)
		r.close()

		# replace the metadata in the slice
		if z > 0:
			replace_meta(m,fpath)

	replace_meta(z0meta,first_fused)
def run_script(params):

	input_dir = params['directory']
	gridX = params['gridX']
	gridY = params['gridY']
	select_channel = params['select_channel']
	channel = params['channel']

	input_data = glob.glob("%s*.tiff"%input_dir)
	first = [s for s in input_data if "T0_C0" in s][0]
	start = first.index("Z")+1
	sub = first[start:]
	stop = sub.index("_")
	digits = sub[:stop-1]
	sep = os.path.sep
			
	original_metadata = []
	for filename in input_data:
		meta = MetadataTools.createOMEXMLMetadata()
		reader = get_reader(filename,meta)
		original_metadata.append(meta)
		reader.close()

	complete_meta = original_metadata[0]
	channels_meta = channel_info(complete_meta)
	if len(input_data) != (gridX * gridY * len(channels_meta)):
		IJ.log("Stopped stitching - gridX or gridY not set correctly")
		return
	
	channels = channels_meta
	if select_channel:
		channels = [channels_meta[channel]] # a list of len 1 with a dictionary of channel metadata
		
	num_tiles,num_slices = tile_info(complete_meta)
	if params['separate_z']:
		sizeZ = num_slices
	else:
		sizeZ = 1
		
	for z in range(sizeZ):
		for t in range(num_tiles):
			for c,chan in enumerate(channels):
				frag = "Z%s%s_T%s_C%s"%(digits,z,t,chan['ID'])
				input_path = [s for s in input_data if frag in s][0]
				IJ.log("Transforming metadata in image %s"%os.path.basename(input_path))
				tile_meta = MetadataTools.createOMEXMLMetadata()
				tile_meta = set_metadata(complete_meta,tile_meta,chan)
				replace_meta(tile_meta,input_path)

	idx = input_data[0].index("Z%s0_T0_C0.tiff"%digits)
	prefix = input_data[0][:idx]
	trunc_filenames = []
	for filename in input_data:
		new_filename = input_dir+filename[idx:]
		os.rename(filename,new_filename)
		trunc_filenames.append(new_filename)

	while not os.path.exists(trunc_filenames[-1]):
	   time.sleep(1)
		
	physX,physY,physZ = pixel_info(complete_meta)	
	for c,chan in enumerate(channels):
		tile_names = "Z%s0_T{i}_C%s.tiff"%(digits,chan['ID'])
		run_stitching(input_dir,tile_names,gridX,gridY)
		write_fused(input_dir,chan,num_slices,c+1,\
					physX,physY,physZ) # channel index starts at 1
					
	restore_metadata(input_dir,original_metadata,prefix)
	delete_slices(input_dir)
def write_fused(output_path,channel,sizeZ,theC,physX,physY,physZ):

	IJ.log("Writing fused data")

	# number of slices will determine filename format
	digits = "00"
	if sizeZ < 100:
		digits = "0"
	if sizeZ < 10:
		digits = ""

	# get the base metadata from the first fused image
	meta = MetadataTools.createOMEXMLMetadata()
	reader = get_reader(output_path+"img_t1_z%s1_c1"%digits,meta)
	reader.close()
	
	# reset some metadata
	meta.setPixelsPhysicalSizeX(physX,0)
	meta.setPixelsPhysicalSizeY(physY,0)
	meta.setPixelsPhysicalSizeZ(physZ,0)
	meta.setPixelsSizeZ(PositiveInteger(sizeZ),0)
	meta.setChannelID("Channel:0:" + str(0), 0, 0)
	spp = channel['spp']
	meta.setChannelSamplesPerPixel(spp, 0, 0)
	name = channel['name']
	color = channel['color']
	meta.setChannelName(name,0,0)
	meta.setChannelColor(color,0,0)
		
	# determine the number of subsets that need to be written
	slices_per_subset = 200
	num_output_files = divmod(sizeZ,slices_per_subset)
	fpaths = []
	if num_output_files[0] == 0:
		nslices = [sizeZ]
		num_output_files = 1
		fpaths.append("%sfused_C%s.ome.tif"%(output_path,str(theC-1)))
	else:
		nslices = []
		for n in range(num_output_files[0]):
			nslices.append(slices_per_subset)

		if num_output_files[1] > 0:
			nslices.append(num_output_files[1])		
		
		for s in range(len(nslices)):
			fpaths.append("%sfused_C%s_subset%s.ome.tif"%(output_path,str(theC-1),str(s)))

	# setup a writer
	writer = ImageWriter()
	writer.setCompression('LZW')
	writer.setMetadataRetrieve(meta)
	writer.setId(fpaths[0])

	# write the slices, changing the output file when necessary
	theZ = 0
	for f in range(len(fpaths)):
		meta.setImageName(os.path.basename(fpaths[f]),0)
		writer.changeOutputFile(fpaths[f])
		for s in range(nslices[f]):
			fpath = output_path+"img_t1_z%s%s_c1"%(digits,str(theZ+1))
			if (len(digits) == 1) and (theZ+1 > 9):
				fpath = output_path+"img_t1_z%s_c1"%(str(theZ+1))
			if (len(digits) == 2) and (theZ+1 > 9):
				fpath = output_path+"img_t1_z0%s_c1"%(str(theZ+1))
			if (len(digits) == 2) and (theZ+1 > 99):
				fpath = output_path+"img_t1_z%s_c1"%(str(theZ+1))
			IJ.log("writing slice %s"%os.path.basename(fpath))
			m = MetadataTools.createOMEXMLMetadata()
			
			r = get_reader(fpath,m)
			m.setPixelsPhysicalSizeX(physX,0)
			m.setPixelsPhysicalSizeY(physY,0)
			m.setPixelsPhysicalSizeZ(physZ,0)
			m.setChannelID("Channel:0:" + str(0), 0, 0)
			spp = channel['spp']
			m.setChannelSamplesPerPixel(spp, 0, 0)
			name = channel['name']
			color = channel['color']
			m.setChannelName(name,0,0)
			m.setChannelColor(color,0,0)
			writer.saveBytes(theZ,r.openBytes(0))
			r.close()
			theZ += 1
	writer.close()
Example #6
0
def processMovie(root, files, outfile):
    """Concatenate images and write ome.tiff file.
    If image contains already multiple time points just copy the image"""

    files.sort()

    options = ImporterOptions()
    options.setId(files[0])
    options.setVirtual(1)

    image = BF.openImagePlus(options)
    image = image[0]
    if image.getNFrames() > 1:
        msg = ("%s Contains multiple time points. Can only concatenate"
               " single time points!" %files[0])
        raise RuntimeError(msg)
        image.close()

    reader = ImageReader()
    reader.setMetadataStore(MetadataTools.createOMEXMLMetadata())
    reader.setId(files[0])
    timeInfo = []
    omeOut = reader.getMetadataStore()
    omeOut = setUpXml(omeOut, image, files)
    reader.close()
    image.close()
    itime = 0

    for fileName in files:
        omeMeta = MetadataTools.createOMEXMLMetadata()
        reader.setMetadataStore(omeMeta)
        reader.setId(fileName)
        timeInfo.append(getTimePoint(reader, omeMeta))

        nrImages = reader.getImageCount()
        for i in range(0, reader.getImageCount()):
            try:
                dT = round(timeInfo[files.index(fileName)]-timeInfo[0],2)
            except:
                dT = (timeInfo[files.index(fileName)]-timeInfo[0]).seconds
            omeOut.setPlaneDeltaT(dT, 0, i + itime*nrImages)
            omeOut.setPlanePositionX(omeOut.getPlanePositionX(0,i), 0, i + itime*nrImages)
            omeOut.setPlanePositionY(omeOut.getPlanePositionY(0,i), 0, i + itime*nrImages)
            omeOut.setPlanePositionZ(omeOut.getPlanePositionZ(0,i), 0, i + itime*nrImages)
            omeOut.setPlaneTheC(omeOut.getPlaneTheC(0,i), 0, i + itime*nrImages)
            omeOut.setPlaneTheT(omeOut.getPlaneTheT(0,i), 0, i + itime*nrImages)
            omeOut.setPlaneTheZ(omeOut.getPlaneTheZ(0,i), 0, i + itime*nrImages)
        itime = itime + 1
        reader.close()

        IJ.showProgress(files.index(fileName), len(files))

    try:
        omeOut.setPixelsTimeIncrement(float(dT/(len(files)-1)), 0)
    except:
        omeOut.setPixelsTimeIncrement(0, 0)

    if len(files) <= 1:
        raise RuntimeError('Found only one file. Nothing to concatenate')

    outfile = concatenateImagePlus(files, outfile)
    filein = RandomAccessInputStream(outfile)
    fileout = RandomAccessOutputStream(outfile)
    saver = TiffSaver(fileout, outfile)
    saver.overwriteComment(filein, omeOut.dumpXML())
    fileout.close()
    filein.close()
width = r.getSizeX()
height = r.getSizeY()
md = r.getGlobalMetadata()
# print(type(md))
# print(num, width, height)
stack = ImageStack(width, height)
i = 0
ip = r.openProcessors(i)[0]
stack.addSlice("1", ip);
imp = ImagePlus("foo", stack);
r.close()
imp.show()
IJ.run("Enhance Contrast", "saturated=0.35")

imageReader = ImageReader()
meta = MetadataTools.createOMEXMLMetadata()
imageReader.setMetadataStore(meta)
imageReader.setId(filePath)
pSizeX = meta.getPixelsPhysicalSizeX(0)
pSizeY = meta.getPixelsPhysicalSizeY(0)
imageReader.close()
print(pSizeX, pSizeY)
print(meta.getPixelsSizeX(0))
print(meta.getPixelsSizeY(0))






Example #8
0
import os
import xml.etree.ElementTree as etree

import ij
from loci.formats import ImageReader
from loci.formats import MetadataTools

def get_reader(file, complete_meta):
	reader = ImageReader()
	reader.setMetadataStore(complete_meta)
	reader.setId(file)
	return reader

# files is a comma separated list of paths to the first ztc
basepath = "/Users/uqdmatt2/Desktop/"	
files = [basepath+"Original_File/example stitch_Z0_T0_C0.tiff"]

for fpath in files:
	original_metadata = MetadataTools.createOMEXMLMetadata()
	reader = get_reader(fpath,original_metadata)
	reader.close()
	xml_data = original_metadata.dumpXML()

	outputdir = os.path.dirname(fpath)
	shortname = os.path.basename(fpath)[:-5]	
	outputpath = os.path.join(outputdir,shortname+".xml")
	root = etree.fromstring(xml_data.decode('utf-8','ignore'))
	et = etree.ElementTree(root)
	et.write(outputpath)

def initreader(vsi_path):
    reader = ImageReader()
    omeMeta = MetadataTools.createOMEXMLMetadata()
    reader.setMetadataStore(omeMeta)
    reader.setId(vsi_path)
    return(reader)
def nucleus_detection(infile, nucleus_channel, stacksize, animation):
	# Detect nucleus with 3d log filters
    fullpath = infile
    infile = filename(infile)
    IJ.log("Start Segmentation " + str(infile))
    # First get Nb Stacks
    reader = ImageReader()
    omeMeta = MetadataTools.createOMEXMLMetadata()
    reader.setMetadataStore(omeMeta)
    reader.setId(fullpath)
    default_options = "stack_order=XYCZT color_mode=Composite view=Hyperstack specify_range c_begin=" + \
        str(nucleus_channel) + " c_end=" + str(nucleus_channel) + \
        " c_step=1 open=[" + fullpath + "]"
    NbStack = reader.getSizeZ()
    reader.close()
    output = re.sub('.ids', '.csv', infile)
    with open(os.path.join(folder5, output), 'wb') as outfile:
        DETECTwriter = csv.writer(outfile, delimiter=',')
        DETECTwriter.writerow(
            ['spotID', 'roundID', 'X', 'Y', 'Z', 'QUALITY', 'SNR', 'INTENSITY'])
    rounds = NbStack // stacksize
    spotID = 1
    for roundid in xrange(1, rounds + 2):
        # Process stacksize by stacksize otherwise crash because too many spots
        Zstart = (stacksize * roundid - stacksize + 1)
        Zend = (stacksize * roundid)
        if(Zend > NbStack):
            Zend = NbStack % stacksize + (roundid - 1) * stacksize
        IJ.log("Round:" + str(roundid) + ' Zstart=' + str(Zstart) +
               ' Zend=' + str(Zend) + ' out of ' + str(NbStack))
        IJ.run("Bio-Formats Importer", default_options + " z_begin=" +
               str(Zstart) + " z_end=" + str(Zend) + " z_step=1")
        imp = IJ.getImage()
        imp.show()
        cal = imp.getCalibration()
        model = Model()
        settings = Settings()
        settings.setFrom(imp)
        # Configure detector - Manually determined as best
        settings.detectorFactory = LogDetectorFactory()
        settings.detectorSettings = {
            'DO_SUBPIXEL_LOCALIZATION': True,
            'RADIUS': 5.5,
            'TARGET_CHANNEL': 1,
            'THRESHOLD': 50.0,
            'DO_MEDIAN_FILTERING': False,
        }
        filter1 = FeatureFilter('QUALITY', 1, True)
        settings.addSpotFilter(filter1)
        settings.addSpotAnalyzerFactory(SpotIntensityAnalyzerFactory())
        settings.addSpotAnalyzerFactory(SpotContrastAndSNRAnalyzerFactory())
        settings.trackerFactory = SparseLAPTrackerFactory()
        settings.trackerSettings = LAPUtils.getDefaultLAPSettingsMap()

        trackmate = TrackMate(model, settings)
        ok = trackmate.checkInput()
        if not ok:
            sys.exit(str(trackmate.getErrorMessage()))
        try:
            ok = trackmate.process()
        except:
            IJ.log("Nothing detected, Round:" + str(roundid) + ' Zstart=' +
                   str(Zstart) + ' Zend=' + str(Zend) + ' out of ' + str(NbStack))
            IJ.selectWindow(infile)
            IJ.run('Close')
            continue
        else:
            if animation:
                # For plotting purpose only
                imp.setPosition(1, 1, imp.getNFrames())
                imp.getProcessor().setMinAndMax(0, 4000)
                selectionModel = SelectionModel(model)
                displayer = HyperStackDisplayer(model, selectionModel, imp)
                displayer.render()
                displayer.refresh()
                for i in xrange(1, imp.getNSlices() + 1):
                    imp.setSlice(i)
                    time.sleep(0.05)
            IJ.selectWindow(infile)
            IJ.run('Close')
            spots = model.getSpots()
            spotIt = spots.iterator(0, False)
            sid = []
            sroundid = []
            x = []
            y = []
            z = []
            q = []
            snr = []
            intensity = []
            for spot in spotIt:
                sid.append(spotID)
                spotID = spotID + 1
                sroundid.append(roundid)
                x.append(spot.getFeature('POSITION_X'))
                y.append(spot.getFeature('POSITION_Y'))
                q.append(spot.getFeature('QUALITY'))
                snr.append(spot.getFeature('SNR'))
                intensity.append(spot.getFeature('MEAN_INTENSITY'))
                # Correct Z position
                correct_z = spot.getFeature(
                    'POSITION_Z') + (roundid - 1) * float(stacksize) * cal.pixelDepth
                z.append(correct_z)
            with open(os.path.join(folder5, output), 'ab') as outfile:
                DETECTwriter = csv.writer(outfile, delimiter=',')
                Sdata = zip(sid, sroundid, x, y, z, q, snr, intensity)
                for Srow in Sdata:
                    DETECTwriter.writerow(Srow)
Example #11
0
@String(label="Image Extension", style="", value=".dm3") str_img_ext
@String(label="Saturation", style="", value="0.25") str_sat
@Boolean(label="Close all first", value=False) do_close
"""
test_load_image_bioformats.py

Test a wrapper function to load images using BioFormats

"""
# read in and display ImagePlus object(s)
from loci.plugins import BF
from loci.formats import ImageReader
from loci.formats import MetadataTools
from ij import IJ
from ome.units import UNITS

if do_close:
	IJ.run("Close All")

file = str_dir + "/" + str_img_nam + str_img_ext
imps = BF.openImagePlus(file)
for imp in imps:
	imp.setTitle(str_img_nam)
	imp.show()
	IJ.run("Enhance Contrast", "saturated=" + str_sat);
	reader = ImageReader()
	omeMeta = MetadataTools.createOMEXMLMetadata()
	reader.setMetadataStore(omeMeta)
	reader.setId(file)
	seriesCount = reader.getSeriesCount()
	reader.close()