def OnColocBasic(self, event): from PYME.Analysis.Colocalisation import correlationCoeffs, edtColoc voxelsize = [ 1e3 * self.image.mdh.getEntry('voxelsize.x'), 1e3 * self.image.mdh.getEntry('voxelsize.y'), 1e3 * self.image.mdh.getEntry('voxelsize.z') ] try: names = self.image.mdh.getEntry('ChannelNames') except: names = ['Channel %d' % n for n in range(self.image.data.shape[3])] dlg = ColocSettingsDialog(self.dsviewer, voxelsize[0], names, show_bins=False) dlg.ShowModal() chans = dlg.GetChans() dlg.Destroy() #assume we have exactly 2 channels #FIXME - add a selector #grab image data imA = self.image.data[:, :, :, chans[0]].squeeze() imB = self.image.data[:, :, :, chans[1]].squeeze() #assume threshold is half the colour bounds - good if using threshold mode tA = self.do.Offs[chans[0]] + .5 / self.do.Gains[ chans[0]] #pylab.mean(self.ivps[0].clim) tB = self.do.Offs[chans[1]] + .5 / self.do.Gains[ chans[1]] #pylab.mean(self.ivps[0].clim) nameA = names[chans[0]] nameB = names[chans[1]] print('Calculating Pearson and Manders coefficients ...') pearson = correlationCoeffs.pearson(imA, imB) MA, MB = correlationCoeffs.thresholdedManders(imA, imB, tA, tB) mutual_information = correlationCoeffs.mutual_information(imA, imB) I1 = imA.ravel() I2 = imB.ravel() h1 = np.histogram2d(np.clip(I1 / I1.mean(), 0, 100), np.clip(I2 / I2.mean(), 0, 100), 200) pylab.figure() pylab.figtext( .1, .95, 'Pearson: %2.2f M1: %2.2f M2: %2.2f MI: %2.3f' % (pearson, MA, MB, mutual_information)) pylab.subplot(111) pylab.imshow(np.log10(h1[0] + .1).T) pylab.xlabel('%s' % nameA) pylab.ylabel('%s' % nameB) pylab.show()
def OnColocBasic(self, event): from PYME.Analysis.Colocalisation import correlationCoeffs, edtColoc voxelsize = [1e3*self.image.mdh.getEntry('voxelsize.x') ,1e3*self.image.mdh.getEntry('voxelsize.y'), 1e3*self.image.mdh.getEntry('voxelsize.z')] try: names = self.image.mdh.getEntry('ChannelNames') except: names = ['Channel %d' % n for n in range(self.image.data.shape[3])] dlg = ColocSettingsDialog(self.dsviewer, voxelsize[0], names) dlg.ShowModal() bins = dlg.GetBins() chans = dlg.GetChans() dlg.Destroy() #assume we have exactly 2 channels #FIXME - add a selector #grab image data imA = self.image.data[:,:,:,chans[0]].squeeze() imB = self.image.data[:,:,:,chans[1]].squeeze() #assume threshold is half the colour bounds - good if using threshold mode tA = self.do.Offs[chans[0]] + .5/self.do.Gains[chans[0]] #pylab.mean(self.ivps[0].clim) tB = self.do.Offs[chans[1]] + .5/self.do.Gains[chans[1]] #pylab.mean(self.ivps[0].clim) nameA = names[chans[0]] nameB = names[chans[1]] voxelsize = voxelsize[:imA.ndim] #trunctate to number of dimensions print('Calculating Pearson and Manders coefficients ...') pearson = correlationCoeffs.pearson(imA, imB) MA, MB = correlationCoeffs.thresholdedManders(imA, imB, tA, tB) I1 = imA.ravel() I2 = imB.ravel() h1 = np.histogram2d(np.clip(I1/I1.mean(), 0, 100), np.clip(I2/I2.mean(), 0, 100), 200) pylab.figure() pylab.figtext(.1, .95, 'Pearson: %2.2f M1: %2.2f M2: %2.2f' % (pearson, MA, MB)) pylab.subplot(111) pylab.imshow(np.log10(h1[0] + .1).T) pylab.xlabel('%s' % nameA) pylab.ylabel('%s' % nameB) pylab.show()
def OnColoc(self, event=None, restrict_z=False, coloc_vs_z = False): from PYME.Analysis.Colocalisation import correlationCoeffs, edtColoc from scipy import interpolate voxelsize = self.image.voxelsize_nm names = self.image.names if not getattr(self.image, 'labels', None) is None: have_mask = True mask = (self.image.labels > 0.5).squeeze() else: have_mask = False mask = None if not restrict_z: dlg = ColocSettingsDialog(self.dsviewer, voxelsize[0], names, have_mask=have_mask) else: dlg = ColocSettingsDialog(self.dsviewer, voxelsize[0], names, have_mask=have_mask, z_size=self.image.data.shape[2]) dlg.ShowModal() bins = dlg.GetBins() chans = dlg.GetChans() use_mask = dlg.GetUseMask() zs, ze = (0, self.image.data.shape[2]) if (self.image.data.shape[2] > 1) and restrict_z: zs, ze = dlg.GetZrange() zs,ze = (0,1) if self.image.data.shape[2] > 1: zs,ze = dlg.GetZrange() dlg.Destroy() print('Use mask: %s' % use_mask) if not use_mask: mask=None #assume we have exactly 2 channels #FIXME - add a selector #grab image data imA = self.image.data[:,:,zs:ze,chans[0]].squeeze() imB = self.image.data[:,:,zs:ze,chans[1]].squeeze() #assume threshold is half the colour bounds - good if using threshold mode tA = self.do.Offs[chans[0]] + .5/self.do.Gains[chans[0]] #plt.mean(self.ivps[0].clim) tB = self.do.Offs[chans[1]] + .5/self.do.Gains[chans[1]] #plt.mean(self.ivps[0].clim) nameA = names[chans[0]] nameB = names[chans[1]] voxelsize = voxelsize[:imA.ndim] #trunctate to number of dimensions print('Calculating Pearson and Manders coefficients ...') pearson = correlationCoeffs.pearson(imA, imB, roi_mask=mask) MA, MB = correlationCoeffs.thresholdedManders(imA, imB, tA, tB, roi_mask=mask) if coloc_vs_z: MAzs, MBzs = ([],[]) FAzs, FBzs = ([],[]) if self.image.data.shape[2] > 1: for z in range(self.image.data.shape[2]): imAz = self.image.data[:,:,z,chans[0]].squeeze() imBz = self.image.data[:,:,z,chans[1]].squeeze() MAz, MBz = correlationCoeffs.thresholdedManders(imAz, imBz, tA, tB) FAz, FBz = correlationCoeffs.maskFractions(imAz, imBz, tA, tB) MAzs.append(MAz) MBzs.append(MBz) FAzs.append(FAz) FBzs.append(FBz) print("M(A->B) %s" % MAzs) print("M(B->A) %s" % MBzs) print("Species A: %s, Species B: %s" %(nameA,nameB)) plt.figure() plt.subplot(211) if 'filename' in self.image.__dict__: plt.title(self.image.filename) # nameB with nameA cAB, = plt.plot(MAzs,'o', label = '%s with %s' %(nameB,nameA)) # nameA with nameB cBA, = plt.plot(MBzs,'*', label = '%s with %s' %(nameA,nameB)) plt.legend([cBA,cAB]) plt.xlabel('z slice level') plt.ylabel('Manders coloc fraction') plt.ylim(0,None) plt.subplot(212) if 'filename' in self.image.__dict__: plt.title(self.image.filename) # nameB with nameA fA, = plt.plot(FAzs,'o', label = '%s mask fraction' %(nameA)) # nameA with nameB fB, = plt.plot(FBzs,'*', label = '%s mask fraction' %(nameB)) plt.legend([fA,fB]) plt.xlabel('z slice level') plt.ylabel('Mask fraction') plt.ylim(0,None) plt.show() print('Performing distance transform ...') #bnA, bmA, binsA = edtColoc.imageDensityAtDistance(imB, imA > tA, voxelsize, bins, roi_mask=mask) #bnAA, bmAA, binsA = edtColoc.imageDensityAtDistance(imA, imA > tA, voxelsize, bins, roi_mask=mask) bins_, enrichment_BA, enclosed_BA, enclosed_area_A = edtColoc.image_enrichment_and_fraction_at_distance(imB, imA > tA, voxelsize, bins, roi_mask=mask) bins_, enrichment_AA, enclosed_AA, _ = edtColoc.image_enrichment_and_fraction_at_distance(imA, imA > tA, voxelsize, bins, roi_mask=mask) print('Performing distance transform (reversed) ...') #bnB, bmB, binsB = edtColoc.imageDensityAtDistance(imA, imB > tB, voxelsize, bins, roi_mask=mask) #bnBB, bmBB, binsB = edtColoc.imageDensityAtDistance(imB, imB > tB, voxelsize, bins, roi_mask=mask) bins_, enrichment_AB, enclosed_AB, enclosed_area_B = edtColoc.image_enrichment_and_fraction_at_distance(imA, imB > tB, voxelsize, bins, roi_mask=mask) bins_, enrichment_BB, enclosed_BB, _ = edtColoc.image_enrichment_and_fraction_at_distance(imB, imB > tB, voxelsize, bins, roi_mask=mask) #print binsB, bmB plots = [] pnames = [] # B from mA #################### plots_ = {} #plots_['Frac. %s from mask(%s)' % (nameB, nameA)] = plots.append(enclosed_BA.reshape(-1, 1, 1)) pnames.append('Frac. %s from mask(%s)' % (nameB, nameA)) plots.append(enrichment_BA.reshape(-1, 1, 1)) pnames.append('Enrichment of %s at distance from mask(%s)' % (nameB, nameA)) edtColoc.plot_image_dist_coloc_figure(bins_, enrichment_BA, enrichment_AA, enclosed_BA, enclosed_AA, enclosed_area_A, pearson, MA, MB, nameA, nameB) plots.append(enclosed_AB.reshape(-1, 1, 1)) pnames.append('Frac. %s from mask(%s)' % (nameA, nameB)) plots.append(enrichment_AB.reshape(-1, 1, 1)) pnames.append('Enrichment of %s at distance from mask(%s)' % (nameA, nameB)) edtColoc.plot_image_dist_coloc_figure(bins_, enrichment_AB, enrichment_BB, enclosed_AB, enclosed_BB, enclosed_area_B, pearson, MA, MB, nameB, nameA) plt.show() im = ImageStack(plots, titleStub='Radial Distribution') im.xvals = bins[:-1] im.xlabel = 'Distance [nm]' im.ylabel = 'Fraction' im.defaultExt = '.txt' im.mdh['voxelsize.x'] = (bins[1] - bins[0])*1e-3 im.mdh['ChannelNames'] = pnames im.mdh['Profile.XValues'] = im.xvals im.mdh['Profile.XLabel'] = im.xlabel im.mdh['Profile.YLabel'] = im.ylabel im.mdh['Colocalisation.Channels'] = names im.mdh['Colocalisation.Thresholds'] = [tA, tB] im.mdh['Colocalisation.Pearson'] = pearson im.mdh['Colocalisation.Manders'] = [MA, MB] try: im.mdh['Colocalisation.ThresholdMode'] = self.do.ThreshMode except: pass im.mdh['OriginalImage'] = self.image.filename ViewIm3D(im, mode='graph')
def OnColoc(self, event): from PYME.Analysis.Colocalisation import correlationCoeffs, edtColoc voxelsize = [1e3*self.image.mdh.getEntry('voxelsize.x') ,1e3*self.image.mdh.getEntry('voxelsize.y'), 1e3*self.image.mdh.getEntry('voxelsize.z')] try: names = self.image.mdh.getEntry('ChannelNames') except: names = ['Channel %d' % n for n in range(self.image.data.shape[3])] dlg = ColocSettingsDialog(self.dsviewer, voxelsize[0], names) dlg.ShowModal() bins = dlg.GetBins() chans = dlg.GetChans() dlg.Destroy() #assume we have exactly 2 channels #FIXME - add a selector #grab image data imA = self.image.data[:,:,:,chans[0]].squeeze() imB = self.image.data[:,:,:,chans[1]].squeeze() #assume threshold is half the colour bounds - good if using threshold mode tA = self.do.Offs[chans[0]] + .5/self.do.Gains[chans[0]] #pylab.mean(self.ivps[0].clim) tB = self.do.Offs[chans[1]] + .5/self.do.Gains[chans[1]] #pylab.mean(self.ivps[0].clim) nameA = names[chans[0]] nameB = names[chans[1]] voxelsize = voxelsize[:imA.ndim] #trunctate to number of dimensions print('Calculating Pearson and Manders coefficients ...') pearson = correlationCoeffs.pearson(imA, imB) MA, MB = correlationCoeffs.thresholdedManders(imA, imB, tA, tB) print('Performing distance transform ...') bnA, bmA, binsA = edtColoc.imageDensityAtDistance(imB, imA > tA, voxelsize, bins) print('Performing distance transform (reversed) ...') bnB, bmB, binsB = edtColoc.imageDensityAtDistance(imA, imB > tB, voxelsize, bins) #print binsB, bmB plots = [] pnames = [] pylab.figure() pylab.figtext(.1, .95, 'Pearson: %2.2f M1: %2.2f M2: %2.2f' % (pearson, MA, MB)) pylab.subplot(211) p = bmA/bmA.sum() #print p pylab.bar(binsA[:-1], p, binsA[1] - binsA[0]) pylab.xlabel('Distance from edge of %s [nm]' % nameA) pylab.ylabel('Density of %s' % nameB) plots.append(p.reshape(-1, 1,1)) pnames.append('Dens. %s from %s' % (nameB, nameA)) pylab.subplot(212) p = bmB/bmB.sum() pylab.bar(binsB[:-1], p, binsB[1] - binsB[0]) pylab.xlabel('Distance from edge of %s [nm]' % nameB) pylab.ylabel('Density of %s' % nameA) plots.append(p.reshape(-1, 1,1)) pnames.append('Dens. %s from %s' % (nameA, nameB)) pylab.figure() pylab.figtext(.1, .95, 'Pearson: %2.2f M1: %2.2f M2: %2.2f' % (pearson, MA, MB)) pylab.subplot(211) fA = bmA*bnA p = fA/fA.sum() pylab.bar(binsA[:-1], p, binsA[1] - binsA[0]) pylab.xlabel('Distance from edge of %s [nm]' % nameA) pylab.ylabel('Fraction of %s' % nameB) plots.append(p.reshape(-1, 1,1)) pnames.append('Frac. %s from %s' % (nameB, nameA)) pylab.subplot(212) fB = bmB*bnB p = fB/fB.sum() pylab.bar(binsB[:-1], p, binsB[1] - binsB[0]) pylab.xlabel('Distance from edge of %s [nm]' % nameB) pylab.ylabel('Fraction of %s' % nameA) plots.append(p.reshape(-1, 1,1)) pnames.append('Frac. %s from %s' % (nameA, nameB)) pylab.show() im = ImageStack(plots, titleStub='Radial Distribution') im.xvals = bins[:-1] im.xlabel = 'Distance [nm]' im.ylabel = 'Fraction' im.defaultExt = '.txt' im.mdh['voxelsize.x'] = (bins[1] - bins[0])*1e-3 im.mdh['ChannelNames'] = pnames im.mdh['Profile.XValues'] = im.xvals im.mdh['Profile.XLabel'] = im.xlabel im.mdh['Profile.YLabel'] = im.ylabel im.mdh['Colocalisation.Channels'] = names im.mdh['Colocalisation.Thresholds'] = [tA, tB] im.mdh['Colocalisation.Pearson'] = pearson im.mdh['Colocalisation.Manders'] = [MA, MB] im.mdh['OriginalImage'] = self.image.filename ViewIm3D(im, mode='graph')