1 """Standardize reading and writing fastq submission names.
5 PAIRED_TEMPLATE = '{lib_id}_{flowcell}_c{cycle}_l{lane}_r{read}.fastq'
6 SINGLE_TEMPLATE = '{lib_id}_{flowcell}_c{cycle}_l{lane}.fastq'
9 '(?P<lib_id>[^_]+)_(?P<flowcell>[^_]+)_'\
10 'c(?P<cycle>[\d]+)_l(?P<lane>[\d]+)(_r(?P<read>[\d]))?\.fastq')
12 class FastqName(collections.Mapping):
13 def __init__(self, is_paired=None, **kwargs):
14 self._attributes = ('flowcell', 'lib_id', 'lane', 'read', 'cycle')
15 self._is_paired = is_paired
19 if 'filename' in kwargs:
20 self._init_by_filename(**kwargs)
22 self._init_by_attributes(**kwargs)
24 def _init_by_attributes(self, **kwargs):
25 for k in self._attributes:
32 def _init_by_filename(self, filename):
33 match = FASTQ_RE.match(filename)
35 raise ValueError('Is "{0}" a submission fastq?'.format(filename))
37 for k in self._attributes:
38 self[k] = match.group(k)
40 def _get_is_paired(self):
41 if self._is_paired is None:
42 return getattr(self, 'read', None) is not None
44 return self._is_paired
45 def _set_is_paired(self, value):
46 self._is_paired = value
47 is_paired = property(_get_is_paired, _set_is_paired)
50 if self.is_paired and self['read'] is None:
59 is_valid = property(_is_valid)
61 def _get_filename(self):
64 "Please set all needed variables before generating a filename")
66 T = PAIRED_TEMPLATE if self.is_paired else SINGLE_TEMPLATE
67 return T.format(**self)
68 filename = property(_get_filename)
71 return iter(self._attributes)
73 def __getitem__(self, key):
74 return getattr(self, key, None)
76 def __setitem__(self, key, value):
77 if key in self._attributes:
78 setattr(self, key, value)
80 raise ValueError("Unrecognized key {0}".format(key))
83 return len([k for k in self if self[k] is not None])