58f787640ea77f16c8f6d4481693a83ec9ef647b vsmalladi Tue May 8 10:29:52 2012 -0700 First step in python lib reogranization. Redmine #7029. diff --git python/lib/ucscGb/mdb.py python/lib/ucscGb/mdb.py deleted file mode 100644 index 5c53cc5..0000000 --- python/lib/ucscGb/mdb.py +++ /dev/null @@ -1,182 +0,0 @@ -from ucscgenomics import ra, ordereddict, encode - -class MdbFile(ra.RaFile): - ''' - This should be used for all files in the metaDb, since they extend RaFile - with useful functionality specific to metaDb ra files. - ''' - - @property - def name(self): - return self.compositeStanza['metaObject'] - - @property - def expVars(self): - '''the experimental variables used in this track''' - try: - return self._expVars - except AttributeError: - self._expVars = self.compositeStanza['expVars'].split(',') - return self._expVars - - @property - def dataType(self): - '''The data type of the experiment. 'None' if inconsistent.''' - try: - return self._dataType - except AttributeError: - self._dataType = None - for e in self.experiments.itervalues(): - if self._dataType == None and e.dataType != None: - self._dataType = e.dataType - elif self._dataType != e.dataType or e.dataType == None: - self._dataType = None - break - return self._dataType - - @property - def compositeStanza(self): - '''the stanza (typically first in file) describing the composite''' - try: - return self._compositeStanza - except AttributeError: - self._compositeStanza = self.filter(lambda s: s['objType'] == 'composite', lambda s: s) - if len(self._compositeStanza) != 1: - raise KeyError(self.filename) - else: - self._compositeStanza = self._compositeStanza[0] - return self._compositeStanza - - @property - def experiments(self): - '''dictionary of MdbExp objects indexed by the expId''' - try: - return self._experiments - except AttributeError: - self._experiments = dict() - exps = self.filter(lambda s: s['objType'] != 'composite', lambda s: (s['expId'], s)) - stanzas = dict() - for k, v in exps: - if k not in stanzas: - stanzas[k] = list() - stanzas[k].append(v) - for id in stanzas.iterkeys(): - self._experiments[id] = MdbExp(id, self, stanzas[id]) - return self._experiments - - def __init__(self, filepath): - ra.RaFile.__init__(self) - self.read(filepath) - - def readStanza(self, stanza, key=None): - entry = MdbStanza(self) - if entry.readStanza(stanza, key) == None: - return None, None, None - val1, val2 = entry.readStanza(stanza, key) - return val1, val2, entry - - def expIdRange(self, expIds): - ''' - Takes in a list of strings, and returns a list containing the - valid range of expId keys that the inputted range encompasses. - ''' - ids = dict() - tempids = list() - for id in expIds: - if '-' in id: - start, end = id.split('-', 1) - tempids.extend(range(int(start), int(end) + 1)) - else: - tempids.append(int(id)) - for id in tempids: - if str(id) in self.experiments.keys(): - ids.append(str(id)) - return ids - -class MdbStanza(ra.RaStanza): - - @property - def title(self): - '''The expVars catted together, making the title used for GEO''' - try: - return self._title - except AttributeError: - expVars = self._parent.expVars - if expVars[0] in self: - self._title = self[expVars[0]].replace('-m', '') - else: - self._title = None - for expVar in expVars[1:len(expVars)]: - if expVar in self and self[expVar] != 'None': - self._title += '_' + self[expVar] - return self._title - - def __init__(self, parent): - ra.RaStanza.__init__(self) - self._parent = parent - - def __setitem__(self, key, value): - ordereddict.OrderedDict.__setitem__(self, key, value) - ordereddict.OrderedDict.sort(self) - ordereddict.OrderedDict.reorder(self, 0, 'metaObject') - ordereddict.OrderedDict.reorder(self, 1, 'objType') - -class MdbExp(list): - ''' - Describes a single experiment ID, which has a collection of its stanzas as - well as some additional data that should typically be consistent across all - the stanzas, as well as verifying that the data is in fact consistent. - ''' - - @property - def name(self): - return self._id - - @property - def title(self): - try: - return self._title - except AttributeError: - self._title = None - for s in self.normalStanzas: - if self._title == None: - self._title = s.title - elif self._title != s.title: - self._title = None - break - return self._title - - @property - def dataType(self): - '''The data type of the experiment. 'None' if inconsistent.''' - try: - return self._dataType - except AttributeError: - self._dataType = None - for s in self.normalStanzas: - if 'dataType' in s: - if self._dataType == None: - self._dataType = encode.dataTypes[s['dataType']] - elif self._dataType.name != s['dataType']: - self._dataType = None - break - return self._dataType - - @property - def normalStanzas(self): - '''Returns the list of stanzas without revoked items''' - try: - return self._normal - except AttributeError: - self._normal = list() - for s in self: - if 'objStatus' not in s: - self._normal.append(s) - return self._normal - - - def __init__(self, id, parent, stanzas): - list.__init__(self) - self.extend(stanzas) - self._id = id - self._parent = parent