Skip to content

Instantly share code, notes, and snippets.

@lozybean
Created August 29, 2017 05:10
Show Gist options
  • Save lozybean/196fdc995d78a5e0e37e432ce93a29a5 to your computer and use it in GitHub Desktop.
Save lozybean/196fdc995d78a5e0e37e432ce93a29a5 to your computer and use it in GitHub Desktop.
variant record normalization
class VariantRecord(object):
def __init__(self, chrom, pos, ref, alt,
ref_genome=ref_genome):
self.chrom = chrom
self.pos = int(pos)
self.ref = ref
self.alt = alt
if isinstance(ref_genome, RefGenome):
self.ref_genome = ref_genome
else:
self.ref_genome = RefGenome(ref_genome)
self.id = id
@staticmethod
def is_empty(allele):
if allele is None or allele == '-' or allele == '.' or allele == '':
return True
return False
def is_single(self):
if len(self.ref) == 1 or len(self.alt) == 1:
return True
return False
def fill_empty(self):
if self.is_empty(self.ref):
self.pos -= 1
prev_base = self.ref_genome.base(self.chrom, self.pos)
self.ref = prev_base
self.alt = prev_base + self.alt
if self.is_empty(self.alt):
self.pos -= 1
prev_base = self.ref_genome.base(self.chrom, self.pos)
self.ref = prev_base + self.ref
self.alt = prev_base
def left_alignment(self):
while self.alt[-1] == self.ref[-1]:
self.pos -= 1
prev_base = self.ref_genome.base(self.chrom, self.pos)
def slide(allele):
return prev_base + allele[:-1]
self.ref = slide(self.ref)
self.alt = slide(self.alt)
def parsimony(self, strand='left'):
if strand == 'right':
while self.ref[-1] == self.alt[-1] and not self.is_single():
self.ref = self.ref[:-1]
self.alt = self.alt[:-1]
if strand == 'left':
while self.ref[0] == self.alt[0] and not self.is_single():
self.ref = self.ref[1:]
self.alt = self.alt[1:]
self.pos += 1
def normalization(self):
if self.style not in ['snp', 'ref']:
self.fill_empty()
self.left_alignment()
self.parsimony()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment