def _convert_variant_file_to_dict(varfile):
        """
        Converts tsv to dicts with this structure
        {
            'patient_1': {
                'variant-id': {
                    'build': 'hg19'
                    'chromosome': 'chr7',
                    'reference_allele': 'A',
                    'variant_allele': 'G',
                    'position': '1234',
                    'rs_id' : 'RS1234',
                    'type': 'SNV',
                    'genes_of_interest' : [SHH, BRCA1]
                }
            }
        }
        TODO the above structure can be simplified as it results
             in duplicated variant dicts, the join-by-id approach
             below would be an improvement:
        {
            'patient_1': {
                'variants': [variant-id1,variant-id2, 3, 4]
            }
            'variants : [
               'variant-id1': {
                    'build': hg19
                    'chromosome': 'chr7',
                    'reference_allele': 'A',
                    'variant_allele': 'G',
                    'position': '1234'
                    'rs_id' : 'RS1234',
                    'type': 'SNV",
                    'genes_of_interest' : [SHH, BRCA1]
                }
            ]
        }

        If any part of the core variant information is missing
        (build, chr, bp change(s), the line number will be used
        to make the variant unique

        Variant id will be used downstream to form blank nodes (checksumed)

        See docstring for _add_variant_gene_relationship for explanation
        on why there is a one to many mapping between variants and genes

        Values are normalized with these rules:
        1. Basepairs are upper case
        2. HG19 -> hg19
        3. X -> chrX
        :return: dict
        """
        patient_variant_map = {}
        # line_num = 0   note this is builtin to the reader as reader.line_num
        reader = csv.reader(varfile, delimiter="\t")
        col = [
            'patient', 'family', 'chromosome', 'build', 'position', 'reference_allele',
            'variant_allele', 'parent_of_origin', 'allele_type', 'mutation_type',
            'gene_symbol', 'transcript', 'reference_aa', 'variant_aa, aa_change',
            'segregates_with', 'locus', 'exon', 'inheritance_model', 'zygosity',
            'dbsnp_id', 'frequency', 'num_of_alleles'
        ]
        # row = next(reader)   # there is no header
        # if len(row) != len(col):
        #    LOG.error('Got:\n\t%s\nExpected:\n\t%s\n', row, col)
        #    raise TypeError('header does not match expected format')
        for row in reader:

            patient = row[col.index('patient')]
            # family,
            chromosome = row[col.index('chromosome')]
            build = row[col.index('build')]
            position = row[col.index('position')]
            reference_allele = row[col.index('reference_allele')]
            variant_allele = row[col.index('variant_allele')]
            # parent_of_origin,
            # allele_type,
            mutation_type = row[col.index('mutation_type')]
            gene_symbol = row[col.index('gene_symbol')]
            # transcript,
            # reference_aa,
            # variant_aa,
            # aa_change,
            # segregates_with,
            # locus,
            # exon,
            # inheritance_model,
            # zygosity,
            dbsnp_id = row[col.index('dbsnp_id')]
            # frequency,
            # num_of_alleles

            if patient not in patient_variant_map:
                patient_variant_map[patient] = {}

            formatted_chr = re.sub(r'^CHR', 'chr', chromosome, flags=re.I)

            if re.fullmatch(r'[XY]|[0-9]{1,2}', chromosome, flags=re.I):
                formatted_chr = "chr{0}".format(chromosome.upper())

            formatted_build = re.sub(r'^HG', 'hg', build, flags=re.I)
            ref_base = reference_allele.upper()
            var_base = variant_allele.upper()
            rs_id = ''

            # Catch misformatted data
            if re.search(r'LEFT FLANK|NM_|EXON', ref_base):
                ref_base = ''

            if re.search(r'LEFT FLANK|NM_|EXON', var_base):
                var_base = ''

            if dbsnp_id != '':
                match = re.fullmatch(r'^(rs\d+).*', dbsnp_id)
                if match:
                    rs_id = match.group(1)

            # Format variant object
            variant_info = [formatted_chr, formatted_build, position,
                            ref_base, var_base]

            if '' in variant_info:
                filt_list = [info for info in variant_info if info != '']
                variant_id = str(reader.line_num) + '-' + '-'.join(filt_list)
            else:
                variant_id = '-'.join(variant_info)

            if variant_id in patient_variant_map[patient]:
                patient_variant_map[patient][variant_id]['genes_of_interest'].append(
                    gene_symbol)
            else:
                patient_variant_map[patient][variant_id] = {
                    'build': formatted_build,
                    'position': position,
                    'chromosome': formatted_chr,
                    'reference_allele': ref_base,
                    'variant_allele': var_base,
                    'type': mutation_type,
                    'rs_id': ''
                }
                if rs_id:
                    patient_variant_map[patient][variant_id]['rs_id'] = rs_id

                patient_variant_map[patient][variant_id]['genes_of_interest']\
                    = [gene_symbol]

        return patient_variant_map
Converts tsv to dicts with this structure
        {
            'patient_1': {
                'variant-id': {
                    'build': 'hg19'
                    'chromosome': 'chr7',
                    'reference_allele': 'A',
                    'variant_allele': 'G',
                    'position': '1234',
                    'rs_id' : 'RS1234',
                    'type': 'SNV',
                    'genes_of_interest' : [SHH, BRCA1]
                }
            }
        }
        TODO the above structure can be simplified as it results
             in duplicated variant dicts, the join-by-id approach
             below would be an improvement:
        {
            'patient_1': {
                'variants': [variant-id1,variant-id2, 3, 4]
            }
            'variants : [
               'variant-id1': {
                    'build': hg19
                    'chromosome': 'chr7',
                    'reference_allele': 'A',
                    'variant_allele': 'G',
                    'position': '1234'
                    'rs_id' : 'RS1234',
                    'type': 'SNV",
                    'genes_of_interest' : [SHH, BRCA1]
                }
            ]
        }

        If any part of the core variant information is missing
        (build, chr, bp change(s), the line number will be used
        to make the variant unique

        Variant id will be used downstream to form blank nodes (checksumed)

        See docstring for _add_variant_gene_relationship for explanation
        on why there is a one to many mapping between variants and genes

        Values are normalized with these rules:
        1. Basepairs are upper case
        2. HG19 -> hg19
        3. X -> chrX
        :return: dict