Beispiel #1
0
    def export_cb(self):
        def save(okay, dialog, self=self):
            if okay:
                paths = dialog.getPaths()
                if paths:
                    self.write_comma_separated_values(paths[0])

        from segment_dialog import current_segmentation
        seg = current_segmentation()
        if seg is None:
            idir = ifile = None
        elif hasattr(seg, 'path'):
            import os.path
            idir, ifile = os.path.split(seg.path)
            ifile = os.path.splitext(ifile)[0] + '.csv'
        else:
            import os.path
            idir = None
            ifile = os.path.splitext(seg.name)[0] + '.csv'

        from OpenSave import SaveModeless
        SaveModeless(title='Export Comma Separated Values',
                     initialdir=idir,
                     initialfile=ifile,
                     command=save)
Beispiel #2
0
    def Update(self):

        from segment_dialog import current_segmentation
        s = current_segmentation()
        if s is None:
            return

        rlist = self.filter_regions(s.regions)
        if rlist is None:
            return

        self.status('Table has %d regions from %s' % (len(rlist), s.name))

        self.add_columns()
        self.attribute_table.setData(rlist)
Beispiel #3
0
    def segmentation(self):

        import segment_dialog as sd
        s = sd.current_segmentation()
        if s is None and sd.segmentation_map():
            d = sd.volume_segmentation_dialog()
            s = d.Segment(group=False)
            for r in s.regions:
                r.set_color(self.ungrouped_color)
            v = s.volume_data()
            if v:
                v.display = False
        if s is None:
            print 'mouse down: no current segmentation'
            return None
        return s
Beispiel #4
0
    def add_columns(self):

        from segment_dialog import current_segmentation
        s = current_segmentation()
        if s is None:
            return

        k = set(self.computed_attributes.keys())
        for r in s.regions:
            k.update(r.attributes().keys())

        knew = list(k.difference(self.keys))
        kgone = self.keys.difference(k)
        if knew or kgone:
            t = self.attribute_table
            mreg = t.middleRow()
            knew.sort()
            for key in knew:
                self.add_column(key, refresh=False)
            for key in kgone:
                t.removeColumn(key, refresh=False)
            self.keys = k
            t.refresh(rebuild=True)
            t.showRow(mreg)  # TODO: Adding column loses scroll position.
Beispiel #5
0
    def Segment2(self):

        dmap = segmentation_map()
        if dmap == None:
            self.umsg("Please select a map in the Segment Map Dialog")
            return

        smod = current_segmentation()
        if smod == None:
            self.umsg(
                "Please select a Current Segmentation in the Segment Map dialog"
            )
            return

        print "Seg has %d regions" % (len(smod.regions))

        imod2 = self.GetMod("Icosahedron Faces")
        if imod2 == None:
            self.umsg("No Icosahedron2 model found")
            return

        sepRs = []
        for rstr in self.segRads.get().split(","):
            try:
                radv = float(rstr)
            except:
                self.umsg(
                    "Error parsing distances; enter only numbers and commas")
                return

            sepRs.append(radv)

        print "Sep rads:", sepRs
        regs = list(smod.regions)
        sregs = []

        f1 = dmap.data.ijk_to_xyz_transform
        from _contour import affine_transform_vertices as transform_vertices

        self.MakeTNorms(imod2)

        for i, srad in enumerate(sepRs):

            self.umsg("Segmenting using %s - rad %.1f - %d regs" %
                      (imod2.name, srad, len(regs)))
            self.updateIcos2(srad)

            gregs, left_regs = [], []

            for ri, r in enumerate(regs):

                p = r.max_point
                #pt = numpy.array ( [ [ p[2],p[1],p[0] ] ], numpy.float32 )
                pt = numpy.array([[p[2], p[1], p[0]]], numpy.float32)
                transform_vertices(pt, f1)

                c = r.center_of_points()
                ptc = numpy.array([c], numpy.float32)

                #print ri, p, c, pt[0]
                #return

                if self.PIsOutside(ptc[0], imod2):
                    #print " - outside"
                    left_regs.append(r)
                else:
                    #print " - inside"
                    gregs.append(r)

                if ri % 1000 == 0:
                    self.status("Segmenting using %s - rad %.1f - %s/%s regs" %
                                (imod2.name, srad, "{:,}".format(ri),
                                 "{:,}".format(len(regs))))

            sregs.append(gregs)
            regs = left_regs
            print " - rad %.1f - %d regions inside" % (srad, len(gregs))

        print " - remaining %d regions" % (len(regs))
        sregs.append(regs)

        for i, regs in enumerate(sregs):
            self.status("Segmenting, layer %d - %d regs" % (i, len(regs)))
            if len(regs) > 1:
                try:
                    smod.join_regions(regs)
                except:
                    self.umsg(
                        "An error occurred - regions may have changed - please start again."
                    )
                    smod.display_regions()
                    return

        smod.display_regions()

        self.umsg("Done, created %d groups based on radial distances" %
                  len(sregs))

        from segment_dialog import volume_segmentation_dialog
        volume_segmentation_dialog().ReportRegionCount(smod)
