<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def process_allele(allele_data, dbsnp_data, header, reference):
 """Combine data from multiple lines refering to a single allele. Returns three items in this order: (string) concatenated variant sequence (ie allele the genome has) (string) concatenated reference sequence (string) start position (1-based) """

    # One-based start to match VCF coordinates
    start = str(int(allele_data[0][header['begin']]))
    var_allele = ''
    ref_allele = ''
    filters = []
    for data in allele_data:
        if 'varQuality' in header:
            if 'VQLOW' in data[header['varQuality']]:
                filters.append('VQLOW')
        else:
            var_filter = data[header['varFilter']]
            if var_filter and not var_filter == "PASS":
                filters = filters + var_filter.split(';')
        if data[header['varType']] == 'no-call':
            filters = ['NOCALL']
            ref_allele = ref_allele + data[header['reference']]
            continue
        var_allele = var_allele + data[header['alleleSeq']]
        ref_allele = ref_allele + data[header['reference']]
        if data[header['xRef']]:
            for dbsnp_item in data[header['xRef']].split(';'):
                dbsnp_data.append(dbsnp_item.split(':')[1])
    # It's theoretically possible to break up a partial no-call allele into
    # separated gVCF lines, but it's hard. Treat the whole allele as no-call.
    if 'NOCALL' in filters:
        filters = ['NOCALL']
        var_allele = '?'
    return var_allele, ref_allele, start, filters