def __init__(self, filename='', metadata=None, taskQueue=None): if filename is not '': self.filename = getFullExistingFilename( filename) #convert relative path to full path #use metadata for glob md = MetaDataHandler.SimpleMDHandler(self.filename) else: md = metadata self.filename = '' pattern = md.getEntry('SeriesPattern') self.files = glob.glob( os.path.join(os.path.split(self.filename)[0], pattern)) self.files.sort() f0 = self.files[0] if f0.endswith('.tif'): self.im0 = tifffile.imread(f0).squeeze() self._slice_shape = self.im0.shape[:2] else: self.im0 = Image.open(self.files[0]) self._slice_shape = self.im0.size[1], self.im0.size[0] #self.im.seek(0) #PIL's endedness support is subtly broken - try to fix it #NB this is untested for floating point tiffs self.endedness = 'LE' if self.im0.ifd.prefix == 'MM': self.endedness = 'BE' print((self.im0.ifd.prefix)) print((self.endedness))
def __init__(self, filename, taskQueue=None): self.filename = getFullExistingFilename( filename) #convert relative path to full path #self.data = readTiff.read3DTiff(self.filename) #use metadata for glob md = MetaDataHandler.SimpleMDHandler(self.filename) pattern = md.getEntry('SeriesPattern') self.files = glob.glob( os.path.join(os.path.split(self.filename)[0], pattern)) self.files.sort() self.im0 = Image.open(self.files[0]) #self.im.seek(0) #PIL's endedness support is subtly broken - try to fix it #NB this is untested for floating point tiffs self.endedness = 'LE' if self.im0.ifd.prefix == 'MM': self.endedness = 'BE' print((self.im0.ifd.prefix)) print((self.endedness))
def fromMDFile(cls, mdfile): """ Create a new fit test jig from a metadata file Parameters ---------- mdfile - string the filename of the metadata file to use. The file should be in PYMEs 'SimpleMDHandler' (*.md) format. Returns ------- fitTestJig instance """ return cls(MetaDataHandler.SimpleMDHandler(mdfile))
def fromMDFile(cls, mdfile): return cls(MetaDataHandler.SimpleMDHandler(mdfile))
def _findAndParseMetadata(self, filename): """Try and find and load a .xml or .md metadata file that might be ascociated with a given image filename. See the relevant metadatahandler classes for details.""" import xml.parsers.expat from PYME.IO import unifiedIO if not self.mdh is None: return #we already have metadata (probably passed in on command line) mdf = None xmlfn = os.path.splitext(filename)[0] + '.xml' xmlfnmc = os.path.splitext(filename)[0].split('__')[0] + '.xml' if os.path.exists(xmlfn): try: self.mdh = MetaDataHandler.NestedClassMDHandler( MetaData.TIRFDefault) self.mdh.copyEntriesFrom(MetaDataHandler.XMLMDHandler(xmlfn)) mdf = xmlfn except xml.parsers.expat.ExpatError: #fix for bug in which PYME .md was written with a .xml extension self.mdh = MetaDataHandler.NestedClassMDHandler( MetaData.BareBones) self.mdh.copyEntriesFrom( MetaDataHandler.SimpleMDHandler(xmlfn)) mdf = xmlfn elif os.path.exists( xmlfnmc): #this is a single colour channel of a pair self.mdh = MetaDataHandler.NestedClassMDHandler( MetaData.TIRFDefault) self.mdh.copyEntriesFrom(MetaDataHandler.XMLMDHandler(xmlfnmc)) mdf = xmlfnmc else: self.mdh = MetaDataHandler.NestedClassMDHandler(MetaData.BareBones) #check for simple metadata (python code with an .md extension which #fills a dictionary called md) mdfn = os.path.splitext(filename)[0] + '.md' jsonfn = os.path.splitext(filename)[0] + '.json' if os.path.exists(mdfn): self.mdh.copyEntriesFrom(MetaDataHandler.SimpleMDHandler(mdfn)) mdf = mdfn elif os.path.exists(jsonfn): import json with open(jsonfn, 'r') as f: mdd = json.load(f) self.mdh.update(mdd) elif filename.endswith('.lsm'): #read lsm metadata from PYME.contrib.gohlke.tifffile import TIFFfile tf = TIFFfile(filename) lsm_info = tf[0].cz_lsm_scan_information self.mdh['voxelsize.x'] = lsm_info['line_spacing'] self.mdh['voxelsize.y'] = lsm_info['line_spacing'] self.mdh['voxelsize.z'] = lsm_info['plane_spacing'] def lsm_pop(basename, dic): for k, v in dic.items(): if isinstance(v, list): #print k, v for i, l_i in enumerate(v): #print i, l_i, basename lsm_pop( basename + k + '.' + k[:-1] + '%i.' % i, l_i) else: self.mdh[basename + k] = v lsm_pop('LSM.', lsm_info) elif filename.endswith('.tif'): #look for OME data... from PYME.contrib.gohlke.tifffile import TIFFfile tf = TIFFfile(filename) if tf.is_ome: try: omemdh = MetaDataHandler.OMEXMLMDHandler( tf.pages[0].tags['image_description'].value) self.mdh.copyEntriesFrom(omemdh) except IndexError: pass elif filename.endswith('.dcimg'): #Bewersdorf lab Biplane # FIXME load seriesXX.json for seriesXX_chunkXX.dcimg files more elegantly jsonfn = filename[:-22] + '.json' import json try: mdd = json.loads(unifiedIO.read(jsonfn)) self.mdh.update(mdd) except IOError: pass elif filename.endswith('.dbl'): #Bewersdorf lab STED mdfn = filename[:-4] + '.txt' entrydict = {} try: #try to read in extra metadata if possible with unifiedIO.openFile(mdfn, 'r') as mf: for line in mf: s = line.split(':') if len(s) == 2: entrydict[s[0]] = s[1] except IOError: pass # vx, vy = entrydict['Pixel size (um)'].split('x') # self.mdh['voxelsize.x'] = float(vx) # self.mdh['voxelsize.y'] = float(vy) # self.mdh['voxelsize.z'] = 0.2 #FIXME for stacks ... # # sx, sy = entrydict['Image format'].split('x') # self.mdh['Camera.ROIWidth'] = int(sx) # self.mdh['Camera.ROIHeight'] = int(sy) # # self.mdh['NumImages'] = int(entrydict['# Images']) with unifiedIO.openFile(filename) as df: s = df.read(8) Z, X, Y, T = numpy.fromstring(s, '>u2') s = df.read(16) depth, width, height, elapsed = numpy.fromstring(s, '<f4') self.mdh['voxelsize.x'] = width / X self.mdh['voxelsize.y'] = height / Y self.mdh['voxelsize.z'] = depth self.mdh['Camera.ROIWidth'] = X self.mdh['Camera.ROIHeight'] = Y self.mdh['NumImages'] = Z * T def _sanitise_key(key): k = key.replace('#', 'Num') k = k.replace('(%)', '') k = k.replace('(', '') k = k.replace(')', '') k = k.replace('.', '') k = k.replace('/', '') k = k.replace('?', '') k = k.replace(' ', '') if not k[0].isalpha(): k = 's' + k return k for k, v in entrydict.items(): self.mdh['STED.%s' % _sanitise_key(k)] = v #else: #try bioformats # OMEXML = bioformats.get_omexml_metadata(filename).encode('utf8') # OMEmd = MetaDataHandler.OMEXMLMDHandler(OMEXML) # self.mdh.copyEntriesFrom(OMEmd) if self.haveGUI and not ('voxelsize.x' in self.mdh.keys() and 'voxelsize.y' in self.mdh.keys()): from PYME.DSView.voxSizeDialog import VoxSizeDialog dlg = VoxSizeDialog(None) dlg.ShowModal() self.mdh.setEntry('voxelsize.x', dlg.GetVoxX()) self.mdh.setEntry('voxelsize.y', dlg.GetVoxY()) self.mdh.setEntry('voxelsize.z', dlg.GetVoxZ()) return mdf