Example #1
0
PATH = '/CercalSystem/'
CERCDB = PSDB(URL, PATH)

def getVaric(iid):
	df = CERCDB.getFile(iid)
	doc = deserialize(df)
	var = doc.getElements('Fiducial', {"Style":"spheres"})
	return var

records =  CERCDB.get(PATH)
doc = nmpml.blankDocument()
for rec in records:
	if 'afferent' in rec['metadata']['anatomy_type']:
		iid = rec['id']
		print iid
		els = getVaric(iid)
		if not els:
			print("warning, no varicosities in record %s. Skipping record" % iid)
			continue
		elif len(els)>1:
			print("warning, duplicate varicosities in record %s. Using first element" % (iid,))
		el = els[0]
		el.sever()
		el.setName("v"+iid)
		metas = CERCDB.getInfo(iid)['metadata']
		for k in metas:
			el.setAttrib('meta_'+k, metas[k])
		doc.newElement(el)
io.write(doc, 'varric.mat', format='.mat')

Example #2
0
class DBTool(BaseGui):
    def __init__(self, parent, **opts):
        BaseGui.__init__(self, parent, title="Database Tool", menus=["Connection", "Get", "Put"], pycommand=True)

        controls = [
            ["Connection", "Choose Data Store", self.selectDB],
            ["Get", "List All Entries", self.list],
            ["Get", "Show Details", self.infoprint],
            ["Get", "Search", self.do_search],
            ["Get", "Download Single File", self.download],
            ["Get", "Download Several Files", self.downloadGroup],
            ["Put", "Upload Current File", self.upload],
        ]
        self.fillMenus(controls)
        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.main.SetSizer(self.mainSizer)
        self.main.SetAutoLayout(True)
        self.SetAutoLayout(True)
        self.mainSizer.Add(wx.StaticText(self.main, -1, "Connected To:"), 1, wx.GROW | wx.ALL | wx.ALIGN_CENTRE, 5)
        self.dbid = wx.StaticText(self.main, -1, "")
        self.mainSizer.Add(self.dbid, 1, wx.GROW | wx.ALL | wx.ALIGN_CENTRE, 5)
        self.dbreccount = wx.StaticText(self.main, -1, "0 Records")
        self.mainSizer.Add(self.dbreccount, 1, wx.GROW | wx.ALL | wx.ALIGN_CENTRE, 5)
        self.selectDB(None, URLS[0], "/CercalSystem/")
        self.doc = self.Parent.document
        self.SetSize(wx.Size(500, 200))

    def getMetas(self):
        conflict = []
        metas = {}
        for e in self.doc.elements:
            m = dict([(k[5:], e.attrib(k)) for k in e.attributes if k.startswith("meta_")])
            for k in m:
                if k in conflict:
                    continue
                elif not k in metas:
                    metas[k] = m[k]
                elif metas[k] != m[k]:
                    del (metas[k])
                    conflict.append(k)
        return metas

    def classList(self, url):
        z = Resource(url)
        d = z.get("/Class/")
        cl = ["/" + a["id"] + "/" for a in d if not a.get("core")]
        return cl

    def selectDB(self, event, url=None, clas="/CercalSystem/"):
        if not url:
            if len(URLS) == 1:
                self.report("Only one datastore available. Using it")
                url = URLS[0]
            else:
                d = self.askParam([{"Name": "Select Database Site", "Type": "List", "Value": URLS}])
                if not d:
                    return
                url = d[0]
        if not clas or type(clas) == int:
            cl = self.classList(url)
            if len(cl) == 1:
                clas = cl[0]
            elif type(clas) == int:
                clas = cl[clas]
            else:
                d = self.askParam([{"Name": "Select Database Table", "Type": "List", "Value": cl}])
                if not d:
                    return
                clas = d[0]
        self.rest = PSDB(url, clas)
        self.dbid.SetLabel("%s%s" % (url, clas))
        n = len(self.list(None))
        self.dbreccount.SetLabel("%i records" % n)

    def list(self, event):
        ids = self.rest.getIDList()
        if event == None:
            return ids
        self.report("\n".join(ids))

    def upload(self, event):
        groups = self.doc.getElements("Group")
        groups = [g for g in groups if g.attrib("DBrecord")]
        if any(groups):
            self.report("found existing records. Committing them to the DB")
            for g in groups:
                self.report(g.name())
                self.upload_group(g)
        else:
            self.report("no existing DB groups. Uploading whole file as new record")
            self.upload_doc()

    def upload_group(self, g):
        m = dict([(k[5:], g.attrib(k)) for k in g.attributes if k.startswith("meta_")])
        name = g.name()
        self.do_upload(name, g, m)

    def upload_doc(self):
        m = self.getMetas()
        name = "%s_%s_%s" % (m["length"][0].upper(), str(m["class"]), str(m["slide_number"]))
        self.do_upload(name, self.doc, m)

    def do_upload(self, name, doc, meta):
        name = name.replace(".", "_")
        s = serialize(None, doc)
        self.rest.addOrUpdate(name, meta, s)
        self.report("sent")

    def infoprint(self, event):
        ids = self.list(None)
        d = self.askParam([{"Name": "Which Record?", "Type": "List", "Value": ids}])
        if not d:
            return
        print self.rest.getInfo(d[0])

    def do_search(self, event):
        j = self.rest.get(self.rest.path)
        import ccbcv.yogo

        reload(ccbcv.yogo)
        s = ccbcv.yogo.SearchGui(self, j)

    def download(self, event=None, record=None, append=True, refresh=True):
        if not record:
            ids = self.list(None)
            d = self.askParam([{"Name": "Which Record?", "Type": "List", "Value": ids}])
            if not d:
                return
            record = d[0]
        df = self.rest.getFile(record)
        doc = deserialize(df)
        if not append:
            self.Parent.newDoc(doc)
        else:
            m = self.rest.getInfo(record)["metadata"]
            m = dict([("meta_" + k, m[k]) for k in m])
            m["Name"] = record
            m["DBrecord"] = self.rest.path
            m["DBurl"] = self.rest.url
            m["color"] = (255, 255, 255)
            group = createElement("Group", m)
            self.Parent.document.newElement(group)
            for e in doc.elements[:]:
                e.move(group)
            if refresh:
                self.Parent.update_all(element=self.Parent.document, action="rebuild")

    def downloadGroup(self, event=None, records=None):
        if not records:
            ids = self.list(None)
            d = self.askParam([{"Name": "Which Record?", "Type": "Select", "Value": ids}])
            if not d:
                return
            records = d[0]
        for r in records:
            self.download(None, r, True, False)
        self.Parent.update_all(element=self.Parent.document, action="rebuild")