Beispiel #6
0
    def Segment(self):

        segMap = segmentation_map()
        if segMap == None:
            self.umsg("Please select a map in the Segment Map Dialog")
            return

        smod = current_segmentation()
        if smod == None:
            self.umsg(
                "Please select a Current Segmentation in the Segment Map dialog"
            )
            return

        print "Seg has %d regions" % (len(smod.regions))

        print "Seg rads:", self.segRads.get()

        if hasattr(self, 'distByReg'):
            print "Found distByReg"
        else:
            self.umsg("Make Histogram first.")
            return

        sepRs = []
        for rstr in self.segRads.get().split(","):
            try:
                radv = float(rstr)
            except:
                self.umsg(
                    "Error parsing distances; enter only numbers and commas")
                return

            sepRs.append(radv)
        sepRs.append(1e99)

        self.umsg("Segmenting...")

        print "Sep rads:", sepRs
        sregs = []
        for r in sepRs:
            sregs.append([])

        for reg, rad in self.distByReg.iteritems():
            #if reg.surface_piece != None :
            #    if reg.surface_piece.display == False :
            #        continue

            minRad = 0.0
            for i, maxRad in enumerate(sepRs):
                if rad > minRad and rad <= maxRad:
                    sregs[i].append(reg)
                    break

        for i, regs in enumerate(sregs):
            print "%d - %d regs" % (i, len(regs))
            if len(regs) > 1:
                try:
                    smod.join_regions(regs)
                except:
                    self.umsg(
                        "An error occurred - regions may have changed - please start again."
                    )
                    smod.display_regions()
                    return

        smod.display_regions()

        self.umsg("Done, created %d groups based on radial distances" %
                  len(sregs))

        from segment_dialog import volume_segmentation_dialog
        volume_segmentation_dialog().ReportRegionCount(smod)
Beispiel #7
0
    def MakeHist(self):

        segMap = segmentation_map()
        if segMap == None:
            self.umsg("Please select a map in the Segment Map Dialog")
            return

        import axes
        reload(axes)
        pts, weights = axes.map_points(segMap)
        print len(pts)

        COM, U, S, V = prAxes(pts)

        print " - COM : ", COM

        smod = current_segmentation()
        if smod == None:
            self.umsg(
                "Please select a Current Segmentation in the Segment Map dialog"
            )
            return

        print "Seg has %d regions" % (len(smod.regions))

        if hasattr(self, 'icos_vecs'):
            self.umsg("Making (icosahedrally corrected) histogram...")
        else:
            self.umsg("Making histogram...")

        nregs, last = len(smod.regions), 0
        regs = list(smod.regions)
        distByReg = {}
        for ri, r in enumerate(regs):

            if 0 and r.surface_piece != None:
                if r.surface_piece.display == False:
                    print "i" + ri,
                    continue
            try:
                p = r.center_of_points()
            except:
                print "+"
                continue

            rvec = chimera.Vector(p[0], p[1], p[2]) - chimera.Vector(
                COM[0], COM[1], COM[2])
            rad = 0.0

            if hasattr(self, 'icos_vecs'):
                for ivec in self.icos_vecs:
                    irad = ivec * rvec
                    if irad > rad:
                        rad = irad
            else:
                rad = rvec.length

            distByReg[r] = rad
            at = int(numpy.floor(10.0 * (ri + 1) / nregs))
            if at > last:
                #print at,
                if hasattr(self, 'icos_vecs'):
                    self.status(
                        "Making (icosahedrally corrected) histogram %d regions, at %d"
                        % (len(regs), ri + 1))
                else:
                    self.status("Making histogram %d regions, at %d" %
                                (len(regs), ri + 1))
                last = at
                at += 1

        print ""

        dists = distByReg.values()
        maxDist = max(dists) + 0.01
        minDist = min(dists)
        nbins = int(self.numBins.get())
        dr = (maxDist - minDist) / float(nbins)
        print "%d dists - max %.2f, min %.2f, nb %d, dr %.2f" % (
            len(dists), maxDist, minDist, nbins, dr)

        bins = []
        for i in range(nbins):
            bins.append([])

        print "bad bins: ",
        for regm, rad in distByReg.iteritems():
            bini = int(numpy.floor((rad - minDist) / dr))
            if bini >= len(bins):
                print bini,
                bini = len(bins) - 1
            bins[bini].append(regm)

        print ""

        if 0:
            f = open("rads.txt", "w")
            for k, regs in enumerate(bins):
                v = len(regs)
                vmin = minDist + k * dr
                vmax = minDist + (k + 1) * dr
                rm = .5 * (vmin + vmax)
                vn = v / (4 * 3.14 * rm * rm)
                f.write("%d\t%.2f\t%.2f\t%d\t%f\n" % (k, vmin, vmax, v, vn))
            f.close()

        self.distByReg = distByReg

        #print self.distByReg

        def save(okay, dialog):
            if okay:
                paths = dialog.getPaths()
                if paths:
                    path = paths[0]
                    self.umsg("Saved plot to: " + path)
                    f = open(path, "w")
                    for k, regs in enumerate(bins):
                        v = len(regs)
                        vmin = minDist + k * dr
                        vmax = minDist + (k + 1) * dr
                        rm = .5 * (vmin + vmax)
                        vn = v / (4 * 3.14 * rm * rm)
                        f.write("%.2f,%d\n" % (vmin, v))
                    f.close()

        from OpenSave import SaveModeless
        SaveModeless(title='Save Histogram',
                     filters=[('TXT', '*.txt', '.txt')],
                     initialfile="dist_hist.txt",
                     command=save)