1#!/usr/bin/env python2 2 3class RoiRecord(object): 4 """Represent one record in a ROI file.""" 5 6 def __init__(self, ref, start_pos, end_pos, region_name, region_length, 7 strand, max_count, data, points): 8 """Initialize RoiRecord.""" 9 self.ref = ref 10 self.start_pos = start_pos 11 self.end_pos = end_pos 12 self.strand = strand 13 self.region_length = region_length 14 self.region_name = region_name 15 self.max_count = max_count 16 self.data = data 17 self.points = points 18 19 def __str__(self): 20 return 'RoiRecord(%s, %s, %s, %s, %s, %s, %s, %s, len([...])==%s)' % \ 21 (repr(self.ref), self.start_pos, self.end_pos, 22 self.region_name, self.region_length, repr(self.strand), 23 self.max_count, self.data, len(self.points)) 24 def __repr__(self): 25 return self.__str__() 26 27 28def loadRoi(path, max_count=0): 29 """Load ROI file and return it as a list of RoiRecord objects. 30 31 NA values are translated to 0. 32 """ 33 data_keys = [] 34 result = [] 35 i = 0 36 with open(path, 'rb') as f: 37 for line in f: 38 if line.startswith('##'): 39 data_keys = line[2:].split('\t')[7:-1] 40 if line[0] == '#': 41 continue 42 if max_count > 0 and i >= max_count: 43 break 44 i += 1 45 vals = line.split() 46 region_length = int(vals[4]) 47 data = vals[7:-1] 48 points = [int(x) for x in vals[-1].split(',')] 49 r = RoiRecord(vals[0], int(vals[1]) - 1, int(vals[2]), vals[3], 50 region_length, vals[5], int(vals[6]), data, points) 51 result.append(r) 52 #print ' => Loaded %d records.' % len(result) 53 return data_keys, result 54