from fluents import dataset _dim_annotation_handlers = {} def get_dim_annotations(dimname, annotation, ids): """Returns a list of annotations corresponding to the given ids in dimension dimname""" global _dim_annotation_handlers if _dim_annotation_handlers.has_key(dimname): return _dim_annotation_handlers[dimname].get_annotations(annotation, ids) return None def set_dim_handler(dimname, handler): """Set the handler for the given dimension.""" global _dim_annotation_handlers _dim_annotation_handlers[dimname] = handler def get_dim_handler(dimname): """Get the handler for the given dimension.""" global _dim_annotation_handlers if _dim_annotation_handlers.has_key(dimname): return _dim_annotation_handlers[dimname] else: return None class AnnotationHandler: def __init__(self): pass def get_annotations(self, annotationname, ids, default=None): return None def get_annotation_names(self): return [] class DictAnnotationHandler(AnnotationHandler): def __init__(self, d={}): self._dict = d def get_annotations(self, annotationname, ids, default=None): d = self._dict retval = [] for id in ids: if d[annotationname].has_key(id): retval.append(d[annotationname][id]) else: retval.append(default) return retval def add_annotations(self, annotationname, d): self._dict[annotationname] = d def get_annotation_names(self): return self._dict.keys() def read_annotations_file(filename): """Read annotations from file. Reads annotations from a tab delimited file of the format:: dimname annotation_name1 annotation_name2 ... id1 Foo 0.43 id2 Bar 0.59 """ ann = DictAnnotationHandler() dimname = None annotation_dicts = [] annotation_names = [] fd = open(filename) ## Read the first line, which contains the dimension name and ## annotation names. line = fd.readline() values = [x.strip() for x in line.split('\t')] dimname = values[0] annotation_names = values[1:] annotation_dicts = [{} for x in annotation_names] ## Read the lines containing the annotations. The first value on ## each line is an id along the dimension. while line: values = [x.strip() for x in line.split('\t')] for i, x in enumerate(values[1:]): annotation_dicts[i][values[0]] = x line = fd.readline() fd.close() ## Add everything to the annotation object and add the object to ## the specified dimension. for i, a in enumerate(annotation_names): ann.add_annotations(a, annotation_dicts[i]) _dim_annotation_handlers[dimname] = ann return ann