[
  {
    "path": ".gitignore",
    "content": "build_pipeline/IMGT_sequence_files\nbuild_pipeline/muscle_alignments\nbuild_pipeline/curated_alignments\nbuild_pipeline/HMMs\nbuild_pipeline/__pycache__\nbuild/\n"
  },
  {
    "path": "Example_scripts_and_sequences/12e8.fasta",
    "content": ">12E8:H|PDBID|CHAIN|SEQUENCE\nEVQLQQSGAEVVRSGASVKLSCTASGFNIKDYYIHWVKQRPEKGLEWIGWIDPEIGDTEYVPKFQGKATMTADTSSNTAY\nLQLSSLTSEDTAVYYCNAGHDYDRGRFPYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVT\nWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRD\n>12E8:L|PDBID|CHAIN|SEQUENCE\nDIVMTQSQKFMSTSVGDRVSITCKASQNVGTAVAWYQQKPGQSPKLMIYSASNRYTGVPDRFTGSGSGTDFTLTISNMQS\nEDLADYFCQQYSSYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVL\nNSATDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>12E8:M|PDBID|CHAIN|SEQUENCE\nDIVMTQSQKFMSTSVGDRVSITCKASQNVGTAVAWYQQKPGQSPKLMIYSASNRYTGVPDRFTGSGSGTDFTLTISNMQS\nEDLADYFCQQYSSYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVL\nNSATDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>12E8:P|PDBID|CHAIN|SEQUENCE\nEVQLQQSGAEVVRSGASVKLSCTASGFNIKDYYIHWVKQRPEKGLEWIGWIDPEIGDTEYVPKFQGKATMTADTSSNTAY\nLQLSSLTSEDTAVYYCNAGHDYDRGRFPYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVT\nWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRD\n"
  },
  {
    "path": "Example_scripts_and_sequences/ImmunoPDB.py",
    "content": "#! /usr/bin/env python\n#    ANARCI - Antibody Numbering and Antigen Receptor ClassIfication\n#    Copyright (C) 2016 Oxford Protein Informatics Group (OPIG)\n#\n#    This program is free software: you can redistribute it and/or modify\n#    it under the terms of the BSD 3-Clause License.\n#\n#    You should have received a copy of the BSD 3-Clause Licence\n#    along with this program.  If not, see <https://opensource.org/license/bsd-3-clause/>.\n\ndescription='''\n\nANARCI - ImmunoPDB                                     \\\\\\    //\nAntibody Numbering and Antigen Receptor ClassIfication  \\\\\\  //\n                                                          ||\n(c) Oxford Protein Informatics Group (OPIG). 2015-16      ||\n\nExample script to number Antibody and TCR PDB structures.\n\nANARCI must be installed and in the path\nopig.stats.ox.ac.uk/webapps/anarci\n\nRequirements: Biopython (version >= 1.66)\n              Muscle\n\n\nThis script extends the BioPython PDBParser and Structure classes so that a numbering scheme can be applied to the variable domain\nof an antigen receptor chain. \n\no Where available the Seqres record is used as the full sequence. Missing residues are recognised by comparing this to the residues\n  with coordinates.\n\no *Only* variable domains are numbered consistently in the chosen scheme.\n\no Residues before the domain are numbered '0' with reverse alphabetical insertions if there are less than 28 (all 0 otherwise - this\n  will break some PDB parsers...)\n\no Residues after the variable domain are numbered sequentially from 1001.\n\no By default when more than one variable domain is found on a single chain (e.g. single chain Fv, diabody...) the numbering will be\n  with respect to the first domain identified.\n\no CDR recognition is performed and regions are annotated in the xtra dictionary attributes of residue objects.\n\no Pairing is performed using the distance between the interface cysteine positions (imgt 104).\n\nBasic useage\n\nRenumber antibody chains with imgt numbering scheme\npython ImmunoPDB.py -i infile.pdb -o outfile.pdb -s imgt\n\nRenumber tcr chains with imgt numbering scheme\npython ImmunoPDB.py -i infile.pdb -o outfile.pdb -s imgt --receptor tr\n\n\n'''\n\nepilogue='''\nAuthor: James Dunbar (dunbar@stats.ox.ac.uk)\n        Charlotte Deane (deane@stats.ox.ac.uk)\n\nCopyright (C) 2016 Oxford Protein Informatics Group (OPIG)\nFreely distributed under the BSD 3-Clause Licence.\n'''\n\n# Antigen receptor numbering and classification.\nfrom anarci import anarci, scheme_names, scheme_short_to_long\n\n# Biopython - you must use the dev version for this to work. Got to: https://github.com/biopython/biopython\n# Must be version 1.84 or greater.\nfrom Bio.PDB import *\nfrom Bio.File import as_handle\n# from Bio.Alphabet import generic_protein\nfrom Bio.Seq import Seq\nfrom Bio.SeqRecord import SeqRecord\nfrom Bio.SCOP.Raf import protein_letters_3to1_extended as protein_letters_3to1\nfrom Bio.SeqUtils import seq1\n\n# Python\nimport subprocess\nimport os\nimport collections\n\n\n# Globals\ntebahpla = 'ZYXWVUTSRQPONMLKJIHGFEDCBA '\ncysh = {'kabat':92,'chothia':92,'martin':92,'imgt':104,'aho':106,'wolfguy':330 } # The position of the interface cysteine in each\ncysl = {'kabat':88,'chothia':88,'martin':88,'imgt':104,'aho':106,'wolfguy':734 } # scheme.\ninter_cys = { 'H':cysh, 'B':cysh, 'D':cysh, 'L':cysl, 'K':cysl, 'A':cysl, 'G':cysl }\n\n\n# Class to apply numbering to a structure object. This can be used in conjunction with the Ig/Tcr parsers or applied to an existing\n# object. This class annotates in the .xtra dictionary of chains and residues and *does not* modify the residue identifiers.\nclass PDBNumber(object):\n    '''\n    This will annotate residues in the structure with numbering schemes\n    The original structure object remains unchanged.\n    Annotations are listed in the residue .xtra dictionary. \n    Pairings are listed in the Chains .xtra dictionary.\n    '''\n    def __init__(self,scheme,allowed_domains, region_definition=None, warnings=False):\n        self.scheme=scheme_short_to_long[scheme.lower()]\n        self.allowed_domains = allowed_domains\n        self.region_definition = region_definition\n        self.warnings = warnings\n\n    def numberChain(self, chain, sequence=''):\n        '''\n        Number a Bio.PDB chain with a Ig or Tcr numbering scheme.\n        '''\n        check_continuity = False\n        structureSequence, index2ResId = extract_sequence( chain )\n        if not sequence: # No seqres provided\n            sequence = structureSequence\n            seqI2strucI = get_alignment_dict( sequence, sequence )\n            if self.warnings: check_continuity = True\n        elif which( 'muscle' ) or structureSequence in sequence: # Muscle found or it is an easy alignment\n            chain.xtra['structure_ali'], chain.xtra['seqres_ali'] = pairwise_muscle( structureSequence , sequence ) \n            fix_deletions( chain ) # Fix the position of a missing residue if a degenerate alignment\n            seqI2strucI = get_alignment_dict(chain.xtra['seqres_ali'], chain.xtra['structure_ali'])\n        else: # Missing residues are suspected. \n            raise Warning('Muscle was not found and there are suspected missing residues. Numbering could be incorrect')\n            sequence = structureSequence\n            seqI2strucI = get_alignment_dict( sequence, sequence )\n\n        # Reset if needed\n        if 'anarci_details' in chain.xtra:\n            chain.xtra['domains'] = []\n            chain.xtra['anarci_details'] = []\n\n        di = 0 # Domain index (when there are multiple variable domains on the same chain)\n        for numbering2Index, domainType, details in self.numberSequence(chain.id, sequence): # Iterate over the recognised domains.\n            if domainType in self.allowed_domains:\n                chain.xtra['domains'] = chain.xtra.get('domains', [] ) + [domainType] # Append to the domains list.\n                chain.xtra['anarci_details'] = chain.xtra.get('anarci_details', [] ) + [details] # Append to the germlines list.\n                for numberedId, index in numbering2Index:\n                    if index not in seqI2strucI: continue # Missing residue\n                    res = chain[ index2ResId[ seqI2strucI[index] ] ]\n                    res.xtra[self.scheme] = numberedId # Store the annotated numbering               \n                    if 'pdb' not in res.xtra: res.xtra['pdb']  = res.id[1:] # Store the original numbering\n                    res.xtra['domain_type'] = domainType # Store the domain type\n                    res.xtra['domain_index'] = di # Store which domain this residue is in.\n\n                # Second iteration to annotate non variable domains.\n                if 1 < details['query_start'] < 28: # If possible, annotate pre domain with 0C 0B 0A as pre insertions. \n                    insertions = tebahpla[ 27 - details['query_start']: ]\n                else:\n                    insertions = ' '*(details['query_start']+1) # So that insertion code will always be at least ' ' # All \n                \n                pre, ri, ii  = True, 0, 0\n                for residue in chain:\n                    if 'pdb' not in residue.xtra: \n                        residue.xtra['pdb'] = residue.id[1:]\n                    if residue.xtra.get('domain_index','') == di:\n                        if pre:\n                            pre, ri, ii = False, 1001, 0\n                        continue\n                    residue.xtra[self.scheme+'%d'%di] = (ri, insertions[ii])\n                    if pre: # Update the insertion code \n                        ii += 1\n                    else: # Update the residue index \n                        ri += 1                    \n                self.annotateChainRegions( chain, self.scheme, self.region_definition, domain_index=di )\n                di +=1\n\n        if di and check_continuity:\n            continuous, at = analyse_continuity( chain )\n            if not continuous:\n                print('Warning: Numbering may be incorrect as a missing residue was detected in chain %s (around residue %d%s). Provide the seqres record to overcome this problem.'%(chain.id, chain.child_list[at].id[1], chain.child_list[at].id[2] ))\n            \n        chain.xtra['scheme'] = self.scheme\n\n    def annotateChainRegions(self, chain, scheme, definition=None, domain_index=0):\n        '''\n        Annotate chain with regions. The loaded numbering scheme is used\n        '''\n        if definition is None or scheme=='pdb': return\n    \n        domain_type = chain.xtra['domains'][domain_index].replace('K','L')\n        numbering   = [ (r.xtra[scheme], None) if r.xtra.get('domain_index',None) == domain_index else ((0,' '), None) for r in chain ]\n\n        try:\n            regions = annotate_regions(numbering, domain_type, numbering_scheme=scheme,definition=definition)\n        except AssertionError: # Unimplemented\n            return\n        for i in range(len(numbering)):\n            if not chain.child_list[i].xtra.get('region'): # Update the region.\n                chain.child_list[i].xtra['region'] = regions[i][2]\n\n    def numberSequence(self,sequenceName, sequence):\n        '''\n        Number a sequence and yield the annotations for each domain identified (n to c)\n        '''\n        if len(sequence) > 70: \n            results = anarci( [(sequenceName, sequence)], scheme=self.scheme, assign_germline=True, allow=self.allowed_domains )\n        else:\n            return \n        numbered, details = results[0][0], results[1][0]\n        if numbered is None: numbered = []\n        for i in range( len( numbered ) ): # Iterate over the identified domains (e.g. for an scfv)\n            numbering = [ (n, a) for n, a in numbered[i][0] if a != '-' ] # Remove gaps if made (imgt scheme)\n            yield [ (numbering[ri][0], ri+numbered[i][1]) for ri in range( len( numbering ) ) ], details[i]['chain_type'], details[i]\n\n# Extension of the Biopython PDBParser. \nclass AntigenReceptorPDBParser(PDBParser):\n    '''\n    A generic class to parse antigen receptor structures. \n    '''\n    allowed_schemes = scheme_names\n    allowed_domains = set(['H','K','L'] + ['A','B','G','D'])\n    allowed_pairs = [ ('H','K'),('H','L'),('B','A'),('D','G') ]\n    annotates = 'antigen receptor'        \n    \n    def __init__( self, PERMISSIVE=True, get_header=False,\n                 structure_builder=None, QUIET=False, scheme='imgt', region_definition='imgt', warnings=False):\n        '''\n        '''\n        super( AntigenReceptorPDBParser, self ).__init__(PERMISSIVE=PERMISSIVE, get_header=get_header,\n                 structure_builder=structure_builder, QUIET=QUIET)\n        assert scheme in self.allowed_schemes, 'Scheme unknown'\n        self.scheme=scheme_short_to_long[scheme.lower()]\n        self.region_definition = region_definition\n        self.warnings = warnings\n\n    def get_structure(self, id, file):\n        \"\"\"Return the structure. Variable domains are annotated with the chosen numbering scheme.\n\n        o Receptor chains are numbered with the desired numbering scheme and  paired according to the separation of their interface\n        cysteine (or whatever is at position 104 in imgt). \n\n        o Only 'opposite' type domains (VH-VK, VH-VL, VB-VA, VD-VG) are paired. VL-VL dimers will not be annotated\n\n        o Single chain fvs are also considered.\n\n        o The xtra['pairing'] list of a chain tells you how the variable domains it contains are paired. \n            e.g. For a normal Fv with chains H and L. \n                structure[0]['H'].xtra['pairing']  -->    [ (<Chain id=L>, 0) ]\n                structure[0]['L'].xtra['pairing']  -->    [ (<Chain id=H>, 0) ]\n                                                         chain obj,  domain index of paired              \n\n            e.g. For a scfv with H and L domains on the same chain, A\n                structure[0]['A'].xtra['pairing']   -->   [ (<Chain id=A>, 1) , (<Chain id=A>, 0) ]\n\n        o Numbering will be returned with respect to the first identified variable domain. Use the domain_index argument in the \n          structure object's 'switch_numbering_scheme' method to change to number with respect to the second etc for an scfv.\n        \n        o Residues before the variable domain are all given the residue number 0. If there are less than 27 residues before the start\n          of the variable domain they will be annotated with insertion codes in reverse alphabetical order\n            e.g.\n             0D 0C 0B 0A 0 | 1 2 3 4\n        \n        o Residues after the variable domain are numbered sequentially from 1001. No guarantee is given of structural equivalence in \n          the constant domain (yet...) \n\n\n        Arguments:\n         - id - string, the id that will be used for the structure\n         - file - name of the PDB file OR an open filehandle\n        \"\"\"\n\n        # Ensure the file is open file handle \n        with as_handle( file ) as fin:\n\n            # Read the structure using biopyton\n            structure = super( AntigenReceptorPDBParser, self ).get_structure(id, fin)\n\n            # Rewind to the start of the file\n            fin.seek(0)\n\n            # Read the seqres entries\n            seqres    = self.read_seqres( fin )\n\n        stringseqres = dict( (e, str(seqres[e].seq) ) for e in seqres )\n        self.number_receptor_chains(structure, sequences=stringseqres) # Post process\n        for chain in seqres: structure[0][chain].xtra['seqresobj'] = seqres[chain] # Associtate with the chain object - includes the original lines\n        self.find_pairs(structure) # Pair chains\n        structure.switch_numbering_scheme(self.scheme) # Return the structure with the requested numbering scheme. \n        return structure\n\n    def read_seqres(self, file):\n        '''\n        Read the seqres entries of a structure if available\n        '''\n        try:\n            with as_handle(file) as f:\n                seqres   =  dict([ (a.id, a) for a in PdbSeqresIterator(f) ])\n        except:\n            seqres = {}\n        return seqres\n\n    def number_receptor_chains(self, structure, sequences={}):\n        '''\n        Apply the numbering to each PDB chain in the file\n        '''\n        pdbN = PDBNumber(self.scheme, self.allowed_domains, region_definition=self.region_definition, warnings=self.warnings)\n        for model in structure:\n            for chain in model:\n                pdbN.numberChain(chain, sequence=sequences.get(chain.id, '') ) \n                chain.xtra['seqres'] = sequences.get(chain.id, '')\n\n\n    def find_pairs(self,structure): \n        '''\n        Annotate the pairs of domains in the structure using the distance between the interface cysteine residue CA atoms.\n        '''\n        for model in structure:\n            # Bin the domains of the structure by type\n            model.xtra['domains'] = dict( (d, []) for d in self.allowed_domains )\n            model.xtra['firstpair']=None # Used for reference if outputting only the first receptor identified.\n            for chain in model:\n                for di in range( len( chain.xtra.get('domains',[]) ) ):\n                    model.xtra['domains'][ chain.xtra['domains'][di] ].append( (chain, di) )\n                    if not model.xtra['firstpair']: model.xtra['firstpair'] = [(chain, di)] # For single domain\n                chain.xtra['pairing'] = [None]*len( chain.xtra.get('domains',[]) )\n            for pA, pB in self.allowed_pairs:\n               \n               for chainA, diA in model.xtra['domains'][pA]:\n                    aA = chainA.interface_cys_CA( self.scheme, diA )\n                    if aA is None: continue\n                    for chainB, diB in model.xtra['domains'][pB]:\n                        aB = chainB.interface_cys_CA( self.scheme, diB )\n                        if aB is None: continue\n                        if aA - aB < 25: \n                            chainA.xtra['pairing'][diA] = (chainB, diB) \n                            chainB.xtra['pairing'][diB] = (chainA, diA)\n                            if len( model.xtra['firstpair']) < 2: model.xtra['firstpair'] = sorted( [(chainA, diA) ,(chainB, diB)] )\n\nclass TcrPDBParser(AntigenReceptorPDBParser):\n    allowed_schemes = ['imgt','i','aho','a']\n    allowed_domains  = set(['A','B','G','D'])\n    allowed_pairs = [ ('B','A'),('D','G') ] \n    annotates = 'tcr'\n\nclass AntibodyPDBParser(AntigenReceptorPDBParser):\n    allowed_domains  = set(['H','K','L'])\n    allowed_pairs = [ ('H','K'),('H','L')]\n    annotates = 'antibody'\n\n# Only accept variable regions of a chain\nclass SelectFv(Select):\n    def accept_residue(self, residue):\n        if 'anarci_details' in residue.parent.xtra:\n            if residue.id[1] > 0 and residue.id[1] < 1000:\n                return 1\n\n# Allows non-receptor chains but restricts scfvs to the variable part.   \nclass SelectFvScFv(Select):\n    def accept_residue(self, residue):\n        if len(residue.parent.xtra.get('domains',[])) > 1:\n            if residue.id[1] > 0 and residue.id[1] < 1000:\n                return 1\n            return 0 \n        return 1\n\n\n# Extend the Biopython classes with methods to handle numbering.\ndef Entity_switch_numbering_scheme(self, scheme, domain_index=0): # Structure, Model\n    ''' \n    '''\n    for child in self:\n        child.switch_numbering_scheme(scheme, domain_index=domain_index)\n\ndef Chain_switch_numbering_scheme(self, scheme, domain_index=0):\n    '''\n    Change the numbering scheme used in the identifiers of the residues in the chain. \n    By default the numbering will be with respect to the first (0th) variable domain identified.\n    If a single chain fv is identified (i.e. two variable domains on the same chain) one can switch the numbering to be with\n    respect to the second domain using the domain index argument (0 - first domain, 1 - second domain etc). \n    \n    Residues before the numbered domain are numbered 0. Insertion codes are used in reverse alphabetical order iff there are 27 or\n    less n-terminal 'insertions' (all 0 otherwise). Residues after the domain are numbered sequentially from 1001.\n   \n    '''\n    if scheme not in [ self.xtra['scheme'], 'pdb' ]:\n        PDBNumber(scheme, self.xtra.get('domains', ['H','K','L','A','B','G','D'])).numberChain( self, sequence=self.xtra.get('seqres','' ) )\n\n    if 'anarci_details' in self.xtra: # Only bother to recurse into numbered chains \n        if self.xtra.get( 'loaded','' ) == scheme+str(domain_index): return # Only switch if different.\n        for child in self:\n            child.switch_numbering_scheme(scheme, domain_index=domain_index)\n        self.child_dict = {} # Reset the child dict on a separate loop to prevent conflicts\n        for child in self:  \n            self.child_dict[child.id]=child\n            \n        self.xtra['loaded'] = scheme+str(domain_index)\n\ndef Residue_switch_numbering_scheme(self, scheme, domain_index=0):\n    '''\n    '''\n    # Replace the residue with the numbering scheme with respect to the domain index. The numbering of its own domain is xtra[scheme]\n    self.id = ( self.id[0], ) + self.xtra.get(scheme+str(domain_index), self.xtra.get( scheme, self.xtra['pdb'] ) )\n\ndef Chain_interface_cys_CA(self, scheme, domain_index=0 ):\n    '''\n    '''\n    self.switch_numbering_scheme( scheme, domain_index )\n    try:\n        return self[ (' ', inter_cys[self.xtra['domains'][domain_index]][scheme], ' ') ]['CA']\n    except KeyError:\n        return\n\ndef Entity_save(self,filename, select=Select(), write_end=True):\n    '''\n    '''\n    pdbio=PDBIO()\n    pdbio.set_structure(self)\n    pdbio.save(filename, select=select, write_end=write_end)\n        \n       \nEntity.Entity.switch_numbering_scheme   = Entity_switch_numbering_scheme\nChain.Chain.switch_numbering_scheme     = Chain_switch_numbering_scheme\nChain.Chain.interface_cys_CA            = Chain_interface_cys_CA\nResidue.Residue.switch_numbering_scheme = Residue_switch_numbering_scheme\nEntity.Entity.save = Entity_save\n\n\ndef compile_remarks( chain, rtype, only_loaded=False ):\n    '''\n    Compile a remark report that is parsable\n    '''\n    \n    r=[]\n\n    # If only loaded only consider the numbered variable domain on the chain (usually there is only 1)\n    if only_loaded:\n        r.append( 'CHAIN %s N_%s-V-DOMAINS %d'%( chain.id, rtype , min(1,len(chain.xtra.get('domains',[])) )) )\n    else:\n        r.append( 'CHAIN %s N_%s-V-DOMAINS %d'%( chain.id, rtype , len(chain.xtra.get('domains',[])) ) )\n    \n    # Create remark records about the chain types, pairings and germline assignments\n    for i in range( len( chain.xtra.get('domains',[]) ) ):\n        if only_loaded and i != int(chain.xtra.get('loaded','9')[-1]): continue\n        deets = chain.xtra['anarci_details'][i]\n        di = 'CHAIN %s DOMAIN %d '%( chain.id, i )\n        r.append(di+'TYPE V%s'%chain.xtra['domains'][i]) \n        if chain.xtra['pairing'][i] is not None:\n            r.append(di+'PAIREDWITH CHAIN %s DOMAIN %d'%( chain.xtra['pairing'][i][0].id, chain.xtra['pairing'][i][1] ))\n        r.append(di+'V_GENE_SPECIES %s'%deets['germlines']['v_gene'][0][0])\n        r.append(di+'V_GENE_GERMLINE %s'%deets['germlines']['v_gene'][0][1])\n        r.append(di+'V_GENE_GERMLINE_IDENTITY %.2f'%deets['germlines']['v_gene'][1])\n        r.append(di+'J_GENE_SPECIES %s'%deets['germlines']['j_gene'][0][0])\n        r.append(di+'J_GENE_GERMLINE %s'%deets['germlines']['j_gene'][0][1])\n        r.append(di+'J_GENE_GERMLINE_IDENTITY %.2f'%deets['germlines']['j_gene'][1])\n\n    return r        \n\ndef compile_seqres( chain ):\n    ''' \n    '''\n    if 'seqresobj' in chain.xtra:\n        return ''.join( [ l%chain.id for l in chain.xtra['seqresobj'].lines ] ).strip()\n    return ''\n\n        \ndef rename_chains( structure ):\n    '''\n    Rename the first paired receptor chains with (H, L), (B, A). If single domain then only that is renamed.\n    Deletes all other chains from each model.\n    '''\n    for model in structure:\n        # Find which chains are the first identified\n        keep = [c.id for c,di in model.xtra.get('firstpair',[]) ]\n        remove = [ c.id for c in model if c.id not in keep ]\n\n        # Delete unwanted chains\n        for ID in remove:\n            model.detach_child(ID)\n\n        # Rename wanted chains (detach then add with the new ID)\n        lastchain=''\n        for chain, di in model.xtra.get('firstpair',[]):\n            # Make sure the chain identifier is wrt the first variable domain in the chain. Handles scfvs\n            if lastchain == chain.id: continue \n\n            # Assign the chain identidier with the chain type (Both Kappa and Lambda labelled 'L')\n            model.detach_child(chain.id)\n            chain.id = chain.xtra['domains'][di].replace('K','L')\n            model.add(chain)\n\n            # Update the last chain processed.\n            lastchain = chain.id  \n\ndef split_scfv( structure ):\n    '''\n    Split chains with two variable domains into two chains.\n    The first has the original identifier. The second has the lower case identifier.\n    '''\n    for model in structure:\n        chains = [c for c in model]\n        for chain in chains: \n            if len( chain.xtra.get('domains',[]) ) == 2 and chain.id.lower() not in model: \n                # Biopython builder does not like multiply defined residues (fair enough). Switch back to the original numbering\n                # before copying the object as you will have many '0' residues in the first domain.\n                scheme = chain.xtra['loaded'][:-1]\n                chain.switch_numbering_scheme('pdb')\n\n                # Copy the chain and assign it the lower case identifier\n                c_copy = chain.copy()\n                c_copy.id = chain.id.lower()\n                chain.parent.add(c_copy)                    \n        \n                # Switch back to the numbering scheme \n                chain.switch_numbering_scheme( scheme, 0 )\n                c_copy.switch_numbering_scheme( scheme, 1 )\n\n                # Deal with the pairing changes.\n                chain.xtra['pairing'] = [(c_copy,1), None]  \n                c_copy.xtra['pairing'] = [None, (chain,0)]\n                if chain.id == model.xtra['firstpair'][0][0].id:\n                    model.xtra['firstpair'] = [ model.xtra['firstpair'][0], (c_copy,1) ]\n\n                # Reset the region annotations \n                for r in chain: \n                    if r.xtra.get('domain_index','') != 0:\n                        r.xtra['region']=''\n                for r in c_copy: \n                    if r.xtra.get('domain_index','') != 1:\n                        r.xtra['region']=''\n\n# Utility functions\ndef extract_sequence(chain):\n    '''\n    Extract the sequence of the chain (amino acids only)\n    '''\n    strucSeq = ''\n    index2ResId = []\n    index = 0\n    for r in chain:\n        a = convert_3_to_1( r.get_resname() )\n        if a: # If an amino acid\n            index2ResId.append( (index, r.id ) )\n            strucSeq += a\n            index+=1\n    return strucSeq, dict(index2ResId)\n\ndef convert_3_to_1(r):\n    '''\n    Converts amino acid three letter code to one letter codes. '' is returned if a coversion cannot be made.\n    '''                     \n    if is_aa( r, standard=False ):\n        a = protein_letters_3to1.get( r, '' )\n        if len( a ) == 3: # Where there are multiple codes used. \n            return self.convert_3_to_1(a)\n        return a\n    return ''\n\n\ndef pairwise_muscle(seq1, seq2,exact=True):\n    \"\"\"\n    Interface with pairwise muscle between two sequences that should be identical.\n \n    Try an easy alignment first by checking that one is in the other.\n \n    Then if this fails (gaps) use muscle to align the sequences - this should work for seqres and structure sequences with missing atoms.\n    \n    Use muscle to align.\n    \n    if exact is True\n    The gap open penalty is slightly larger than gap extend to break degeneracy between:\n    \n    1)garbleabcdefg----\n      -a-----bcdefg----\n     \n    and\n     \n    2)garbleabcdefg----\n      ------abcdefg----\n    But they are penalties will still make mismatch very unlikely.\n    else\n    default muscle\n    \"\"\"\n\n    if not muscle_path:\n        raise Exception(\"Muscle could not be found in the path\")    \n    \n    try_easy  = easy_alignment(seq1, seq2)\n    if try_easy:\n        return try_easy[0],try_easy[1]\n    \n    if exact:\n        p = subprocess.Popen( [muscle_path,'-gapopen', '-1.001','-gapextend', '-1'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE )\n    else:\n        p = subprocess.Popen( [muscle_path], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE )\n    output = p.communicate('>seq1\\n%s\\n>seq2\\n%s'%(seq1,seq2))\n    # check what you have been given.\n    result = output[0].split(\">\")\n    # expect it to have 2 entries\n    if len(result) == 3:\n        seq1_ali = result[1]\n        seq2_ali = result[2]\n        return \"\".join( seq1_ali.split(\"\\n\")[1:]), \"\".join( seq2_ali.split(\"\\n\")[1:])\n    else:\n        print(\"Problem parsing output from muscle: %s\"%output[0], file=sys.stderr)\n\ndef easy_alignment(seq1, seq2):\n    \"\"\"\n    Function to align two sequences by checking if one is in the other.\n    This function will conserve gaps.\n    \"\"\"\n    assert type(seq1) is str and type(seq2) is str, \"Sequences must be strings for easy_alignment\" \n    if seq1 in seq2:\n        start = seq2.index(seq1)\n        seq1_ali = \"-\"*start + seq1 + \"-\"*(len(seq2) - start - len(seq1) )\n        return seq1_ali, seq2\n    elif seq2 in seq1:\n        start = seq1.index(seq2)\n        seq2_ali = \"-\"*start + seq2 + \"-\"*(len(seq1) - start - len(seq2) )\n        return seq1, seq2_ali\n    else:\n        # Can't align them # I return just one value here. \n        return False      \n\n\ndef which(name, flags=os.X_OK):\n    \"\"\"\n    Search PATH for executable files with the given name.\n   \n    On newer versions of MS-Windows, the PATHEXT environment variable will be\n    set to the list of file extensions for files considered executable. This\n    will normally include things like \".EXE\". This fuction will also find files\n    with the given name ending with any of these extensions.\n\n    On MS-Windows the only flag that has any meaning is os.F_OK. Any other\n    flags will be ignored.\n   \n    @type name: C{str}\n    @param name: The name for which to search.\n   \n    @type flags: C{int}\n    @param flags: Arguments to L{os.access}.\n   \n    @rtype: C{list}\n    @param: A list of the unique full paths to files found, in the\n    order in which they were found.\n    \"\"\"\n    result = []\n    exts = [_f for _f in os.environ.get('PATHEXT', '').split(os.pathsep) if _f]\n    path = os.environ.get('PATH', None)\n    if path is None:\n        return []\n    for p in os.environ.get('PATH', '').split(os.pathsep):\n        p = os.path.join(p, name)\n        if os.access(p, flags):\n            result.append(p)\n        for e in exts:\n            pext = p + e\n            if os.access(pext, flags):\n                result.append(pext)\n    return uniq(result)\n\ndef uniq(seq, idfun=None):\n    \"\"\"\n    A function to uniquify a sequence preserving order\n    With thanks to http://www.peterbe.com\n\n    @param seq: A sequence to uniquify\n    @param idfun: An optional function to use as a key. Like the \"key\" kwarg in C{sorted}. \n    \n    @return: The sequence.\n    \"\"\"\n    # order preserving\n    if idfun is None:\n        def idfun(x): return x\n    seen = {}\n    result = []\n    for item in seq:\n        marker = idfun(item)\n        if marker in seen: continue\n        seen[marker] = 1\n        result.append(item)\n    return result\n\n\ndef get_alignment_dict(ali1,ali2):\n    \"\"\"\n    Get a dictionary which tells you the index in sequence 2 that should align with the index in sequence 1 (key)\n    \n    ali1:  ----bcde-f---        seq1: bcdef\n    ali2:  ---abcd--f---        seq2: abcdf\n\n    alignment_dict={\n        0:1,\n        1:2,\n        2:3,\n        4:4\n        }\n    \n    If the index is aligned with a gap do not include in the dictionary.\n    e.g  1 in alignment_dict  --> True\n    e.g  3 in alignment_dict  --> False\n    \"\"\"\n    assert len(ali1)==len(ali2), \"aligned sequences must be same lengths (including gaps)\"\n    alignment_dict={}\n    p1=-1\n    p2=-1\n    for ap in range( len(ali1) ):\n        if ali1[ap] != \"-\" and ali2[ap] != \"-\":\n            assert ali1[ap] == ali2[ap], 'The sequence in the structure did not match that in the provided sequence (seqres entry)'\n            p1+=1\n            p2+=1\n            alignment_dict[p1] = p2\n        elif ali1[ap] != \"-\": \n            p1+=1 \n        elif ali2[ap] != \"-\": \n            p2+=1    \n    return alignment_dict\n\n\ndef fix_deletions(chain):\n    '''\n    Consider the case where there is one or more missing residues flanked by identical residues:\n   \n    QETGGGGGGNCP\n    QETGG-GGGNCP\n\n    The alignment is degenerate. However missing residues can be any one of them\n\n    e.g.\n    QETGGGGGGNCP\n    QET-GGGGGNCP\n\n    QETGGGGGGNCP\n    QETGGGG-GNCP\n\n    This function will check the position of the chain break and fix which positions should be included accordingly\n\n    '''\n    # TODO\n    pass\n\ndef analyse_continuity( chain ):\n    '''\n    '''\n    last = chain.child_list[0]\n    i = 1\n    for residue in chain.child_list[1:]:\n        try:\n            if residue.id[0].strip():continue # Don't consider HETATMS. Enforce them to be missed\n            if abs(last['C'] - residue['N'] ) > 1.5: # Generous cut-off (average 1.33) for C-N peptide bond.\n                return False, i\n        except KeyError:\n            return False, i\n        last = residue\n        i+=1\n    return True, None\n\n# Check whether muscle is in the path. Alternatively provide this as an input argument from another script. \nif which('muscle'):\n    muscle_path = 'muscle'\nelse:\n    muscle_path = ''\n\n\n\n# Modified seqres iterator from Biopython\ndef PdbSeqresIterator(handle):\n    \"\"\"Returns SeqRecord objects for each chain in a PDB file.\n\n    The sequences are derived from the SEQRES lines in the\n    PDB file header, not the atoms of the 3D structure.\n\n    Specifically, these PDB records are handled: DBREF, SEQADV, SEQRES, MODRES\n\n    See: http://www.wwpdb.org/documentation/format23/sect3.html\n    \"\"\"\n    chains = collections.defaultdict(list)\n    metadata = collections.defaultdict(list)\n    lines = collections.defaultdict(list)\n    for line in handle:\n        rec_name = line[0:6].strip()\n        if rec_name == 'SEQRES':\n            # NB: We only actually need chain ID and the residues here;\n            # commented bits are placeholders from the wwPDB spec.\n            # Serial number of the SEQRES record for the current chain.\n            # Starts at 1 and increments by one each line.\n            # Reset to 1 for each chain.\n            # ser_num = int(line[8:10])\n            # Chain identifier. This may be any single legal character,\n            # including a blank which is used if there is only one chain.\n            chn_id = line[11]\n            # Number of residues in the chain (repeated on every record)\n            # num_res = int(line[13:17])\n            residues = [seq1(res, custom_map=protein_letters_3to1) for res in line[19:].split()]\n            chains[chn_id].extend(residues)\n            lines[chn_id].append( line[:11]+'%s'+line[12:] )\n        elif rec_name == 'DBREF':\n            #  ID code of this entry (PDB ID)\n            pdb_id = line[7:11]\n            # Chain identifier.\n            chn_id = line[12]\n            # Initial sequence number of the PDB sequence segment.\n            # seq_begin = int(line[14:18])\n            # Initial insertion code of the PDB sequence segment.\n            # icode_begin = line[18]\n            # Ending sequence number of the PDB sequence segment.\n            # seq_end = int(line[20:24])\n            # Ending insertion code of the PDB sequence segment.\n            # icode_end = line[24]\n            # Sequence database name.\n            database = line[26:32].strip()\n            # Sequence database accession code.\n            db_acc = line[33:41].strip()\n            # Sequence database identification code.\n            db_id_code = line[42:54].strip()\n            # Initial sequence number of the database seqment.\n            # db_seq_begin = int(line[55:60])\n            # Insertion code of initial residue of the segment, if PDB is the\n            # reference.\n            # db_icode_begin = line[60]\n            # Ending sequence number of the database segment.\n            # db_seq_end = int(line[62:67])\n            # Insertion code of the ending residue of the segment, if PDB is the\n            # reference.\n            # db_icode_end = line[67]\n            metadata[chn_id].append({'pdb_id': pdb_id, 'database': database,\n                                    'db_acc': db_acc, 'db_id_code': db_id_code})\n        # ENH: 'SEQADV' 'MODRES'\n\n    for chn_id, residues in sorted(chains.items()):\n        record = SeqRecord(Seq(''.join(residues), generic_protein))\n        record.annotations = {\"chain\": chn_id}\n        if chn_id in metadata:\n            m = metadata[chn_id][0]\n            record.id =  chn_id\n            record.name = \"%s:%s\" % (m['pdb_id'], chn_id)\n            record.description = (\"%s:%s %s\" % (m['database'],\n                                                m['db_acc'],\n                                                m['db_id_code']))\n            record.lines =lines[chn_id]\n            for melem in metadata[chn_id]:\n                record.dbxrefs.extend([\n                    \"%s:%s\" % (melem['database'], melem['db_acc']),\n                    \"%s:%s\" % (melem['database'], melem['db_id_code'])])\n        else:\n            record.id = chn_id\n            record.lines =lines[chn_id]\n        yield record\n\n\n######## Region annotations #########\n\nregions_in_chothia = {\"L1\": {\"kabat\":(24,34),\"chothia\":(24,34),\"contact\":(30,36),\"north\":(24,34)},\n                      \"L2\": {\"kabat\":(50,56),\"chothia\":(50,56),\"contact\":(46,55),\"north\":(49,56)},\n                      \"L3\": {\"kabat\":(89,97),\"chothia\":(89,97),\"contact\":(89,96),\"north\":(89,97)},\n                      \"H1\": {\"kabat\":(31,35),\"chothia\":(26,32),\"contact\":(30,35),\"north\":(23,35)},\n                      \"H2\": {\"kabat\":(50,65),\"chothia\":(52,56),\"contact\":(47,58),\"north\":(50,58)},\n                      \"H3\": {\"kabat\":(95,102),\"chothia\":(95,102),\"contact\":(93,101),\"north\":(93,102)} }\n\n\n_regions = {'imgt':{}}\n_regions['imgt']['L'] = _regions['imgt']['H'] = '11111111111111111111111111222222222222333333333333333334444444444555555555555555555555555555555555555555666666666666677777777777'\n_regions['kabat'] = {}\n_regions['kabat']['L']                        = '11111111111111111111111222222222222222223333333333333334444444444444455555555555555555555555555555555555666666666666677777777777'\n_regions['kabat']['H']                        = '11111111111111111111111111111111111222223333333333333344444444444444444444555555555555555555555555555555556666666666677777777777'\n_regions['chothia'] = {}\n_regions['chothia']['L']                      = '11111111111111111111111222222222222222223333333333333334444444444444455555555555555555555555555555555555666666666666677777777777'\n_regions['chothia']['H']                      = '11111111111111111111111111222222222223333333333333333333444444445555555555555555555555555555555555555555556666666666677777777777'\n_regions['contact'] = {}\n_regions['contact']['L']                      = '11111111111111111111111111111111111222222233333333344444444444444444555555555555555555555555555555555555666666666666777777777777'\n_regions['contact']['H']                      = '11111111111111111111111111111122222222223333333333344444444444444455555555555555555555555555555555555555666666666666777777777777'\n_regions['north'] = {}\n_regions['north']['L']                        = '11111111111111111111111222222222222222223333333333333344444444444444455555555555555555555555555555555555666666666666677777777777'\n_regions['north']['H']                        = '11111111111111111111111222222222222222223333333333333344444444444455555555555555555555555555555555555555666666666666677777777777'\n\n# For internal use only. These are not direct conversions and are handled heuristically.\n_index_to_imgt_state =  {('chothia', 'H'): {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19:\n19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 35, 32: 36, 33: 37, 34: 38, 35: 39, 36: 40, 37: 41,\n38: 42, 39: 43, 40: 44, 41: 45, 42: 46, 43: 47, 44: 48, 45: 49, 46: 50, 47: 51, 48: 52, 49: 53, 50: 54, 51: 55, 52: 59, 53: 60, 54: 61, 55: 62, 56:\n63, 57: 64, 58: 65, 59: 66, 60: 67, 61: 68, 62: 69, 63: 70, 64: 72, 65: 73, 66: 74, 67: 75, 68: 76, 69: 77, 70: 78, 71: 79, 72: 80, 73: 81, 74: 82,\n75: 83, 76: 84, 77: 85, 78: 86, 79: 87, 80: 88, 81: 89, 82: 93, 83: 94, 84: 95, 85: 96, 86: 97, 87: 98, 88: 99, 89: 100, 90: 101, 91: 102, 92: 103,\n93: 104, 94: 105, 95: 106, 96: 107, 97: 108, 98: 109, 99: 110, 100: 114, 101: 115, 102: 116, 103: 117, 104: 118, 105: 119, 106: 120, 107: 121, 108:\n122, 109: 123, 110: 124, 111: 125, 112: 126, 113: 127}, ('kabat', 'H'): {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12,\n13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31:\n31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 40, 37: 41, 38: 42, 39: 43, 40: 44, 41: 45, 42: 46, 43: 47, 44: 48, 45: 49, 46: 50, 47: 51, 48: 52, 49: 53,\n50: 54, 51: 55, 52: 59, 53: 60, 54: 61, 55: 62, 56: 63, 57: 64, 58: 65, 59: 66, 60: 67, 61: 68, 62: 69, 63: 70, 64: 72, 65: 73, 66: 74, 67: 75, 68:\n76, 69: 77, 70: 78, 71: 79, 72: 80, 73: 81, 74: 82, 75: 83, 76: 84, 77: 85, 78: 86, 79: 87, 80: 88, 81: 89, 82: 93, 83: 94, 84: 95, 85: 96, 86: 97,\n87: 98, 88: 99, 89: 100, 90: 101, 91: 102, 92: 103, 93: 104, 94: 105, 95: 106, 96: 107, 97: 108, 98: 109, 99: 110, 100: 114, 101: 115, 102: 116, 103:\n117, 104: 118, 105: 119, 106: 120, 107: 121, 108: 122, 109: 123, 110: 124, 111: 125, 112: 126, 113: 127}, ('imgt', 'H'): {1: 0, 2: 1, 3: 2, 4: 3, 5:\n4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25:\n24, 26: 25, 27: 26, 28: 27, 29: 28, 30: 29, 31: 30, 32: 31, 33: 32, 34: 33, 35: 34, 36: 35, 37: 36, 38: 37, 39: 38, 40: 39, 41: 40, 42: 41, 43: 42,\n44: 43, 45: 44, 46: 45, 47: 46, 48: 47, 49: 48, 50: 49, 51: 50, 52: 51, 53: 52, 54: 53, 55: 54, 56: 55, 57: 56, 58: 57, 59: 58, 60: 59, 61: 60, 62:\n61, 63: 62, 64: 63, 65: 64, 66: 65, 67: 66, 68: 67, 69: 68, 70: 69, 71: 70, 72: 71, 73: 72, 74: 73, 75: 74, 76: 75, 77: 76, 78: 77, 79: 78, 80: 79,\n81: 80, 82: 81, 83: 82, 84: 83, 85: 84, 86: 85, 87: 86, 88: 87, 89: 88, 90: 89, 91: 90, 92: 91, 93: 92, 94: 93, 95: 94, 96: 95, 97: 96, 98: 97, 99:\n98, 100: 99, 101: 100, 102: 101, 103: 102, 104: 103, 105: 104, 106: 105, 107: 106, 108: 107, 109: 108, 110: 109, 111: 110, 112: 111, 113: 112, 114:\n113, 115: 114, 116: 115, 117: 116, 118: 117, 119: 118, 120: 119, 121: 120, 122: 121, 123: 122, 124: 123, 125: 124, 126: 125, 127: 126, 128: 127},\n('chothia', 'L'): {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19:\n18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 26: 25, 27: 26, 28: 27, 29: 28, 30: 35, 31: 36, 32: 37, 33: 38, 34: 39, 35: 40, 36: 41, 37: 42,\n38: 43, 39: 44, 40: 45, 41: 46, 42: 47, 43: 48, 44: 49, 45: 50, 46: 51, 47: 52, 48: 53, 49: 54, 50: 55, 51: 56, 52: 57, 53: 65, 54: 66, 55: 67, 56:\n68, 57: 69, 58: 70, 59: 72, 60: 73, 61: 74, 62: 75, 63: 76, 64: 77, 65: 78, 66: 81, 67: 82, 68: 83, 69: 84, 70: 85, 71: 86, 72: 87, 73: 88, 74: 89,\n75: 90, 76: 91, 77: 92, 78: 93, 79: 94, 80: 95, 81: 96, 82: 97, 83: 98, 84: 99, 85: 100, 86: 101, 87: 102, 88: 103, 89: 104, 90: 105, 91: 106, 92:\n107, 93: 108, 94: 109, 95: 114, 96: 115, 97: 116, 98: 117, 99: 118, 100: 119, 101: 120, 102: 121, 103: 122, 104: 123, 105: 124, 106: 125, 107: 126,\n108: 127}, ('martin', 'H'): {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18:\n18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 35, 32: 36, 33: 37, 34: 38, 35: 39, 36: 40,\n37: 41, 38: 42, 39: 43, 40: 44, 41: 45, 42: 46, 43: 47, 44: 48, 45: 49, 46: 50, 47: 51, 48: 52, 49: 53, 50: 54, 51: 55, 52: 59, 53: 60, 54: 61, 55:\n62, 56: 63, 57: 64, 58: 65, 59: 66, 60: 67, 61: 68, 62: 69, 63: 70, 64: 72, 65: 73, 66: 74, 67: 75, 68: 76, 69: 77, 70: 78, 71: 79, 72: 83, 73: 84,\n74: 85, 75: 86, 76: 87, 77: 88, 78: 89, 79: 90, 80: 91, 81: 92, 82: 93, 83: 94, 84: 95, 85: 96, 86: 97, 87: 98, 88: 99, 89: 100, 90: 101, 91: 102, 92:\n103, 93: 104, 94: 105, 95: 106, 96: 107, 97: 108, 98: 109, 99: 110, 100: 114, 101: 115, 102: 116, 103: 117, 104: 118, 105: 119, 106: 120, 107: 121,\n108: 122, 109: 123, 110: 124, 111: 125, 112: 126, 113: 127}, ('kabat', 'L'): {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12:\n11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 26: 25, 27: 32, 28: 33, 29: 34, 30: 35,\n31: 36, 32: 37, 33: 38, 34: 39, 35: 40, 36: 41, 37: 42, 38: 43, 39: 44, 40: 45, 41: 46, 42: 47, 43: 48, 44: 49, 45: 50, 46: 51, 47: 52, 48: 53, 49:\n54, 50: 55, 51: 56, 52: 57, 53: 65, 54: 66, 55: 67, 56: 68, 57: 69, 58: 70, 59: 72, 60: 73, 61: 74, 62: 75, 63: 76, 64: 77, 65: 78, 66: 81, 67: 82,\n68: 83, 69: 84, 70: 85, 71: 86, 72: 87, 73: 88, 74: 89, 75: 90, 76: 91, 77: 92, 78: 93, 79: 94, 80: 95, 81: 96, 82: 97, 83: 98, 84: 99, 85: 100, 86:\n101, 87: 102, 88: 103, 89: 104, 90: 105, 91: 106, 92: 107, 93: 108, 94: 109, 95: 114, 96: 115, 97: 116, 98: 117, 99: 118, 100: 119, 101: 120, 102:\n121, 103: 122, 104: 123, 105: 124, 106: 125, 107: 126, 108: 127}, ('imgt', 'L'): {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10,\n12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 26: 25, 27: 26, 28: 27, 29: 28, 30:\n29, 31: 30, 32: 31, 33: 32, 34: 33, 35: 34, 36: 35, 37: 36, 38: 37, 39: 38, 40: 39, 41: 40, 42: 41, 43: 42, 44: 43, 45: 44, 46: 45, 47: 46, 48: 47,\n49: 48, 50: 49, 51: 50, 52: 51, 53: 52, 54: 53, 55: 54, 56: 55, 57: 56, 58: 57, 59: 58, 60: 59, 61: 60, 62: 61, 63: 62, 64: 63, 65: 64, 66: 65, 67:\n66, 68: 67, 69: 68, 70: 69, 71: 70, 72: 71, 73: 72, 74: 73, 75: 74, 76: 75, 77: 76, 78: 77, 79: 78, 80: 79, 81: 80, 82: 81, 83: 82, 84: 83, 85: 84,\n86: 85, 87: 86, 88: 87, 89: 88, 90: 89, 91: 90, 92: 91, 93: 92, 94: 93, 95: 94, 96: 95, 97: 96, 98: 97, 99: 98, 100: 99, 101: 100, 102: 101, 103: 102,\n104: 103, 105: 104, 106: 105, 107: 106, 108: 107, 109: 108, 110: 109, 111: 110, 112: 111, 113: 112, 114: 113, 115: 114, 116: 115, 117: 116, 118: 117,\n119: 118, 120: 119, 121: 120, 122: 121, 123: 122, 124: 123, 125: 124, 126: 125, 127: 126, 128: 127}, ('martin', 'L'): {1: 0, 2: 1, 3: 2, 4: 3, 5: 4,\n6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24,\n26: 25, 27: 26, 28: 27, 29: 28, 30: 35, 31: 36, 32: 37, 33: 38, 34: 39, 35: 40, 36: 41, 37: 42, 38: 43, 39: 44, 40: 45, 41: 46, 42: 47, 43: 48, 44:\n49, 45: 50, 46: 51, 47: 52, 48: 53, 49: 54, 50: 55, 51: 56, 52: 57, 53: 65, 54: 66, 55: 67, 56: 68, 57: 69, 58: 70, 59: 72, 60: 73, 61: 74, 62: 75,\n63: 76, 64: 77, 65: 78, 66: 81, 67: 82, 68: 83, 69: 84, 70: 85, 71: 86, 72: 87, 73: 88, 74: 89, 75: 90, 76: 91, 77: 92, 78: 93, 79: 94, 80: 95, 81:\n96, 82: 97, 83: 98, 84: 99, 85: 100, 86: 101, 87: 102, 88: 103, 89: 104, 90: 105, 91: 106, 92: 107, 93: 108, 94: 109, 95: 114, 96: 115, 97: 116, 98:\n117, 99: 118, 100: 119, 101: 120, 102: 121, 103: 122, 104: 123, 105: 124, 106: 125, 107: 126, 108: 127}}\n\nwolfguy_indexdiv50_to_region = {'H': [ 'fwh1', 'cdrh1','fwh2', 'cdrh2','fwh3', 'cdrh3', 'fwh4'], \n                                'L': [ 'fwl1', 'cdrl1','fwl2', 'cdrl2','fwl3', 'cdrl3', 'fwl4'] }\n\n_reg_one2three = { \"1\":\"fw%s1\",\"2\":\"cdr%s1\",\"3\":\"fw%s2\",\"4\":\"cdr%s2\",\"5\":\"fw%s3\",\"6\":\"cdr%s3\",\"7\":\"fw%s4\" }\n\ndef get_region( position, chain, numbering_scheme=\"chothia\", definition=\"chothia\" ):\n    \"\"\"\n    Get the region in which the position belongs given the chain, numbering scheme and definition.\n\n    **Note** this function does not know about insertions on the sequence. Therefore, it will get the region annotation\n    wrong when using non-equivalent scheme-definitions. \n\n    To get around this please use the annotate_regions function which implements heuristics to get the definition correct\n    in the scheme.\n\n    \"\"\"\n    index, insertion = position\n    chain=chain.upper()\n\n    # Horrible exception cases revolving around the kabat scheme/definition and cdr h1\n    if definition == \"kabat\":  \n        if numbering_scheme == \"kabat\" and chain == \"H\" and 31 <= index < 36: # Kabat scheme kabat definition.\n            if index == 35:\n                if insertion in \" AB\": # Position 31 to 35B\n                    return \"cdrh1\"\n                else:\n                    return \"fwh2\" # 31C would be framework.                   \n            else:\n                return \"cdrh1\"\n    if numbering_scheme == \"kabat\": # Kabat numbering, chothia or imgt definitions.\n        if definition==\"chothia\" and chain == \"H\" and 33 <= index < 36:\n            return \"fwh2\"\n        elif definition==\"imgt\" and chain == \"H\" and 34 <= index < 36:\n            return \"fwh2\"\n\n    if numbering_scheme == \"wolfguy\" or definition == \"wolfguy\":\n        assert definition == \"wolfguy\" and numbering_scheme == \"wolfguy\", \"The wolfguy numbering scheme must be used with the wolfguy CDR definition\"\n        if chain == 'H':\n            if index > 411: return \"\"\n            r = int(index/50)-2\n        elif chain == 'L':\n            if index > 810: return \"\"\n            r = int(index/50)-10\n        try:\n            return wolfguy_indexdiv50_to_region[chain][r]\n        except IndexError:\n            return \"\"\n\n    try:\n        return _reg_one2three[_regions[definition][chain][  _index_to_imgt_state[ (numbering_scheme, chain) ][index] ]]%chain.lower()\n    except KeyError:\n        return \"?\"\n\n# Heuristics to locate the different definitions in different numbering scheme\n# TODO\n# All definitions in the Aho scheme\n# All definitions in wolfguy scheme (apart from wolfguy)\ndef annotate_regions(numbered_sequence, chain,numbering_scheme=\"chothia\",definition=\"chothia\"):\n    \"\"\"\n    Given a numbered sequence annotate which region each residue belongs to.\n    \n    The numbering scheme can be one chothia, kabat, imgt or martin\n    The definition can be chothia, kabat, imgt, north or contact.\n    \n    Contact definition cannot be used with the kabat numbering scheme.\n\n    If possible, use the corresponding numbering scheme and definition.\n\n    This function automates the heuristics recognise different definitions in each scheme. However, \n    some of the conversions are non-trivial. \n\n    \"\"\"\n    # In some cases there is not a direct equivalence between numbering schemes. Therefore, a CDR definition\n    # may not be easily translatable from scheme to scheme. This is the case for:\n    #   - H1 Kabat   definition in the IMGT    scheme   # 1\n    #   - H1 Chothia definition in the Kabat   scheme   # 2\n    #   - H1 IMGT    definition in the Kabat   scheme   # 3\n    #   - H1 Chothia definition in the Kabat   scheme   # 4\n    #   - L2 IMGT    definition in the Kabat   scheme   # 4\n    #   - L2 IMGT    definition in the Chothia scheme   # 5\n    #   - L2 IMGT    definition in the Martin  scheme   # 6\n\n    # Below are heuristics to allow the conversion. They have been developed so that the CDR sequence extracted\n    # in all schemes is the same as the CDR sequence in the scheme the definition was originally defined. e.g.\n    # Chothia for Chothia, Kabat for Kabat, IMGT for IMGT. Note that the Contact definition *cannot* be defined\n    # in Kabat numbering. \n\n    # Find which additional positions should be considered in the CDR, given the sequence.\n    assert numbering_scheme in ['chothia','martin','kabat','imgt'], 'Unimplemented'\n    additional_positions = {}\n    excluded_positions = {}\n    c = chain.lower()\n\n    numdict = dict( numbered_sequence )\n\n    cdr_acceptors = { 1:Accept(numbering_scheme=numbering_scheme, definition=definition),\n                      2:Accept(numbering_scheme=numbering_scheme, definition=definition),\n                      3:Accept(numbering_scheme=numbering_scheme, definition=definition) }\n\n    cdr_acceptors[1].set_regions( [\"cdr%s1\"%c] )\n    cdr_acceptors[2].set_regions( [\"cdr%s2\"%c] )\n    cdr_acceptors[3].set_regions( [\"cdr%s3\"%c] )\n\n    # Heavy chain \n    if chain == \"H\":\n        if numbering_scheme == \"imgt\" and definition == \"kabat\": # IMGT scheme / Kabat definition\n            # 1\n            # Count the positions 31-34 inclusive. These become insertions on 35 in Kabat.\n            ins = 0 \n            for i in range( 31, 35 ): \n                if (i, \" \") in numdict: \n                    if numdict[ (i, \" \") ] != \"-\": ins +=1\n            for a in \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\":\n                if (33, a) in numdict: \n                    if numdict[ (33, a) ] != \"-\": ins +=1\n                else: break\n            # If insertions would occur on 35 in the Kabat scheme, extend the IMGT numbering back until you hit 31. Then put on the insertions at 32\n            if ins: # Add postions backwards based on the number of insertions starting with H35.\n                    # IMGT insertions go on 33 \n                cdr_acceptors[1].add_positions( ([ (35, \" \"), (34, \" \"), (33, \" \"), (32, \" \") ]+[(33, a) for a in \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"])[:ins], \"H\" )\n                # If there more than two insertions we have to start removing positions from the definition. See # 4 below for more of an explanation\n                if ins >2:\n                    cdr_acceptors[1].exclude_positions( ([(40,\" \"),(39,\" \"),(38,\" \"),(37,\" \"),(36,\" \"),(35,\" \"),(34,\" \")]+[(33, a) for a in \"FGHIJKLMNOPQRSTUVWXYZ\"])[:ins-2], \"H\" )\n        elif numbering_scheme == \"kabat\" and definition in [\"chothia\",\"imgt\"]: # Kabat scheme / Chothia or IMGT definition\n            # 2, 3\n            # Count the insertions on 35. These happen outside the CDR definitions of IMGT or Chothia.\n            # They therefore are missed by a straight conversion. The equivalence is dependent on the \n            # number of insertions at this position.\n\n            # Count the number of insertions on H35.\n            ins = 0\n            for a in \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\":\n                if (35, a) in numdict: \n                    if numdict[(35,a)] != \"-\":\n                        ins +=1\n                else: break\n            if ins: # Add postions based on the number of insertions starting with H33 for the Chothia definition. H34 for the IMGT definition.\n                if definition == \"chothia\":\n                    cdr_acceptors[1].add_positions( ([(33, \" \"),(34,\" \")]+[(35, a) for a in \" ABCDEFGHIJKLMNOPQRSTUVWXYZ\"])[:ins], \"H\" )\n                elif definition == \"imgt\":\n                    cdr_acceptors[1].add_positions( ([(34, \" \")]+[(35, a) for a in \" ABCDEFGHIJKLMNOPQRSTUVWXYZ\"])[:ins] , \"H\" )\n        elif numbering_scheme in [\"chothia\", \"martin\"] and definition == \"kabat\":\n            # 4\n            # Count the insertions on 31. If there are more than two, exclude back from 35. \n            # e.g. if we have the below. Kabat and Chothia numbered Kabat CDRs\n            # [((31, ' '), 'P'), ((32, ' '), 'A'), ((33, ' '), 'P'), ((34, ' '), 'E'), ((35, ' '), 'H'), ((35, 'A'), 'F'), ((35, 'B'), 'I')]\n            # [((31, ' '), 'P'), ((31, 'A'), 'A'), ((31, 'B'), 'P'), ((31, 'C'), 'E'), ((32, ' '), 'H'), ((33, ' '), 'F'), ((34, ' '), 'I')] \n            # Kabat definition will have a max of length 7 as insertions are on 35 and the definition ends at 35B.\n            # In Chothia numbering the insertions are at 31. Hence when more than 2 insertions occur Chothia 35 falls off the end. Chothia 34\n            # becomes the end of the Kabat CDR. Similar thing happens with IMGT. \n            # Count the number of insertions on H31.\n            ins = 0\n            for a in \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\":\n                if (31, a) in numdict: \n                    if numdict[(31,a)] != \"-\":\n                        ins +=1\n                else: break\n            if ins > 2:\n                cdr_acceptors[1].exclude_positions(  ([ (35,\" \"),(34,\" \"),(33,\" \"), (32,\" \")]+[(31, a) for a in \"GHIJKLMNOPQRSTUVWXYZ\"])[:ins-2], \"H\" )\n\n    # Light chain\n    if chain == \"L\":\n        # 5,6,7\n        if numbering_scheme in [\"kabat\", \"chothia\", \"martin\"] and definition == \"imgt\": # Kabat-like schemes and IMGT definition\n            # Count the number of insertions on L54.\n            ins = 0\n            for a in \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\":\n                if (54, a) in numdict: \n                    if numdict[(54,a)] != \"-\":\n                        ins +=1\n                else: break\n            if ins: # Add positions based on the number of insertions starting with L53. \n                    # IMGT definition with no insertions ends and 52 in Kabat/Chothia/Martin.\n                extensions = [ (53,\" \") ] + [ (54, a) for a in \" ABCDEFGHIJKLMNOPQRSTUVWXYZ\"]\n                cdr_acceptors[2].add_positions( ([ (53,\" \") ] + [ (54, a) for a in \" ABCDEFGHIJKLMNOPQRSTUVWXYZ\"])[:ins], \"L\")\n\n    \n    fw_regions = [ \"fw%s1\"%c,\"fw%s2\"%c,\"fw%s3\"%c,\"fw%s4\"%c ]\n    fw_region = \"fw%s1\"%c\n    region_annotations = []\n    cterm = max( _index_to_imgt_state[ (numbering_scheme, chain ) ].keys() )\n    for r, a in numbered_sequence:\n        if cdr_acceptors[1].accept( r, chain ):\n            region_annotations.append( (r, a, \"cdr%s1\"%c))\n            fw_region = \"fw%s2\"%c\n        elif cdr_acceptors[2].accept( r, chain ):\n            region_annotations.append( (r, a, \"cdr%s2\"%c))\n            fw_region = \"fw%s3\"%c\n        elif cdr_acceptors[3].accept( r, chain ):\n            region_annotations.append( (r, a, \"cdr%s3\"%c))\n            fw_region = \"fw%s4\"%c\n        elif r[0] <= cterm and r[0] > 0: # Anything out of the variable region is not assigned a region i.e. ''\n            region_annotations.append( (r, a, fw_region ) )\n        else:\n            region_annotations.append( (r, a, '' ) )\n\n    return region_annotations\n\n\nclass Accept:\n    \"\"\"\n    A class to select which positions should be compared.\n    \"\"\"\n    _defined_regions = [\"fwh1\", \"fwh2\", \"fwh3\", \"fwh4\", \"fwl1\", \"fwl2\", \"fwl3\", \"fwl4\", \"cdrh1\", \"cdrh2\", \"cdrh3\", \"cdrl1\", \"cdrl2\", \"cdrl3\"]\n    _macro_regions= { \"hframework\":set([\"fwh1\", \"fwh2\", \"fwh3\", \"fwh4\"]),\n                      \"hcdrs\"     :set([\"cdrh1\", \"cdrh2\", \"cdrh3\"]),\n                      \"lframework\":set([\"fwl1\", \"fwl2\", \"fwl3\", \"fwl4\"]),    \n                      \"lcdrs\"     :set([\"cdrl1\", \"cdrl2\", \"cdrl3\"]) }\n    _macro_regions.update( { \"framework\": _macro_regions[\"hframework\"] | _macro_regions[\"lframework\"],\n                             \"cdrs\": _macro_regions[\"hcdrs\"] | _macro_regions[\"lcdrs\"],\n                             \"vh\": _macro_regions[\"hcdrs\"] | _macro_regions[\"hframework\"],\n                             \"vl\": _macro_regions[\"lcdrs\"] | _macro_regions[\"lframework\"],\n                            })\n                           \n    _macro_regions.update( { \"fv\": _macro_regions[\"vh\"] | _macro_regions[\"vl\"] } )\n\n    _macro_positions = {}\n\n    def __init__(self, numbering_scheme=\"chothia\", definition=\"chothia\", NOT=False):\n        self.NOT = NOT\n        self.set_regions()\n        self.positions={\"H\":set(),\"L\":set()}\n        self.numbering_scheme = numbering_scheme\n        self.definition = definition\n        self.exclude={\"H\":set(),\"L\":set()}\n\n    def set_regions( self, regions=[] ):\n        \"\"\"\n        Set the regions to be used. Will clear anything added using add regions.\n        \"\"\"\n        if self.NOT:\n            self.regions= self._macro_regions[ \"fv\" ]\n        else:   \n            self.regions = set()\n        self.add_regions( regions )\n\n    def add_regions(self, regions):\n        \"\"\"\n        Add regions to the selection. \n        \"\"\"\n        for region in regions:\n            region = region.lower()\n            if region in self._defined_regions:\n                if self.NOT:\n                    self.regions = self.regions - set([ region ])\n                else:\n                    self.regions.add( region )\n            elif region in self._macro_regions:\n                if self.NOT:\n                    self.regions = self.regions - self._macro_regions[region]\n                else:\n                    self.regions = self.regions | self._macro_regions[region]\n            elif region in self._macro_positions: # e.g. interface positions\n                raise AssertionError\n            else:\n                raise AssertionError\n\n    def add_positions( self, positions, chain ):\n        for position in positions:\n            index, insertion = position\n            self.positions[chain].add( (index, insertion) )\n\n    def exclude_positions( self, positions, chain ):\n        for position in positions:\n            index, insertion = position\n            self.exclude[chain].add( (index, insertion) )\n\n    def accept(self, position, chain):\n        if position in self.exclude[chain]: return\n        if get_region(position, chain, self.numbering_scheme, self.definition) in self.regions or position in self.positions[chain]:\n            return 1\n\nif __name__ == '__main__':\n    import argparse\n    import sys\n    parser = argparse.ArgumentParser(prog=\"ImmunoPDB\", description=description, epilog=epilogue,formatter_class=argparse.RawDescriptionHelpFormatter)\n    parser.add_argument( '-i', type=str, help=\"A structure to be numbered\", dest=\"inputstructure\")\n    parser.add_argument( '-o', type=str, default=False, help=\"The output file to use. Default is stdout\", dest=\"outfile\")\n    parser.add_argument( '--scheme','-s', type=str, choices=scheme_names+['pdb'], default=\"imgt\", help=\"Which numbering scheme should be used. i, k, c, m, w and a are shorthand for IMGT, Kabat, Chothia, Martin (Extended Chothia), Wolfguy and Aho respectively. Default IMGT. Use pdb to retain the numbering but get the annotations as remarks\", dest=\"scheme\")\n    parser.add_argument( '--receptor','-r', type=str, choices=[\"ig\",\"tr\"], default='ig', help=\"Choose whether to number Antibody (ig) or TCR (tr) domains.\", dest=\"receptor\")\n    parser.add_argument( '--rename', action='store_true',default=False,help='Rename the receptor chains with H and L (ig) or B and A (tr). Only receptor chains output. First pair identified used.',dest='rename')\n    parser.add_argument( '--fvonly', action='store_true',default=False,help='Only output Fv regions.',dest='fvonly')\n    parser.add_argument( '--splitscfv', action='store_true',default=False,help='When they are found split single chain fvs into two seperate chains (fvonly becomes true)',dest='splitscfv')\n    parser.add_argument( '--warnings', action='store_true',default=False,help='Report warnings about missing residues',dest='warnings')        \n    args = parser.parse_args()\n    \n    if len(sys.argv) < 2:\n        parser.print_help()\n        sys.exit(0)\n\n\n    # Work arounds for either returning pdb scheme or where I have not yet implemented the regions in the scheme.\n    # Assign the regions in imgt then renumber back in the chosen scheme\n    # This is slow for the second case (double numbering).\n    switchback=False    \n    if args.scheme == 'pdb' or ((args.fvonly or args.splitscfv) and args.scheme in ['aho','wolfguy']): \n        switchback = args.scheme\n        args.scheme = 'imgt'\n\n    if args.scheme != 'pdb':\n        args.scheme = scheme_short_to_long[args.scheme.lower()]\n\n    if args.receptor == 'ig':\n        sparser = AntibodyPDBParser(QUIET=True, scheme=args.scheme, warnings=args.warnings)\n    elif args.receptor == 'tr':\n        if args.scheme not in ['imgt','i','aho','a']: \n            print('Only imgt or aho schemes can be applied to tcrs', file=sys.stderr)\n            sys.exit(1)\n        sparser = TcrPDBParser(QUIET=True, scheme=args.scheme, warnings=args.warnings)\n\n    name = os.path.splitext(os.path.split(args.inputstructure)[1])[0]\n    try:        \n        structure = sparser.get_structure(name, args.inputstructure)\n    except IOError:\n        print('File %s could not be opened'%args.inputstructure, file=sys.stderr)\n        sys.exit(1)\n    except Exception as e:\n        print('%s could not be parsed:'%args.inputstructure, e, file=sys.stderr)\n        sys.exit(1)\n\n    # Switch back to the numbering scheme of choice. \n    if switchback:\n        structure.switch_numbering_scheme(switchback)\n        args.scheme=switchback\n\n    # Output the structure according to the input options. \n    try:\n        if args.outfile:\n            of = open(args.outfile,'w')\n        else:\n            of = sys.stdout\n        print('REMARK   6 SCHEME %s'%args.scheme.upper(), file=of)\n        print('REMARK   6 ANARCI TYPE, PAIRING AND ASSIGNED GERMLINE DETAILS', file=of)\n        if args.splitscfv: split_scfv( structure )         \n        if args.rename: rename_chains( structure )\n        for chain in structure.get_chains():\n            print('REMARK   6 '+'\\nREMARK   6 '.join(compile_remarks(chain, args.receptor.upper(), only_loaded=args.splitscfv)), file=of)\n        for chain in structure.get_chains():\n            sr = compile_seqres( chain )\n            if sr:\n                print(sr, file=of)\n        if args.fvonly:\n            structure.save(of,select=SelectFv())\n        elif args.splitscfv:\n            structure.save(of,select=SelectFvScFv())\n        else:\n            structure.save(of)\n        if args.outfile:\n            of.close()\n    except IOError:\n        print('Could not write to file %s'%(args.outfile), file=sys.stderr)\n        sys.exit(1)\n    except Exception as e:\n        print(e, file=sys.stderr)\n        sys.exit(1)\n    sys.exit(0)\n\n"
  },
  {
    "path": "Example_scripts_and_sequences/anarci_API_example.py",
    "content": "\n# Import the anarci function.\nfrom anarci import anarci\n\n# Format the sequences that we want to number. \nsequences = [ (\"12e8:H\",\"EVQLQQSGAEVVRSGASVKLSCTASGFNIKDYYIHWVKQRPEKGLEWIGWIDPEIGDTEYVPKFQGKATMTADTSSNTAYLQLSSLTSEDTAVYYCNAGHDYDRGRFPYWGQGTLVTVSAAKTTPPSVYPLAP\"),\n              (\"12e8:L\",\"DIVMTQSQKFMSTSVGDRVSITCKASQNVGTAVAWYQQKPGQSPKLMIYSASNRYTGVPDRFTGSGSGTDFTLTISNMQSEDLADYFCQQYSSYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASV\"),\n              (\"scfv:A\",\"DIQMTQSPSSLSASVGDRVTITCRTSGNIHNYLTWYQQKPGKAPQLLIYNAKTLADGVPSRFSGSGSGTQFTLTISSLQPEDFANYYCQHFWSLPFTFGQGTKVEIKRTGGGGSGGGGSGGGGSGGGGSEVQLVESGGGLVQPGGSLRLSCAASGFDFSRYDMSWVRQAPGKRLEWVAYISSGGGSTYFPDTVKGRFTISRDNAKNTLYLQMNSLRAEDTAVYYCARQNKKLTWFDYWGQGTLVTVSSHHHHHH\"),\n              (\"lysozyme:A\",\"KVFGRCELAAAMKRHGLDNYRGYSLGNWVCAAKFESNFNTQATNRNTDGSTDYGILQINSRWWCNDGRTPGSRNLCNIPCSALLSSDITASVNCAKKIVSDGNGMNAWVAWRNRCKGTDVQAWIRGCRL\")]\n\n# Hand the list of sequences to the anarci function. Number them with the IMGT scheme\nresults = anarci(sequences, scheme=\"imgt\", output=False)\n\n# Unpack the results. We get three lists\nnumbering, alignment_details, hit_tables = results\n\n# Each has the same number of elements as the number of sequences submitted\nassert len(numbering) == len(alignment_details) == len(hit_tables) == len( sequences )\n\nprint('I am using the anarci function to number and get all the details about the following sequences')\nprint(sequences)\n\nprint('\\n')\n# Iterate over the sequences\nfor i in range(len(sequences)):    \n    if numbering[i] is None:\n        print('ANARCI did not number', sequences[i][0])\n    else:\n        print('ANARCI numbered', sequences[i][0])\n        print('It identified %d domain(s)'%len(numbering[i]))\n        \n        # Iterate over the domains\n        for j in range(len(numbering[i])):\n            domain_numbering, start_index, end_index = numbering[i][j]\n            print('This is the IMGT numbering for the %d\\'th domain:'%j, domain_numbering)\n            print('This is the bit of the sequence it corresponds to:', sequences[i][1][start_index:end_index+1])\n            print('These are the details of the alignment:')\n            for (key,value) in alignment_details[i][j].items():\n                print(key, ':', value)\n            print('This is the summary of the hits that HMMER found')\n            for line in hit_tables[i]:\n                print(line)      \n    print('\\n','_'*40)\n    \nprint('Do with this infomation as you wish')\n\nprint('\\n','*'*40)\n\n# Want to just get a quick numbering without caring about the other details?\nfrom anarci import number\n\nseq = \"EVQLQQSGAEVVRSGASVKLSCTASGFNIKDYYIHWVKQRPEKGLEWIGWIDPEIGDTEYVPKFQGKATMTADTSSNTAYLQLSSLTSEDTAVYYCNAGHDYDRGRFPYWGQGTLVTVSAAKTTPPSVYPLAP\"\nnumbering, chain_type = number( seq, scheme = 'kabat' )\nprint('Alternatively we can simply number the first domain of a sequence with the number function')\nprint('I gave it this sequence\\n', seq)\nprint('ANARCI told me it was a', chain_type, 'chain')\nprint('This is the first domain\\'s Kabat numbering:')\nprint(numbering)\n"
  },
  {
    "path": "Example_scripts_and_sequences/antibody_sequences.fasta",
    "content": ">1mhp_Y\nIQLTQSPSSLSASVGDRVTITCSASSSVNHMFWYQQKPGKAPKPWIYLTSNLASGVPSRFSGSGSGTDYTLTISSLQPEDFATYYCQQWSGNPWTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1mhp_X\nEVQLVESGGGLVQPGGSLRLSCAASGFTFSRYTMSWVRQAPGKGLEWVATISGGGHTYYLDSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCTRGFGDGGYFDVWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>4c57_C\nQVQLQESGGGLVQPGGSLRLSCSASGFKFNDSYMSWVRRVPGKGLEWVAGIWEDSSAAHYRDSVKGRFTISRDNAKNMLYLQMSSLKSDDTGLYYCVRRGYSGDYRPINNPSSQGTQVTVSSAAAYPYDVPDYGSHHHHHH\n>4c57_D\nQVQLQESGGGLVQPGGSLRLSCSASGFKFNDSYMSWVRRVPGKGLEWVAGIWEDSSAAHYRDSVKGRFTISRDNAKNMLYLQMSSLKSDDTGLYYCVRRGYSGDYRPINNPSSQGTQVTVSSAAAYPYDVPDYGSHHHHHH\n>1xiw_H\nEVQLQQSGPELVKPGASMKISCKASGYSFTGYTMNWVKQSHGKNLEWMGLINPYKGVSTYNQKFKDKATLTVDKSSSTAYMELLSLTSEDSAVYYCARSGYYGDSDWYFDVWGQGTTLTVFS\n>1xiw_C\nMDIQMTQTTSSLSASLGDRVTISCRASQDIRNYLNWYQQKPDGTVKLLIYYTSRLHSGVPSKFSGSGSGTDYSLTISNLEQEDIATYFCQQGNTLPWTFAGGTKLEIK\n>2hh0_H\nVQLLEQSGAELVKPGASVKLSCTASGFNIEDSYIHWVKQRPEQGLEWIGRIDPEDGETKYAPKFQGKATITADTSSNTAYLHLRRLTSEDTAIYYCGRGAYYIKEDFWGQGTTLTVSSASTKGPSVFPLAPSSKAGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPA\n>2hh0_L\nLVMTQTPSSLSASLGERVSLTCRASQDIGNNLNWIQQKPDGTIKRLIYATSSLDSGVPKRFSGSRSGSDYSLTISSLESEDFADYYCLQHDTFPLTFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNR\n>4kjq_C\nEVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>4kjq_E\nEVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>1mhh_A\nDIVMSQSPSSLAVSAGEKVTMSCKSSQSLLNSRTRKNYLAWYQQKPGQSPKVLIYWASTRESGVPDRFTGRGSGTDFTLTISSVQAEDQAVYYCKQAYIPPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEX\n>1mhh_C\nDIVMSQSPSSLAVSAGEKVTMSCKSSQSLLNSRTRKNYLAWYQQKPGQSPKVLIYWASTRESGVPDRFTGRGSGTDFTLTISSVQAEDQAVYYCKQAYIPPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEX\n>1yqv_H\nEVQLQQSGAELMKPGASVKISCKASGYTFSDYWIEWVKQRPGHGLEWIGEILPGSGSTNYHERFKGKATFTADTSSSTAYMQLNSLTSEDSGVYYCLHGNYDFDGWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKILD\n>1yqv_L\nMDIVLTQSPAIMSASPGEKVTMTCSASSSVNYMYWYQQKSGTSPKRWIYDTSKLASGVPVRFSGSGSGTSYSLTISSMETEDAATYYCQQWGRNPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1yc7_A\nDVQLVESGGGSVQAGGSLRLSCAVSGSTYSPCTTGWYRQAPGKEREWVSSISSPGTIYYQDSVKGRFTISRDNAKNTVYLQMNSLQREDTGMYYCQIQCGVRSIREYWGQGTQVTVSSHHHHHH\n>1yc7_B\nDVQLVESGGGSVQAGGSLRLSCAVSGSTYSPCTTGWYRQAPGKEREWVSSISSPGTIYYQDSVKGRFTISRDNAKNTVYLQMNSLQREDTGMYYCQIQCGVRSIREYWGQGTQVTVSSHHHHHH\n>1yc8_A\nDVQLVESGGGSVQAGGSLRLSCAVSGSTYSPCTTGWVRQAPGKGLEWVSSISSPGTIYYQDSVKGRFTISRDNAKNTVYLQMNSLQREDTGMYYCQIQCGVRSIREYWGQGTQVTVSSHHHHHH\n>1yc8_B\nDVQLVESGGGSVQAGGSLRLSCAVSGSTYSPCTTGWVRQAPGKGLEWVSSISSPGTIYYQDSVKGRFTISRDNAKNTVYLQMNSLQREDTGMYYCQIQCGVRSIREYWGQGTQVTVSSHHHHHH\n>1vge_H\nQVKLLEQSGAEVKKPGASVKVSCKASGYSFTSYGLHWVRQAPGQRLEWMGWISAGTGNTKYSQKFRGRVTFTRDTSATTAYMGLSSLRPEDTAVYYCARDPYGGGKSEFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>1vge_L\nELVMTQSPSSLSASVGDRVNIACRASQGISSALAWYQQKPGKAPRLLIYDASNLESGVPSRFSGSGSGTDFTLTISSLQPEDFAIYYCQQFNSYPLTFGGGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1hh9_A\nDIKMTQSPSSMYTSLGERVTITCKASQDINSFLTWFLQKPGKSPKTLIYRANRLMIGVPSRFSGSGSGQTYSLTISSLEYEDMGIYYCLQYDDFPLTFGAGTKLDLKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKEINVKWKIDGSERQNGVLDSWTEQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1hh9_B\nQDQLQQSGAELVRPGASVKLSCKALGYIFTDYEIHWVKQTPVHGLEWIGGIHPGSSGTAYNQKFKGKATLTADKSSTTAFMELSSLTSEDSAVYYCTRKDYWGQGTLVTVSAAKTTAPSVYPLVPVCGGTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPALLQSGLYTLSSSVTVTSNTWPSQTITCNVAHPASSTKVDKKIEPRV\n>1mh5_A\nDIVMTQAAPSVSVTPGESVSISCRSSKSLLHSNGNTYLYWFLQRPGQSPQLLIYRMSNLASGVPDRFSGSGSGTAFTLRISRVEAEDVGVYYCLQHLEYPFTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1mh5_H\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSNWINWVKQRPGQGLEWIGNIYPDSYRTNYNEKFKRKATLTVDTSSSTAYMQLSSLTSDDSAVYYCVRKHYSYDGVVYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTSGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPTIKPCPPCK\n>4kq3_H\nEVQLVQSGAEVKKPGSSVKVSCKASGGTFSSYAISWVRQAPGQGLEWMGSIIPWFGTTNYAQKFQGRVTITADESTSTAYMELSSLRSEDTAVYYCARDSEYYFDHWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCHHHHHH\n>4kq3_L\nDIQMTQSPSSVSASVGDRVTITCRASQGISNWLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQYSDDPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4kq4_H\nQVQLQQSGAELVRPGVSVRISCKGSGYTFTDYAMHWVKQSHAKSLEWIGVISTYSGDARFNQKFTGKATMTVDKSSSTAYMELARLTSEDSAIYYCAREVRRSMDYWGQGTSVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCHHHHHH\n>4kq4_L\nDIVMTQSHKFMSTSVGDRVSITCKASQDVSTAVAWYQQKPGQSPKLLIYWASTRHTGVPDRFTGSGSGTDYTLTISSVQAEDLALYYCQQHYSTPYTFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1hh6_A\nDIKMTQSPSSMYTSLGERVTITCKASQDINSFLTWFLQKPGKSPKTLIYRANRLMIGVPSRFSGSGSGQTYSLTISSLEYEDMGIYYCLQYDDFPLTFGAGTKLDLKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKEINVKWKIDGSERQNGVLDSWTEQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1hh6_B\nQDQLQQSGAELVRPGASVKLSCKALGYIFTDYEIHWVKQTPVHGLEWIGGIHPGSSGTAYNQKFKGKATLTADKSSTTAFMELSSLTSEDSAVYYCTRKDYWGQGTLVTVSAAKTTAPSVYPLVPVCGGTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPALLQSGLYTLSSSVTVTSNTWPSQTITCNVAHPASSTKVDKKIEPRV\n>1pg7_I\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKEYYMHWVRQAPGKGLEWVGLIDPEQGNTIYDPKFQDRATISADNSKNTAYLQMNSLRAEDTAVYYCARDTAAYFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>1pg7_H\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKEYYMHWVRQAPGKGLEWVGLIDPEQGNTIYDPKFQDRATISADNSKNTAYLQMNSLRAEDTAVYYCARDTAAYFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>2atk_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>2atk_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1t2j_A\nQVQLQESGGGLVQPGGSLRLSCAASGFTFSNSAMSWVRQAPGKGLEWVSSISGSGGNTYSADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARDWYGMDVWGQGTTVTVSS\n>1i9i_H\nEVKLVESGGGLVKPGGSLKLSCAASGFTFSTYALSWVRQTADKRLEWVASIVSGGNTYYSGSVKGRFTISRDIARNILYLQMSSLRSEDTAMYYCAREYYGYVGLAYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>1i9i_L\nDVVVTQTPLSLPVSLGDQASISCRSSQSIVHSNGNSYLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHVPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1n0x_H\nQVQLVQSGAEVKKPGASVKVSCQASGYRFSNFVIHWVRQAPGQRFEWMGWINPYNGNKEFSAKFQDRVTFTADTSANTAYMELRSLRSADTAVYYCARVGPYSWDDSPQDNYYMDVWGKGTTVIVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>1n0x_K\nQVQLVQSGAEVKKPGASVKVSCQASGYRFSNFVIHWVRQAPGQRFEWMGWINPYNGNKEFSAKFQDRVTFTADTSANTAYMELRSLRSADTAVYYCARVGPYSWDDSPQDNYYMDVWGKGTTVIVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>1i9j_H\nEVKLVESGGGLVKPGGSLKLSCAASGFTFSTYALSWVRQTADKRLEWVASIVSGGNTYYSGSVKGRFTISRDIARNILYLQMSSLRSEDTAMYYCAREYYGYVGLAYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>1i9j_L\nDVVVTQTPLSLPVSLGDQASISCRSSQSIVHSNGNSYLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHVPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3tt1_I\nQVQLQQSGAELARPGASVKLSCKASGYTFTDYYINWMKQRTGQGLEWIGEIYPGVGTTYYDEKFKGKATLTADKSSRSAYMQLSSLTSEDSAVYFCARRTVTMGRYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIE\n>3tt1_H\nQVQLQQSGAELARPGASVKLSCKASGYTFTDYYINWMKQRTGQGLEWIGEIYPGVGTTYYDEKFKGKATLTADKSSRSAYMQLSSLTSEDSAVYFCARRTVTMGRYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIE\n>3tt3_H\nQVQLQQSGTELMRPGASVKISCKAFGYTFTNHHINWMKQRPGQGLDWIGYIIPYNDYTTNNRKFKGKATLTVDRSSSTAYMELSSLTSEDSAVYYCARGNYGSAWFAYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>3tt3_L\nDIVLTQSPTYLAVSLGQRATISCRASESVDTYDNSFIHWYQQKPGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVETDDVATYYCQQSNEDPLTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1i9r_H\nQVQLVQSGAEVVKPGASVKLSCKASGYIFTSYYMYWVKQAPGQGLEWIGEINPSNGDTNFNEKFKSKATLTVDKSASTAYMELSSLRSEDTAVYYCTRSDGRNDMDSWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>1i9r_K\nQVQLVQSGAEVVKPGASVKLSCKASGYIFTSYYMYWVKQAPGQGLEWIGEINPSNGDTNFNEKFKSKATLTVDKSASTAYMELSSLRSEDTAVYYCTRSDGRNDMDSWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>1f2x_K\nQVQLVESGGGSVQAGGSLRLSCAASGYTVSTYCMGWFRQAPGKEREGVATILGGSTYYGDSVKGRFTISQDNAKNTVYLQMNSLKPEDTAIYYCAGSTVASTGWCSRLRPYDYHYRGQGTQVTVSSRGRHHHHHH\n>1f2x_L\nQVQLVESGGGSVQAGGSLRLSCAASGYTVSTYCMGWFRQAPGKEREGVATILGGSTYYGDSVKGRFTISQDNAKNTVYLQMNSLKPEDTAIYYCAGSTVASTGWCSRLRPYDYHYRGQGTQVTVSSRGRHHHHHH\n>4f3f_A\nDIELTQSPAIMSASPGEKVTMTCSASSSVSYMHWYQQKSGTSPKRWIYDTSKLASGVPGRFSGSGSGNSYSLTISSVEAEDDATYYCQQWSKHPLTFGSGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4f3f_B\nEVQLQQSGPELEKPGASVKISCKASGYSFTGYTMNWVKQSHGKSLEWIGLITPYNGASSYNQKFRGKATLTVDKSSSTAYMDLLSLTSEDSAVYFCARGGYDGRGFDYWGSGTPVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTCPPC\n>2fl5_A\nSYELKQPPSVSVSPGQTARITCSGDVLPKKYAYWYQERSGQAPVLVVYEDSGRPSEIPERFSGSSSGTKATLTISGAQVEDEADYYCYSDISNGYPLFGGGTKLSVGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPIKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPT\n>2fl5_C\nSYELKQPPSVSVSPGQTARITCSGDVLPKKYAYWYQERSGQAPVLVVYEDSGRPSEIPERFSGSSSGTKATLTISGAQVEDEADYYCYSDISNGYPLFGGGTKLSVGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPIKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPT\n>1cly_H\nEVNLVESGGGLVQPGGSLKVSCVTSGFTFSDYYMYWVRQTPEKRLEWVAYISQGGDITDYPDTVKGRFTISRDNAKNSLYLQMSRLKSEDTAMYYCARGLDDGAWFAYWGQGTLVTVSVASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPQPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEP\n>1cly_L\nDVLMTQIPVSLPVSLGDQASISCRSSQIIVHNNGNTYLEWYLQKPGQSPQLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHVPFTFGSGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1clz_H\nEVNLVESGGGLVQPGGSLKVSCVTSGFTFSDYYMYWVRQTPEKRLEWVAYISQGGDITDYPDTVKGRFTISRDNAKNSLYLQMSRLKSEDTAMYYCARGLDDGAWFAYWGQGTLVTVSVTTTAPSVYPLVPGCSDTSGSSVTLGCLVKGYFPEPVTVKWNYGALSSGVRTVSSVLQSGFYSLSSLVTVPSSTWPSQTVICNVAHPASKTELIKRIEPR\n>1clz_L\nDVLMTQIPVSLPVSLGDQASISCRSSQIIVHNNGNTYLEWYLQKPGQSPQLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHVPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4lou_C\nEVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>4lou_E\nEVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>3k2u_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTINGTYIHWVRQAPGKGLEWVGGIYPAGGATYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCAKWWAWPAFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>3k2u_L\nDIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSNRAPATFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1clo_H\nEVKLVESGGGLVQPGGSLRLSCATSGFTFTDYYMNWVRQPPGKALEWLGFIGNKANGYTTEYSASVKGRFTISRDKSQSILYLQMNTLRAEDSATYYCTRDRGLRFYFDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRD\n>1clo_L\nQTVLSQSPAILSASPGEKVTMTCRASSSVTYIHWYQQKPGSSPKSWIYATSNLASGVPARFSGSGSGTSYSLTISRVEAEDAATYYCQHWSSKPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3eot_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTFSRYTMSWVRQAPGKGLEWVATISGGGHTYYLDSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCTRGFGDGGYFDVWGQGTLVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDCHHHHHH\n>3eot_L\nQIQLTQSPSSLSASVGDRVTITCSASSSVNSSALFWYQQKPGKAPKPWIYLTSNLASGVPSRFSGSGSGTDYTLTISSLQPEDFATYYCQQISGNPWTFGQGTKVEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3mnz_A\nRLDIQLTQSPSSLAMSGGQKVTMRCKSSQSLLNSRNERNYLAWYQQKPGQSPKLLVYFASIRESGVPDRFIGSGSGTDFTLTISSVQAEDLADYFCLQHYNTPWTFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGECGS\n>3mnz_B\nLQIQLVQSGPELKKPGETVKISCKASGYTFTDYSVHWVKQVPGKGLKWMGWINTETGEPTYADDFKGRFAFSLESSASTAYLEIHNLKNEDTATYFCALGWLHWGLGTTLTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>3eoa_A\nDIQMTQSPSSLSASVGDRVTITCRASKTISKYLAWYQQKPGKAPKLLIYSGSTLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQHNEYPLTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eoa_H\nEVQLVESGGGLVQPGGSLRLSCAASGYSFTGHWMNWVRQAPGKGLEWVGMIHPSDSETRYNQKFKDRFTISVDKSKNTLYLQMNSLRAEDTAVYYCARGIYFYGTTYFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVE\n>3eob_A\nDIQMTQSPSSLSASVGDRVTITCRASKTISKYLAWYQQKPGKAPKLLIYSGSTLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQHNEYPLTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eob_H\nEVQLVESGGGLVQPGGSLRLSCAASGYSFTGHWMNWVRQAPGKGLEWVGMIHPSDSETRYNQKFKDRFTISVDKSKNTLYLQMNSLRAEDTAVYYCARGIYFYGTTYFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVE\n>2r56_I\nQVSLRESGGGLVQPGRSLRLSCTASGFTFRHHGMTWVRQAPGKGLEWVASLSGSGTKTHFADSVKGRFTISRDNSNNTLYLQMDNVRDEDTAIYYCAKAKRVGATGYFDLWGRGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKAEP\n>2r56_H\nQVSLRESGGGLVQPGRSLRLSCTASGFTFRHHGMTWVRQAPGKGLEWVASLSGSGTKTHFADSVKGRFTISRDNSNNTLYLQMDNVRDEDTAIYYCAKAKRVGATGYFDLWGRGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKAEP\n>1ol0_A\nQVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMSWFRQAPGKEREIVSAVSGSGGSTYYADSVRGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAREPRIPRPPSFDYWGQGTLVTVSS\n>1ol0_B\nQVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMSWFRQAPGKEREIVSAVSGSGGSTYYADSVRGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAREPRIPRPPSFDYWGQGTLVTVSS\n>1rei_A\nDIQMTQSPSSLSASVGDRVTITCQASQDIIKYLNWYQQTPGKAPKLLIYEASNLQAGVPSRFSGSGSGTDYTFTISSLQPEDIATYYCQQYQSLPYTFGQGTKLQIT\n>1rei_B\nDIQMTQSPSSLSASVGDRVTITCQASQDIIKYLNWYQQTPGKAPKLLIYEASNLQAGVPSRFSGSGSGTDYTFTISSLQPEDIATYYCQQYQSLPYTFGQGTKLQIT\n>1cl7_H\nQIQLQQSGPELKKPGETVKISCKATNYAFTDYSMHWVKQAPGGDLKYVGWINTETDEPTFADDFKGRFAFSLDTSTSTAFLQINNLKNEDTATYFCVRDRHDYGEIFTYWGQGTTVTVSSAKTTPPSVYPLAPGS\n>1cl7_L\nDVLMTQTPLYLPVSLGDQASISCRSSQTIVHNNGNTYLEWYLQKPGQSPQLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGIYYCFQGSHFPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1a7o_H\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTVTVSS\n>1a7o_L\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPDDFGSYYCQHFWSTPTFGGGTKLEIK\n>1a7n_H\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTVTVSS\n>1a7n_L\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPDDFGSYYCQHFWSTPRTFGGGTKLEIK\n>3j1s_H\nSDVQLQESGPDLVKPSQSLSLTCTVTGYSITSGYTWHWIRQFPGNKQEWMGYIHFSGYTNYNPSLKSRVSITRDTSKNQFFLHLNSVTTEDTATYYCARGDYGYEWFTYWGQGTLVTVSAAKTTPPSVYPLAPGCGDTTGSSVTLGCLVKGYFPESVTVTWNSGSLSSSVHTFPALLQSGLYTMSSSVTVPSSTWPSQTVTCSVAHPASSTTVDKKLE\n>3j1s_L\nDIQMTQSSSSFSVSLGDRVTITCKASEDIHNRLAWYKQKPGNAPRLLISGATSLETGVPSRFSGSGSGKDYTLSITSLQNEDVATYYCQQYWIGPFTFGSGTNLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1a7r_H\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSS\n>1a7r_L\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPDDFGSYYCQHFWSTPRTFGGGTKLEIK\n>1a7q_H\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQLPGKGLEWLGMIWGDGNTAYNSALKSRLSISKDNSKSQVFLEMDSLHTDDTARYYCARERDYRLDYWGQGTTVTVSS\n>1a7q_L\nDIVLTQSPASLSASVGETVTITCRAGGNTHNYLAWYQQKQGKSPQLLVYYTTTLAAGVPSRFSGSGSGTQYSLKINSLQPDDFGSYYCQHFWSTPRSFGGGTKLEI\n>1a7p_H\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTVTVSS\n>1a7p_L\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPDDFGSYYCQHFWSTSRTFGGGTKLEIK\n>3eo1_A\nETVLTQSPGTLSLSPGERATLSCRASQSLGSSYLAWYQQKPGQAPRLLIYGASSRAPGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYADSPITFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eo1_B\nQVQLVQSGAEVKKPGSSVKVSCKASGYTFSSNVISWVRQAPGQGLEWMGGVIPIVDIANYAQRFKGRVTITADESTSTTYMELSSLRSEDTAVYYCASTLGLVLDAMDYWGQGTLVTVSSASTKGPSVFPLAPCSRSTSESTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTKTYTCNVDHKPSNTKVDKRVESKYGPP\n>3eo0_A\nETVLTQSPGTLSLSPGERATLSCRASQSLGSSYLAWYQQKPGQAPRLLIYGASSRAPGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYADSPITFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eo0_C\nETVLTQSPGTLSLSPGERATLSCRASQSLGSSYLAWYQQKPGQAPRLLIYGASSRAPGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYADSPITFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eo9_H\nEVQLVESGGGLVQPGGSLRLSCAASGYSFTGHWMNWVRQAPGKGLEWVGMIHPSDSETRYNQKFKDRFTISVDKSKNTLYLQMNSLRAEDTAVYYCARGIYFYGTTYFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKV\n>3eo9_L\nDIQMTQSPSSLSASVGDRVTITCRASKTISKYLAWYQQKPGKAPKLLIYSGSTLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQHNEYPLTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1n7m_H\nELVMTQTPKFMSTSVGDRVSITCKASQNVGTAVAWYQQKPGQSPKLLIYSASNRYTGVPDRFTGSGSGTDFTLTISNMQSEDLADYFCQQYSSYPLTFGGGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGE\n>1n7m_L\nQVQLLESGAELVKPGASVKLSCKASGYTFTSYWMHWVKQRPGRGLEWIGRIDPNSGGTKYNEKFKSKATLTVDKPSSTAYMQLSSLTSEDSAVYYCTRRDSDYWGAGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKS\n>1mcc_A\nPSALTQPPSASGSLGQSVTISCTGTSSDVGGYNYVSWYQQHAGKAPKVIIYEVNKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYEGSDNFVFGTGTKVTVLGQPKANPTVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADGSPVKAGVETTKPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>1mcc_B\nPSALTQPPSASGSLGQSVTISCTGTSSDVGGYNYVSWYQQHAGKAPKVIIYEVNKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYEGSDNFVFGTGTKVTVLGQPKANPTVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADGSPVKAGVETTKPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>3ijh_A\nDIVMTQSPSSLAVSAGEKVTMSCKSSQSLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSNNLRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3ijh_C\nDIVMTQSPSSLAVSAGEKVTMSCKSSQSLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSNNLRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4dcq_A\nLVLTQSSSASFSLGASAKLTCTLNSQHSTYTIEWYQQQPLKPPKYVMELKKDGSHSTGDGIPDRFSGSSSGADRYLLISNIQPEDEAIYICGVGDTIKEQFVYVFGGGTKVTVLGQPKSTPTLTVFPPSSEELKENKATLVCLISNFSPSGVTVAWKANGTPITQGVDTSNPTKKGNKFMASSFLHLTSDQWRSHQSFTCQVTHEGDTVEKSLSPALR\n>4dcq_B\nQIQLVQSGPELKKPGETVKISCKASGYTFTTYGMSWVKQAPGKGFEWMGWINTYSGVPTYVDDFKGRFAFSLETSASTAYLQINNLKNEDTAVYFCARGGNNFLWFAYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSQTVTCNVAHPASSTKVDKKIVP\n>4las_H\nEVQLQESGPSLVKPSQTLSLTCSVTGDSVTSGYWSWIRQFPGNKLDYMGYISYRGSTYYNPSLKSRISITRDTSKNQVYLQLKSVSSEDTATYYCSYFDSDDYAMEYWGQGTSVTVS\n>4las_L\nGGGGSQIVLTQSPAIMSASPGEKVTLTCSASSSVSSSHLYWYQQKPGSSPKLWIYSTSNLASGVPARFSGSGSGTSYSLTISSMEAEDAASYFCHQWSSFPFTFGSGTKLEIKRA\n>4lar_H\nEVQLQESGPSLVKPSQTLSLTCSVTGDSVTSGYWSWIRQFPGNKLDYMGYISYRGSTYYNPSLKSRISITRDTSKNQVYLQLKSVSSEDTATYYCSYFDSDDYAMEYWGQGTSVTVS\n>4lar_L\nSGGGGSQIVLTQSPAIMSASPGEKVTLTCSASSSVSSSHLYWYQQKPGSSPKLWIYSTSNLASGVPARFSGSGSGTSYSLTISSMEAEDAASYFCHQWSSFPFTFGSGTKLEIKR\n>4laq_H\nQTLSLTCSVTGDSVTSGYWSWIRQFPGNKLDYMGYISYRGSTYYNPSLKSRISITRDTSKNQVYLQLKSVSSEDTATYYCSYFDSDDYAMEYWGQGTSVTVSGG\n>4laq_L\nSQIVLTQSPAIMSASPGEKVTLTCSASSSVSSSHLYWYQQKPGSSPKLWIYSTSNLASGVPARFSGSGSGTSYSLTISSMEAEDAASYFCHQWSSFPFTFGSGTKLEIKRAPHHHHHH\n>1nj9_A\nQAVVTQESALTTSPGETVTLTCRSSTGTITSDNYANWVQEKPDHLFSGLIGVNNARPPGVPARFSGSLTGDKAVLTITGAQTEDEAIYFCALWYSNHWVFGGGTKLTVLGQPKSSPSVTLFPPSSEELETNKATLVCTITDFYPGVVTVDWKVDGTPVTQGMETTQPSKQSNNKYMASSYLTLTAREWERHSSYSCQVTHEGHTVEKSLSRA\n>1nj9_H\nEVQLQQSGPELVKPGASVKVSCKASGYSFTDYNMYWVKQNHGESLEWIAYIDPSNGDTFYNQKFQGKATVTLDKSSSTAFMHLNSLTSEDSAVYYCARGGGLFAFWGQGTLVTVSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPR\n>3mo1_A\nRLDIQLTQSPSSLAMSGGQKVTMRCKSSQSLLNSRNERNYLAWYQQKPGQSPKLLVYFASIRESGVPDRFIGSGSGTDFTLTISSVQAEDLADYFCLQHYNTPWTFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGECGS\n>3mo1_B\nLQIQLVQSGPELKKPGETVKISCKASGYTFTDYSVHWVKQVPGKGLKWMGWINTETGEPTYADDFKGRFAFSLESSASTAYLEIHNLKNEDTATYFCALGWLHWGLGTTLTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>4toy_H\nEGQLVQSGAELKKPGASVKISCKTSGYRFNFYHINWIRQTAGRGPEWMGWISPYSGDKNLAPAFQDRVIMTTDTEVPVTSFTSTGAAYMEIRNLKFDDTGTYFCAKGLLRDGSSTWLPYLWGQGTLLTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKGLEVLFQ\n>4toy_L\nQSVLTQSASVSGSLGQSVTISCTGPNSVCCSHKSISWYQWPPGRAPTLIIYEDNERAPGISPRFSGYKSYWSAYLTISDLRPEDETTYYCCSYTHNSGCVFGTGTKVSVLGQSKANPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>4laj_I\nEVQLVESGGGLVQPGGSLRLSCAASGFTLDYYSIGWFRQAPGKEREGVSCISDSDGRTYYADSVKGRFTISRDNAKNTVYLQMNSLKPEDTAVYYCATDCTVDPSLLYVMDYYGKGTQVTVSSAAAEQK\n>4laj_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTLDYYSIGWFRQAPGKEREGVSCISDSDGRTYYADSVKGRFTISRDNAKNTVYLQMNSLKPEDTAVYYCATDCTVDPSLLYVMDYYGKGTQVTVSSAAAEQK\n>4py7_I\nQVQLVQSGGGVVQPGRSLRLSCAASEFTFRMYATHWVRQAPGKGLEWVALISYDGSNKYYADSVKGRFTISRDNSMNTVYLQMNTLRPEDTAVYYCARDLGGYFIRGIMDVWGQGTLVTVSSASTKGPSVFPLAPSSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>4py7_A\nQVQLVQSGGGVVQPGRSLRLSCAASEFTFRMYATHWVRQAPGKGLEWVALISYDGSNKYYADSVKGRFTISRDNSMNTVYLQMNTLRPEDTAVYYCARDLGGYFIRGIMDVWGQGTLVTVSSASTKGPSVFPLAPSSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>3eyf_A\nMEIVLTQSPATLSLSPGERATLSCRASQSVGGYLTWYQHKPGQAPRLLIFDASIRATGIPARFSGSGSGTDFTLTITRLEPEDFAVYYCQQRSMWPPVTFGQGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eyf_C\nMEIVLTQSPATLSLSPGERATLSCRASQSVGGYLTWYQHKPGQAPRLLIFDASIRATGIPARFSGSGSGTDFTLTITRLEPEDFAVYYCQQRSMWPPVTFGQGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3h3b_C\nAAQPADIVLTQTPSSLPVSVGEKVTMTCKSSQTLLYSNNQKNYLAWYQQKPGQSPKLLISWAFTRKSGVPDRFTGSGSGTDFTLTIGSVKAEDLAVYYCQQYSNYPWTFGGGTRLEIKRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPEVVKTGASVKISCKASGYSFTGYFINWVKKNSGKSPEWIGHISSSYATSTYNQKFKNKAAFTVDTSSSTAFMQLNSLTSEDSAVYYCVRSGNYEEYAMDYWGQGTSVTVSS\n>3h3b_C\nAAQPADIVLTQTPSSLPVSVGEKVTMTCKSSQTLLYSNNQKNYLAWYQQKPGQSPKLLISWAFTRKSGVPDRFTGSGSGTDFTLTIGSVKAEDLAVYYCQQYSNYPWTFGGGTRLEIKRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPEVVKTGASVKISCKASGYSFTGYFINWVKKNSGKSPEWIGHISSSYATSTYNQKFKNKAAFTVDTSSSTAFMQLNSLTSEDSAVYYCVRSGNYEEYAMDYWGQGTSVTVSS\n>3h3b_D\nAAQPADIVLTQTPSSLPVSVGEKVTMTCKSSQTLLYSNNQKNYLAWYQQKPGQSPKLLISWAFTRKSGVPDRFTGSGSGTDFTLTIGSVKAEDLAVYYCQQYSNYPWTFGGGTRLEIKRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPEVVKTGASVKISCKASGYSFTGYFINWVKKNSGKSPEWIGHISSSYATSTYNQKFKNKAAFTVDTSSSTAFMQLNSLTSEDSAVYYCVRSGNYEEYAMDYWGQGTSVTVSS\n>3h3b_D\nAAQPADIVLTQTPSSLPVSVGEKVTMTCKSSQTLLYSNNQKNYLAWYQQKPGQSPKLLISWAFTRKSGVPDRFTGSGSGTDFTLTIGSVKAEDLAVYYCQQYSNYPWTFGGGTRLEIKRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPEVVKTGASVKISCKASGYSFTGYFINWVKKNSGKSPEWIGHISSSYATSTYNQKFKNKAAFTVDTSSSTAFMQLNSLTSEDSAVYYCVRSGNYEEYAMDYWGQGTSVTVSS\n>4py8_I\nQVQLVQSGGGVVQPGRSLRLSCAASEFTFRMYATHWVRQAPGKGLEWVALISYDGSNKYYADSVKGRFTISRDNSMNTVYLQMNTLRPEDTAVYYCARDLGGYFIRGIMDVWGQGTLVTVSSASTKGPSVFPLAPSSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>4py8_J\nELQMTQSPSSVSASVGDRVTITCRASQGISSWLAWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQANSFPLTFGGGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eyo_A\nMEIVLTQSPATLSLSPGERATLSCRASQSVGGYLTWYQHKPGQAPRLLIFDASIRATGIPARFSGSGSGTDFTLTITRLEPEDFAVYYCQQRSMWPPVTFGQGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eyo_C\nMEIVLTQSPATLSLSPGERATLSCRASQSVGGYLTWYQHKPGQAPRLLIFDASIRATGIPARFSGSGSGTDFTLTITRLEPEDFAVYYCQQRSMWPPVTFGQGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3kyk_H\nEVQLLESGGGLVQPGGSLRLSCAASGFTFSIYPMFWVRQAPGKGLEWVSWIGPSGGITKYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTATYYCAREGHNDWYFDLWGRGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHT\n>3kyk_L\nDIQMTQSPGTLSLSPGERATLSCRASQSVSSYLAWYQQKPGQAPRLLIYDASNRATGIPARFSGSGSGTEFTLTISSLQSEDFAVYYCQQYDKWPLTFGGGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eys_H\nAVTLKESGPGILKPSQTLSLTCSFSGFSLSTSGMGVGWIRQPSGKGLEWLAHIWWDDDRSYNPSLKSQLTISKDAARNQVFLRITSVDTADTATYYCVRRAHTTVLGDWFAYWGQGTLVTVSAAKTTAPSVYPLAPVCGGTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>3eys_L\nDVLMTQTPLSLPVSLGDQASISCRSSQSIVHSNGNTYLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHVPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3eyq_C\nMEIVLTQSPATLSLSPGERATLSCRASQSVSSYLAWYQQKPGQAPRLLIYDASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCQQRSNWPPITFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eyq_D\nQVQLVESGGGVVQPGRSLRLSCAASGFTFSSYGMHWVRQAPGKGLEWVAVISYDGSNKYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKDGKCGGGSCYSGLLDYWGQGTLVTVSSASFKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTGLEHHHHHH\n>3h3p_I\nGSQVQLVQSGAEVKRPGSSVTVSCKASGGSFSTYALSWVRQAPGRGLEWMGGVIPLLTITNYAPRFQGRITITADRSTSTAYLELNSLRPEDTAVYYCAREGTTGAGWLGKPIGAFAHWGQGTLVTVSSLEHHHHHH\n>3h3p_H\nGSQVQLVQSGAEVKRPGSSVTVSCKASGGSFSTYALSWVRQAPGRGLEWMGGVIPLLTITNYAPRFQGRITITADRSTSTAYLELNSLRPEDTAVYYCAREGTTGAGWLGKPIGAFAHWGQGTLVTVSSLEHHHHHH\n>2h1p_H\nDVKLVESGGGLVKLGGSLKLSCAASGFTFSSYFLSWVRQTPEKRLELVATINSNGDKTYHPDTMKGRFTISRDNAKNTLYLQMSSLKSEDTALYYCARRDSSASLYFDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>2h1p_L\nDVVMTQTPLSLPVSLGDPASISCRSSQSLVHSNGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDKFSGSGSGTDFTLKISRVEAEDQGVYFCSQSTHVPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDEDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3eyu_H\nQVTLKESGPGILKPSQTLSLTCSFSGFSLSTSGMGVGWIRQPSGKGLEWLAHIWWDDDRSYNPSLKSQLTISKDAARNQVFLRITSVDTADTATYYCVRRAHTTVLGDWFAYWGQGTLVTVSAAKTTAPSVYPLAPVCGGTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPT\n>3eyu_L\nDVLMTQTPLSLPVSLGDQASISCRSSQSIVHSNGNTYLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHVPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4b41_A\nEVQLVESGGGLVQPGGSLRLSCAASRSIISNNAMGWYRQAPGKQRELVARISSGGRTTYADSVKGRFTISRDNAKTTVYLQMNSLKPEDTAVYYCNAASLVRGPLDHWGQGTQVTVSS\n>4b41_B\nEVQLVESGGGLVQPGGSLRLSCAASRSIISNNAMGWYRQAPGKQRELVARISSGGRTTYADSVKGRFTISRDNAKTTVYLQMNSLKPEDTAVYYCNAASLVRGPLDHWGQGTQVTVSS\n>4dqo_H\nEEQLVESGGGVVQPGGSLRLSCLASGFTFHKYGMHWVRQAPGKGLEWVALISDDGMRKYHSDSMWGRVTISRDNSKNTLYLQFSSLKVEDTAMFFCAREAGGPIWHDDVKYYDFNDGYYNYHYMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCGLEVLF\n>4dqo_L\nQSALTQPASVSGSPGQTITISCQGTSSDVGGFDSVSWYQQSPGKAPKVMVFDVSHRPSGISNRFSGSKSGNTASLTISGLHIEDEGDYFCSSLTDRSHRIFGGGTKVTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHKSYSCQVTHEGSTVEKTVAPTECS\n>2v7h_A\nDIQMTQTTSSLSASLGDRVTISCRASQDINNYLNWYQQKPDGTVKILIYYTSNLHSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQGNTLPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSARQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2v7h_H\nQAQLQQSGAELMKPGASVKISCKATGYTFSNYWIDWIKQRPGHGLEWIGEILPGSGSTNYNEKFRGKATFTADTSSNTAYMQLSSLTSEDSAVYYCTRRGYWAYDFDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRD\n>1fj1_A\nDIQMTQSPSSLSATLGGKVTITCKASQDINKYIAWYQHKPGKGPRLLIHYTSTLQPGNPSRFSGSGSGRDYSFSISNLEAEDIAIYYCLQYDNLQRTFGGGTKVEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>1fj1_C\nDIQMTQSPSSLSATLGGKVTITCKASQDINKYIAWYQHKPGKGPRLLIHYTSTLQPGNPSRFSGSGSGRDYSFSISNLEAEDIAIYYCLQYDNLQRTFGGGTKVEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>1ynl_H\nRVQLLESGAELMKPGASVQISCKATGYTFSFYWIEWVKERPGHGLEWIGEILPGSGRTNYREKFKGKATFTADTSSNTAYMQLSSLTSEDSAVYYCTRGYSSMDYWGQGTSVTVSAAKTTPPSVYPLAPGCGDTTGSSVTLGCLVKGYFPESVTVTWNSGSLSSSVHTFPALLQSGLYTMSSSVTVPSSTWPSQTVTCSVAHPASSTTVDKKLEPSGPI\n>1ynl_L\nELVMTQSPLSLPVSLGDQASISCRPSQSLVHSNGNTYLHWYLQKPGQSPKLLIYRVSNRFSGVPDRFSGSGSGTAFTLKISRVEAEDLGVYFCSQGTHVPYTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2v7n_A\nDIVLTQSPATLSLSPGERATLSCRASQSVSSNYLAWYQQKPGQAPRLLIYDSSSRATGVPARFSGSGSGTDFTLTISSLEPEDFAVYYCHQYSDISPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEA\n>2v7n_C\nDIVLTQSPATLSLSPGERATLSCRASQSVSSNYLAWYQQKPGQAPRLLIYDSSSRATGVPARFSGSGSGTDFTLTISSLEPEDFAVYYCHQYSDISPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEA\n>1il1_A\nQLQQSGAELVRSGASVKLSCATSDFNIKDYYIHWVRQRPEQGLEWIGWLDPENGDTESAPKFQGKATMTADTSSNTAYLQLSSLTSEASAVYYCNAISTTRDYYALDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>1il1_B\nDIVMSQSPSSLAVSVGEKVTMSCKSSQSLLYSRNQMNYLSWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVKAEDLAVYYCQQYYHYRTFGGGTRLEIRRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3mod_H\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>3mod_L\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3moa_H\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>3moa_L\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3qrg_H\nEITLKESGPTLVKPTQTLTLTCTFSGFSLSTSGMGVSWIRQPPGKALEWLAHIYWDDDKRYNPSLKSRLTITKDTSKNQVVLTMTNMDPVDTATYYCARLYGFTYGFAYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKAEPKSCDKTH\n>3qrg_L\nDIVMTQSPDSLAVSLGERATINCRASQSVDYNGISYMHWYQQKPGQPPKLLIYAASNPESGVPDRFSGSGSGTDFTLTISSLQAEDVAVYYCQQIIEDPWTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3mob_H\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>3mob_L\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1jfq_H\nEVQLQQSGVELVRAGSSVKMSCKASGYTFTSNGINWVKQRPGQGLEWIGYNNPGNGYITYNEKFKGKTTLTVDKSSNTAYMQLRSLTSEDSAVYFCARSEYYGGSYKFDYWGQGTTLTVSSAGTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRD\n>1jfq_L\nDIQMTQIPSSLSASLGDRVSISCRASQDINNFLNWYQQKPDGTIKLLIYFTSRSQSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQGNALPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNECA\n>2d7t_H\nQVQLVQSGAEVKKPGASVKVSCKASGYTFTGNYMHWVRQAPGQGLEYMGWINPKSGDTNYAQKFQGRVTMTRDTSISTVYMEVRRLRSDDTAVYYCATGWWGMDVWGQGTLVTVSSASEQKLISKEDLNGSAGHHHHHH\n>2d7t_L\nDIVMTQSPSSLSASVGDRVTITCRASQNINNYLHWYQHEPGKAPKLLIYAASNLQGGVTSRFSGSGSGTDFTLTISTLQPEDFATYYCLQTHAYPLTFGGGTKVDIKRAAHHHHHH\n>1dvf_A\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFWSTPRTFGGGTKLEIKR\n>1dvf_C\nDIQLTQSPSSLSASLGDRVTISCRASQDISNYLNWYQQKPDGTVKLLIYYTSRLHSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQGNTLPWTFGGGTKLEIK\n>1jp5_A\nDILMTQTPLYLPVSLGDQASISCRSSQTIVHNNGNTYLEWYLQKPGQSPQLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGIYYCFQGSHFPPTFGGGTKLEIKGGGGSGGGGSGGGGSEVQLQQSGPELKKPGETVKISCKATNYAFTDYSMHWVKQAPGGDLKYVGWINTETDEPTFADDFKGRFAFSLDTSTSTAFLQINNLKNEDTATYFCVRDRHDYGEIFTYWGQGTTVTVSS\n>1jp5_A\nDILMTQTPLYLPVSLGDQASISCRSSQTIVHNNGNTYLEWYLQKPGQSPQLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGIYYCFQGSHFPPTFGGGTKLEIKGGGGSGGGGSGGGGSEVQLQQSGPELKKPGETVKISCKATNYAFTDYSMHWVKQAPGGDLKYVGWINTETDEPTFADDFKGRFAFSLDTSTSTAFLQINNLKNEDTATYFCVRDRHDYGEIFTYWGQGTTVTVSS\n>1jp5_B\nDILMTQTPLYLPVSLGDQASISCRSSQTIVHNNGNTYLEWYLQKPGQSPQLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGIYYCFQGSHFPPTFGGGTKLEIKGGGGSGGGGSGGGGSEVQLQQSGPELKKPGETVKISCKATNYAFTDYSMHWVKQAPGGDLKYVGWINTETDEPTFADDFKGRFAFSLDTSTSTAFLQINNLKNEDTATYFCVRDRHDYGEIFTYWGQGTTVTVSS\n>1jp5_B\nDILMTQTPLYLPVSLGDQASISCRSSQTIVHNNGNTYLEWYLQKPGQSPQLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGIYYCFQGSHFPPTFGGGTKLEIKGGGGSGGGGSGGGGSEVQLQQSGPELKKPGETVKISCKATNYAFTDYSMHWVKQAPGGDLKYVGWINTETDEPTFADDFKGRFAFSLDTSTSTAFLQINNLKNEDTATYFCVRDRHDYGEIFTYWGQGTTVTVSS\n>4jan_A\nQVQLQESGPGVVKSSETLSLTCTVSGGSMGGTYWSWLRLSPGKGLEWIGYIFHTGETNYSPSLKGRVSISVDTSEDQFSLRLRSVTAADTAVYFCASLPRGQLVNAYFRNWGRGSLVSVTAASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>4jan_H\nQVQLQESGPGVVKSSETLSLTCTVSGGSMGGTYWSWLRLSPGKGLEWIGYIFHTGETNYSPSLKGRVSISVDTSEDQFSLRLRSVTAADTAVYFCASLPRGQLVNAYFRNWGRGSLVSVTAASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>4h0g_A\nMEIQLQQSGPELVKPGASVKISCKASGYSFTDYIMLWVKQSHGKSLEWIGNINPYYGSTSYNLKFKGKATLTVDKSSSTAYMQLNSLTSEDSAVYYCARKNYYGSSLDYWGQGTTLTVSSAKTTGGGGSGGGGSGGGGSDVVMTQTPFSLPVSLGDQASISCRSSQSLVHSNGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQSTHVPYTFGGGTKLEIK\n>4h0g_A\nMEIQLQQSGPELVKPGASVKISCKASGYSFTDYIMLWVKQSHGKSLEWIGNINPYYGSTSYNLKFKGKATLTVDKSSSTAYMQLNSLTSEDSAVYYCARKNYYGSSLDYWGQGTTLTVSSAKTTGGGGSGGGGSGGGGSDVVMTQTPFSLPVSLGDQASISCRSSQSLVHSNGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQSTHVPYTFGGGTKLEIK\n>4cdg_C\nMKYLLPTAAAGLLLLAAQPAMAQVQLQESGGGLVQAGGSLRLSCAASGIWFSINNMAWYRQTPGKQRERIAIITSAGTTNYVDSVKGRFTISRDDAKNTMYLQMNSLIPEDTAVYYCNLVADYDMGFQSFWGRGTQVTVSSHHHHHH\n>4cdg_D\nMKYLLPTAAAGLLLLAAQPAMAQVQLQESGGGLVQAGGSLRLSCAASGIWFSINNMAWYRQTPGKQRERIAIITSAGTTNYVDSVKGRFTISRDDAKNTMYLQMNSLIPEDTAVYYCNLVADYDMGFQSFWGRGTQVTVSSHHHHHH\n>4h0i_A\nMEIQLQQSGPELVKPGASVKISCKASGYSFTDYIMLWVKQSHGKSLEWIGNINPYYGSTSYNLKFKGKATLTVDKSSSTAYMQLNSLTSEDSAVYYCARKNYYGSSLDYWGQGTTLTVSSAKTTGGGGSGGGGSGGGGSDVVMTQTPFSLPVSLGDQASISCRSSQSLVHSNGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQSTHVPYTFGGGTKLEIK\n>4h0i_A\nMEIQLQQSGPELVKPGASVKISCKASGYSFTDYIMLWVKQSHGKSLEWIGNINPYYGSTSYNLKFKGKATLTVDKSSSTAYMQLNSLTSEDSAVYYCARKNYYGSSLDYWGQGTTLTVSSAKTTGGGGSGGGGSGGGGSDVVMTQTPFSLPVSLGDQASISCRSSQSLVHSNGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQSTHVPYTFGGGTKLEIK\n>2rhe_A\nESVLTQPPSASGTPGQRVTISCTGSATDIGSNSVIWYQQVPGKAPKLLIYYNDLLPSGVSDRFSASKSGTSASLAISGLESEDEADYYCAAWNDSLDEPGFGGGTKLTVLGQPK\n>12e8_H\nEVQLQQSGAEVVRSGASVKLSCTASGFNIKDYYIHWVKQRPEKGLEWIGWIDPEIGDTEYVPKFQGKATMTADTSSNTAYLQLSSLTSEDTAVYYCNAGHDYDRGRFPYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRD\n>12e8_M\nDIVMTQSQKFMSTSVGDRVSITCKASQNVGTAVAWYQQKPGQSPKLMIYSASNRYTGVPDRFTGSGSGTDFTLTISNMQSEDLADYFCQQYSSYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSATDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1tji_H\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>1tji_L\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1tjh_H\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>1tjh_L\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4k9e_H\nSEVQLVESGGGLVQPGGSLRLSCAASGFNISVYMMHWVRQAPGKGLEWVASIYPYSGYTYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARYVYHALDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>4k9e_L\nDIQMTQSPSSLSASVGDRVTITCRASQRGLRNVAVAWYQQKPGKAPKLLIYSASSLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQWAVHSLITFGQGTKVEIKRTVAAPSVFIFPPSDSQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGECGGSDYKDDDDK\n>43c9_A\nDVVMTQTPSSLAMSVGQKVTMSCKSSQSLLNISNQKNYLAWYQQKPGQSPKLLVYFASTRESGVPDRFIGSGSGTDFTLTISSVQAEDQADYFCQQHYRAPRTFGGGTKLEIK\n>43c9_C\nDVVMTQTPSSLAMSVGQKVTMSCKSSQSLLNISNQKNYLAWYQQKPGQSPKLLVYFASTRESGVPDRFIGSGSGTDFTLTISSVQAEDQADYFCQQHYRAPRTFGGGTKLEIK\n>3ck0_H\nQVQLQESGGGLVQPRGSLKLSCAASGFTFNTDAMNWVRQAPGKGLEWVARIRSKGFNFATYYADSVRDRFTISRDDSQSMLYLQMNNLKTEDTGIYYCVRGRDGEAMDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVN\n>3ck0_L\nDIQLTQSPSSLAVSAGEKVTMNCKSSQNLLHSITRKNYLAWYRQKPGQSPKLLIYWASTRGSGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSYNLYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1tjg_H\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>1tjg_L\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3uyr_H\nEVKLVESEGGLVQPGSSMKLSCTASGFTFSDYYMAWVRQVPEKGLEWVANINYDGSSTYYLDSLKGRFIISRDIAKNILYLQMSSLRCEDTATYYCARLTNGYLDVWGAGTTVTVSSAKTTPPSVYPLAPGCGDTTGSSVTLGCLVKGYFPESVTVTWNSGSLSSSVHTFPALLESGLYTMSSSVTVPSSTWPSQTVTCSVAHPASSTTVDKKLEP\n>3uyr_L\nDVVMTQTPLSLPVSLGDQASISCRSSQSLVHSNGNTYLHWYLQKPGQSPNLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQSTHVPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3uyp_A\nEVKLLEQSGAELVKPGASVRLSCTASGFNIKDTYMSWVKQRPEQGLEWIGRIDPANGDTKYDPKFQGKATITADTSSNTAYLHLSSLTSGDTAVYYCSRGWEGFAYWGQGTLVTVSAGGGGSGGGGSGGGGSELVMTQTPASLAVSLGQRATISCRASENVDRYGNSFMHWYQQKAGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYFCQRSNEVPWTFGGGTKLEIKRPLEHHHHHH\n>3uyp_A\nEVKLLEQSGAELVKPGASVRLSCTASGFNIKDTYMSWVKQRPEQGLEWIGRIDPANGDTKYDPKFQGKATITADTSSNTAYLHLSSLTSGDTAVYYCSRGWEGFAYWGQGTLVTVSAGGGGSGGGGSGGGGSELVMTQTPASLAVSLGQRATISCRASENVDRYGNSFMHWYQQKAGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYFCQRSNEVPWTFGGGTKLEIKRPLEHHHHHH\n>2x1q_A\nQVQLQESGGGLVQPGGSLRLSCAASGRTFSNYRMGWFRQAPGKEREFVATISQSGAATAYADSVKGRFTFSRDNAKNLLYLEMLSLEPEDTAVYYCAASSRVFYTEVLQTTTGYDYWGQGTQVTVSS\n>2x1q_B\nQVQLQESGGGLVQPGGSLRLSCAASGRTFSNYRMGWFRQAPGKEREFVATISQSGAATAYADSVKGRFTFSRDNAKNLLYLEMLSLEPEDTAVYYCAASSRVFYTEVLQTTTGYDYWGQGTQVTVSS\n>2x1p_A\nQVQLQESGGGLVQAGGSLRLSCAASGRTFTSFAMGWFRQAPGKEREFVASISRSGTLTRYADSAKGRFTISVDNAKNTVSLQMDNLNPDDTAVYYCAADLHRPYGPGTQRSDEYDSWGQGTQVTVSS\n>2x1p_C\nQVQLQESGGGLVQAGGSLRLSCAASGRTFTSFAMGWFRQAPGKEREFVASISRSGTLTRYADSAKGRFTISVDNAKNTVSLQMDNLNPDDTAVYYCAADLHRPYGPGTQRSDEYDSWGQGTQVTVSS\n>3det_C\nVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>3det_E\nVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>1nld_H\nQVKLQQSGPGLVQPSQSLSITCTVSGFSLTCYGVHWVRQSPGKGLEWLGVIWSGGDTDYNAAFISRLSITKDNSKSQVFFKMNSLQPNDRAIYYCARRGGDFWGQGTTVTVSSASTTAPSVYPLAPVSGDQTNSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSPWPSETITCNVAHPASSTKVDKKIEPRGC\n>1nld_L\nDVVMTQTPLTLSVTIGQPASISCKSSQSLLDSDGKTYLNWLLQRPGQSPKRLIYLVSKLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGVYYCWQGTHFPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4lsu_H\nEVHLMQSGTEMKKPGASVRVTCQTSGYTFSDYFIHWLRQVPGRGFEWMGWMNPQWGQVNYARTFQGRVTMTRDVYREVAYLDLRSLTFADTAVYFCARRMRSQDREWDFQHWGQGTRIIVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>4lsu_L\nQSALTQPPSVSGSPGQSITLSCTGASTSVAWYQQYADKAPRLIVFDGNKRPSDISSRFSGSQSGGTASLTISGLQSEDEAYYHCNAFEFFGGGTKLTVLSQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHKSYSCQVTHEGSTVEKTVAPTEC\n>4lst_H\nQVQLVQSGGQMKKPGESMRISCRASGYEFIDCTLNWIRLAPGKRPEWMGWLKPRGGAVNYARPLQGRVTMTRDVYSDTAFLELRSLTVDDTAVYFCTRGKNCDYNWDFEHWGRGTPVIVSSPSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>4lst_L\nEIVLTQSPGTLSLSPGETAIISCRTSQYGSLAWYQQRPGQAPRLVIYSGSTRAAGIPDRFSGSRWGPDYNLTISNLESGDFGVYYCQQYEFFGQGTKVQVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLRSPVTKSFNRGEC\n>2x1o_A\nQVQLQESGGGLVQAGGSLRLSCAAAGRNLRMYRMGWFRQAPGKEREFVGTMVWSSDTIYYADSVKGRFIISRDNAKNTVYLQMNSLKPEDTAVYYCAAGAGWAGTMTDYNYWGQGTQVTVSS\n>2x1o_B\nQVQLQESGGGLVQAGGSLRLSCAAAGRNLRMYRMGWFRQAPGKEREFVGTMVWSSDTIYYADSVKGRFIISRDNAKNTVYLQMNSLKPEDTAVYYCAAGAGWAGTMTDYNYWGQGTQVTVSS\n>4lsv_H\nQVQLLQSGAAVTKPGASVRVSCEASGYNIRDYFIHWWRQAPGQGLQWVGWINPKTGQPNNPRQFQGRVSLTRHASWDFDTYSFYMDLKALRSDDTAVYFCARQRSDYWDFDVWGSGTQVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>4lsv_L\nDIQMTQSPSSLSASVGDTVTITCQANGYLNWYQQRRGKAPKLLIYDGSKLERGVPSRFSGRRWGQEYNLTINNLQPEDIATYFCQVYEFVVPGTRLDLKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4lsq_H\nQVQLVQSGAAVRKPGASVTVSCKFAEDDDYSPYWVNPAPEHFIHFLRQAPGQQLEWLAWMNPTNGAVNYAWYLNGRVTATRDRSMTTAFLEVKSLRSDDTAVYYCARAQKRGRSEWAYAHWGQGTPVVVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>4lsq_L\nDIQMTQSPSSLSASLGDRVTITCQASRGIGKDLNWYQQKAGKAPKLLVSDASTLEGGVPSRFSGSGFHQDFSLTISSLQAEDVATYFCQQYETFGQGTKVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4lsp_H\nQVQLVQSGAAVRKPGASVTVSCKFAEDDDYSPYWVNPAPEHFIHFLRQAPGQQLEWLAWMNPTNGAVNYAWYLNGRVTATRDRSMTTAFLEVKSLRSDDTAVYYCARAQKRGRSEWAYAHWGQGTPVVVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>4lsp_L\nDIQMTQSPSSLSASLGDRVTITCQASRGIGKDLNWYQQKAGKAPKLLVSDASTLEGGVPSRFSGSGFHQNFSLTISSLQAEDVATYFCQQYETFGQGTKVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4lss_H\nQVQLVQSGGQMKKPGESMRISCRASGYEFIDCTLNWIRLAPGKRPEWMGWLKPRGGAVNYARPLQGRVTMTRDVYSDTAFLELRSLTVDDTAVYFCTRGKNCDYNWDFEHWGRGTPVIVSSPSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>4lss_L\nEIVLTQSPGTLSLSPGETAIISCRTSQYGSLAWYQQRPGQAPRLVIYSGSTRAAGIPDRFSGSRWGPDYTLTISNLESGDFGVYYCQQYEFFGQGTKVQVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLRSPVTKSFNRGEC\n>4lsr_H\nQVQLVQSGAAVRKPGASVTVSCKFAEDDDYSPYWVNPAPEHFIHFLRQAPGQQLEWLAWMNPTNGAVNYAWYLNGRVTATRDRSMTTAFLEVKSLRSDDTAVYYCARAQKRGRSEWAYAHWGQGTPVVVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>4lsr_L\nDIQMTQSPSSLSASLGDRVTITCQASRGIGKDLNWYQQKAGKAPKLLVSDASTLEGGVPSRFSGSGFHQDFSLTISSLQAEDVATYFCQQYETFGQGTKVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1jpt_H\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKEYYMHWVRQAPGKGLEWVGLIDPEQGNTIYDPKFQDRATISADNSKNTAYLQMNSLRAEDTAVYYCARDTAAYFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHT\n>1jpt_L\nDIQMTQSPSSLSASVGDRVTITCRASRDIKSYLNWYQQKPGKAPKVLIYYATSLAEGVPSRFSGSGSGTDYTLTISSLQPEDFATYYCLQHGESPWTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4k94_H\nEVQLVESGGGLVQPGGSLRLSCAASGFNISSYSMHWVRQAPGKGLEWVASIYPYSGYTYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARYVYHALDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>4k94_L\nDIQMTQSPSSLSASVGDRVTITCRASQSVSSAVAWYQQKPGKAPKLLIYSASSLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQWAVHSLITFGQGTKVEIKRTVAAPSVFIFPPSDSQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGECGGSDYKDDDDK\n>1jps_H\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKEYYMHWVRQAPGKGLEWVGLIDPEQGNTIYDPKFQDRATISADNSKNTAYLQMNSLRAEDTAVYYCARDTAAYFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHT\n>1jps_L\nDIQMTQSPSSLSASVGDRVTITCRASRDIKSYLNWYQQKPGKAPKVLIYYATSLAEGVPSRFSGSGSGTDYTLTISSLQPEDFATYYCLQHGESPWTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2ck0_H\nQVQLQESGGGLVQPRGSLKLSCAASGFTFNTDAMNWVRQAPGKGLEWVARIRSKGFNFATYYADSVRDRFTISRDDSQSMLYLQMNNLKTEDTGIYYCVRGRDGEAMDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVN\n>2ck0_L\nDIQLTQSPSSLAVSAGEKVTMNCKSSQNLLHSITRKNYLAWYRQKPGQSPKLLIYWASTRGSGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSYNLYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>43ca_A\nDVVMTQTPSSLAMSVGQKVTMSCKSSQSLLNISNQKNYLAWYQQKPGQSPKLLVYFASTRESGVPDRFIGSGSGTDFTLTISSVQAEDQADYFCQQHYRAPRTFGGGTKLEIK\n>43ca_C\nDVVMTQTPSSLAMSVGQKVTMSCKSSQSLLNISNQKNYLAWYQQKPGQSPKLLVYFASTRESGVPDRFIGSGSGTDFTLTISSVQAEDQADYFCQQHYRAPRTFGGGTKLEIK\n>4od3_H\nEVQLVESGGGVVQPGRSLRLSCVGSQFSFNRYGMHWVRQAPGKGLEWVAGISFDGTDRYHADNVWGRFTISRDNSKNTLYLQMSSLRAEDTALYYCAKDLREDECEEWWSDYYDFGKKLPCRKSRGVAGVFDKWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKGLEVLFQ\n>4od3_L\nQAVLTQPPSVSAAPGQNVTISCSGSGSNIGNNFVSWYQQRPGTAPKLLIYESNKRPSGIPDRFSGSKSGTSATLAITGLQTGDEAYYYCATWAARLNSARVFGTGTMVTVLGQPKANPTVTLYPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>4od2_A\nSELTQDPAVSVALGQTVRITCSGDSLRSYYASWYQQKPGQAPVLVIYGANNRPSGIPDRFSGSSSGNTASLTITGAQAEDEADYYCNSADSSGNHVVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHKSYSCQVTHEGSTVEKTVAPTECS\n>4od2_B\nEVQLVQSGGGVERPGGSLRLSCAASGFTFDDYAMSWVRQAPGKGLEWVSGINWQGGSTGYADSVKGRVTISRDNAKNSLYLQMNSLRAEDTAVYYCAKILGAGRGWYFDYWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTAAP\n>4od1_H\nVQLVESGGGVVQPGKSLRLSCAASRFSFNRYGMHWVRQAPGKGLEWVAAISYDGTDKYHADKVWGRFTISRDNSKNTLYLQMNSLRAEDTALYYCAKDLREDECEEWWSDYYDFGKQLPCRKSRGVAGIFDGWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKGLEVLFQ\n>4od1_L\nQSVLTQPPSVSAAPGQKVTISCSGSSSNIGNNFVSWYQQRPGTAPKILIYENNKRPSETPDRFSGSKSGTSATLAITGLQTADEAEYYCATWSASLSSARVFGTGTRITVLGQPKANPTVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>1g6v_K\nQVQLVESGGGSVQAGGSLRLSCAASGYTVSTYCMGWFRQAPGKEREGVATILGGSTYYGDSVKGRFTISQDNAKNTVYLQMNSLKPEDTAIYYCAGSTVASTGWCSRLRPYDYHYRGQGTQVTVSS\n>4m3j_A\nQVQLQESGGGLVQPGGSLRLSCAASGSISSITTMGWYRQDPGKGRELVALINSVGDTTYAGSVKGRFTISRDNAKNTVYLEMSSLKPEDTAVYYCNAFMSTNSGRTGSFWGQGTQVTVSSHHHHHH\n>4m3j_B\nQVQLQESGGGLVQPGGSLRLSCAASGSISSITTMGWYRQDPGKGRELVALINSVGDTTYAGSVKGRFTISRDNAKNTVYLEMSSLKPEDTAVYYCNAFMSTNSGRTGSFWGQGTQVTVSSHHHHHH\n>4m3k_B\nQVQLQESGGGLVQPGGSLRLSCAASGSISSITTMGWYRQDPGKGRELVALINSVGDTTYAGSVKGRFTISRDNAKNTVYLEMSSLKPEDTAVYYCNAFMSTNSGRTGSFWGQGTQVTVSSHHHHHH\n>3g5y_A\nDILMTQSPVSMSLSLGDTVSITCHSSQDISSNIGWLQQAPGKSFKGLIYHGTNLEDGVPGRFSGSGSGADYSLTISSLSSEDFVDYYCVQYGQFPWTFGGGTSLEIKRADAAPTVSIFPPSTEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSSTPIVKSFNRNE\n>3g5y_B\nDVQLQESGPALVKPSQSLSLTCTVTGYSITSDYAWNWIRQFPGNKLEWMGYISYSANTRYNPSLKSRISITRDTSKNQFFLQLNSVTVEDTATYYCATAGRGFPYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>3g5x_A\nDILMTQSPSSMSVSLGDTVSITCHSSQDINSNIGWLQQKPGKSFKGLIYHGTNLDDEVPSRFSGSGSGADYSLTISSLESEDFADYYCVQYAQFPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3g5x_C\nDILMTQSPSSMSVSLGDTVSITCHSSQDINSNIGWLQQKPGKSFKGLIYHGTNLDDEVPSRFSGSGSGADYSLTISSLESEDFADYYCVQYAQFPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3g5z_A\nDILMTQSPSSMSVSLGDTVSITCHASQDIISNIGWLQQKPGKSFAGLIYHGTNLSDGVPSRFSGSGSGADYSLTISSLESEDFADYYCVQYAQFPWTFGGGTKLEIARADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3g5z_B\nDVQLQESGPSLVKPSQSLSLTCTVTGYSITSDFAWNWIRQFPGNKLEWMGYISYSGNTRYNPSLKSRISITRDTSSNQFFLQLNSVTPEDTATYYCATAGRGFPYWGQGTLVTVSAAKTTPPSVYPLAPGCGDTTGSSVTLGCLVKGYFPESVTVTWNSGSLSSSVHTFPALLQSDLYTMSSSVTVPSSTWPSETVTCSVAHPASSTTVDKKLEPRA\n>3g5v_A\nDILMTQSPSSMSVSLGDTVSITCHSSQDINSNIGWLQQKPGKSFKGLIYHGTNLDDEVPSRFSGSGSGADYSLTISSLESEDFADYYCVQYAQFPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>3g5v_B\nDVQLQESGPSLVKPSQSLSLTCTVTGYSITSDFAWNWIRQFPGNKLEWMGYISYSGNTRYNPSLKSRISITRDTSSNQFFLQLNSVTIEDTATYYCVTAGRGFPYWGQGTLVTVSAAKTTPPSVYPLAPGCGDTTGSSVTLGCLVKGYFPESVTVTANSGSLSSSVHTFPALLQSDLYTMSSSVTVPSSTWPSETVTCSVAHPASSTTVDKKA\n>1k6q_H\nEVQLQQSGAELVRPGALVKLSCKASGFNIKDYYMHWVKQRPEQGLELIGWIDPENGNTIYDPKFQDKASITADTSSNTAYLQLSSLTSEDTAVYYCARDTAAYFDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKKIP\n>1k6q_L\nDIKMTQSPSSMSASLGESVTITCKASRDIKSYLSWYQQKPWKSPKTLIYYATSLADGVPSRFSGSGSGQDYSLTISSLESDDTATYYCLQHGESPFTFGSGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFN\n>4gft_B\nEVQLQESGGGTVQPGGSLKLSCSAAPERAFSNYAMGWFRQAPGQEREFVAGITGSGRSQYYADSVKGRFTISRDNAMNAVYLQMNSVKAEDTAVYYCAARVVPVFSDSTKGYVYWGQGTQVTVSSHHHHHHEPEA\n>4evn_A\nQVQLVESGAEVKKPGSSVKVSCKASGGPFRSYAISWVRQAPGQGPEWMGGIIPIFGTTKYAPKFQGRVTITADDFAGTVYMELSSLRSEDTAMYYCAKHMGYQVRETMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKSGRLVPRGSGHHHHHH\n>4evn_C\nQVQLVESGAEVKKPGSSVKVSCKASGGPFRSYAISWVRQAPGQGPEWMGGIIPIFGTTKYAPKFQGRVTITADDFAGTVYMELSSLRSEDTAMYYCAKHMGYQVRETMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKSGRLVPRGSGHHHHHH\n>1bvk_A\nDIQMTQSPSSLSASVGDRVTITCRASGNIHNYLAWYQQKPGKAPKLLIYYTTTLADGVPSRFSGSGSGTDYTFTISSLQPEDIATYYCQHFWSTPRTFGQGTKVEIKR\n>1bvk_B\nQVQLQESGPGLVRPSQTLSLTCTVSGFSLTGYGVNWVRQPPGRGLEWIGMIWGDGNTDYNSALKSRVTMLKDTSKNQFSLRLSSVTAADTAVYYCARERDYRLDYWGQGSLVTVSSG\n>4uuj_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>4uuj_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1bvl_A\nQVQLQESGPGLVRPSQTLSLTCTVSGFSLTGYGVNWVRQPPGRGLEWIGMIWGDGNTDYNSALKSRVTMLKDTSKNQFSLRLSSVTAADTAVYYCARERDYRLDYWGQGSLVTVSSG\n>1bvl_C\nQVQLQESGPGLVRPSQTLSLTCTVSGFSLTGYGVNWVRQPPGRGLEWIGMIWGDGNTDYNSALKSRVTMLKDTSKNQFSLRLSSVTAADTAVYYCARERDYRLDYWGQGSLVTVSSG\n>4odh_H\nQVQLVESGGGVVQPGRSLRLSCAASGFTFSSYGMHWVRQAPGKGLEWVAVISYDGSNKYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKDLGESENEEWATDYYDFSIGYPGQDPRGVVGAFDIWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>4odh_L\nQSVLTQPPSVSAAPGQKVTISCSGSSSNIGNNYVSWYQQLPGTAPKLLIYENNKRPSGIPDRFSGSKSGTSATLGITGLQTGDEADYYCGTWDSSLSAGGVFGTGTKVTVLGQPKANPTVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>2oqj_A\nVVMTQSPSTLSASVGDTITITCRASQSIETWLAWYQQKPGKAPKLLIYKASTLKTGVPSRFSGSGSGTEFTLTISGLQFDDFATYHCQHYAGYSATFGQGTRVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRG\n>2oqj_B\nEVQLVESGGGLVKAGGSLILSCGVSNFRISAHTMNWVRRVPGGGLEWVASISTSSTYRDYADAVKGRFTVSRDDLEDFVYLQMHKMRVEDTAIYYCARKGSDRLSDNDPFDAWGPGTVVTVSPASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>3sob_H\nMKKNIAFLLASMFVFSIATNAYAEVQLVESGGGLVQPGGSLRLSCAASGFTFTNSYIHWVRQAPGKGLEWVGWITPYGGYTNYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARGSGHVNAVKNYGYVMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>3sob_L\nMKKNIAFLLASMFVFSIATNAYADIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3dsf_H\nEVQLVESGGGLVQPKGSLKISCAASGFTFNIYAMNWVRQAPGKGLEWVARIRSQSNNYTTYYADSVKDRFTISRDDSQSMLYLQMNNLKTEDTAMYYCVRQMGDYWGQGTTLTVSSAVKTPPSVYPLAPGGGAISNSMVTLGCLVNGYFPEPVTVTWNAGSLGSGVHTFPAVLQSDLYTLSSSVTVPVSTWPSEAVTCNVAHPASATSVDKAISPV\n>3dsf_L\nYIQMTQSPASLSVSVGETVTITCRASENIYSFLAWYQQKQGKSPQLLVYAATNLADGVPSRFSGSGSGTQFSLKINSLQSEDFGTYYCQHFWGTPFTFGSGTKLEIKRSDAAPTVSIFPPSAAQLSSGGGSVVCFLNNFYPKDINVKWKIDGAERGNGVLNSWTSQDSADSTYSMSSTLTSGGDEYERHNSYTCEATHKTSTSPIVKSFNRAA\n>3oay_H\nEVQLVESGGGLVKAGGSLILSCGVSNFRISAHTMNWVRRVPGGGLEWVASISTSSTYRDYADAVKGRFTVSRDDLEDFVYLQMHKMRVEDTAIYYCARKGSDRLSDNDPFDAWGPGTVVTVSPASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>3oay_K\nAVVMTQSPSTLSASVGDTITITCRASQSIETWLAWYQQKPGKAPKLLIYKASTLKTGVPSRFSGSGSGTEFTLTISGLQFDDFATYHCQHYAGYSATFGQGTRVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGE\n>3pgf_H\nEISEVQLVESGGGLVQPGGSLRLSCAASGFNFSSSYIHWVRQAPGKGLEWVAYISSYSGYTSYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARTPWWYWSGLDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHT\n>3pgf_L\nSDIQMTQSPSSLSASVGDRVTITCRASQSVSSAVAWYQQKPGKAPKLLIYSASSLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQSSYIPVTFGQGTKVEIKRTVAAPSVFIFPPSDSQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3oaz_H\nEVQLVESGGGLVKAGGSLILSCGVSNFRISAHTMNWVRRVPGGGLEWVASISTSSTYRDYADAVKGRFTVSRDDLEDFVYLQMHKMRVEDTAIYYCARKGSDRLSDNDPFDAWGPGTVVTVSPASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>3oaz_K\nAVVMTQSPSTLSASVGDTITITCRASQSIETWLAWYQQKPGKAPKLLIYKASTLKTGVPSRFSGSGSGTEFTLTISGLQFDDFATYHCQHYAGYSATFGQGTRVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGE\n>3oau_H\nEVQLVESGGGLVKAGGSLRLSCGVSNFRISAHTMNWVRRVPGGGLEWVASISTSSTYRDYADAVKGRFTVSRDDLEDFVYLQMHKMRVEDTAIYYCARKGSDRLSDNDPFDAWGPGTVVTVSPASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKS\n>3oau_L\nVVMTQSPSTLSASVGDTITITCRASQSIETWLAWYQQKPGKAPKLLIYKASTLKTGVPSRFSGSGSGTEFTLTISGLQFDDFATYHCQHYAGYSATFGQGTRVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGE\n>4g3y_H\nEVKLEESGGGLVQPGGSMKLSCVASGFIFSNHWMNWVRQSPEKGLEWVAEIRSKSINSATHYAESVKGRFTISRDDSKSAVYLQMTDLRTEDTGVYYCSRNYYGSTYDYWGQGTTLTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKT\n>4g3y_L\nDILLTQSPAILSVSPGERVSFSCRASQFVGSSIHWYQQRTNGSPRLLIKYASESMSGIPSRFSGSGSGTDFTLSINTVESEDIADYYCQQSHSWPFTFGSGTNLEVKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1f11_A\nDMVLTQSPASLAVSLGQRATISCKASQSVDYDGDSYMNWYQQKPGQPPKLLIYVASNLKSGIPARFSGSGSGTDFTLNIHPVEEEDAATYYCQQSNEDPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1f11_C\nDMVLTQSPASLAVSLGQRATISCKASQSVDYDGDSYMNWYQQKPGQPPKLLIYVASNLKSGIPARFSGSGSGTDFTLNIHPVEEEDAATYYCQQSNEDPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1gc1_H\nQVQLLESGAEVKKPGSSVKVSCKASGDTFIRYSFTWVRQAPGQGLEWMGRIITILDVAHYAPHLQGRVTITADKSTSTVYLELRNLRSDDTAVYFCAGVYEGEADEGEYDNNGFLKHWGQGTLVTVTSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPQPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>1gc1_L\nELELTQSPATLSVSPGERATLSCRASESVSSDLAWYQQKPGQAPRLLIYGASTRATGVPARFSGSGSGAEFTLTISSLQSEDFAVYYCQQYNNWPPRYTFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNR\n>1a4k_A\nELVMTQTPLSLPVSLGDQASISCRSSQSLLHSNGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQVTHVPPTFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRG\n>1a4k_H\nQVQLLESGPELKKPGETVKISCKASGYTFTNYGMNWVKQAPGKGLKWMGWINTYTGEPTYADDFKGRFAFSLETSASTAYLQINNLKNEDTATYFCVQAERLRRTFDYWGAGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>4ocs_H\nQAILVESGGGVVQPGRSLRLSCAASQFTFSGHGLHWVRQAPGKGLEWVASISFAGTKMDYADSVKGRFAISRDNSKNTLYLQMNSLRVEDTALYYCAKDMREYECEYWTSDYYDFGRPQPCIDRRGVVGIFDMWGQGTMVTVSTASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKGLEVLFQ\n>4ocs_L\nQSVLTQPPSVSAAPGQKVTISCSGSSSNIGDNYVSWYQHLPGTAPKLLIYENTRRPSGIPDRFSGSKSGTSATLAITGLQTGDEADYYCGTWDVRPNRGAVFGTGTKVTVLGQPKANPTVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>2aab_H\nDVQLVESGGGLVQPGGSRKLSCAASGFTFSSFGMHWVRQAPEKGLEWVAYISSDSSNIYYADTVKGRFTISRDNPKNTLFLQMTSLRSEDTAMYYCARSNYVGYHVRWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDCGCKPCICTVPEVSSVFIF\n>2aab_L\nDIQLTQSPASLAVSLGQRVTISCRASESVEYYGSSLMQWYQQKPGQPPKLLIYAASNVESGVPARFSGSGSGTDFSLNIHPVEEDDIAMYFCQQSRKIPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRGEC\n>1iqw_H\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSYWMQWVKQRPGQGLEWIGEIDPSDSYTNYNQKFKGKATLTVDTSSSTAYMQLSSLTSEDSAVYYCARNRDYSNNWYFDVWGTGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSQTVTCNVAHPASSTKVDKKIVPRDCGCKPCIC\n>1iqw_L\nDIVLTQSPASLAVSLGQRATISCKASQSVDYDGDSYMNWYQQKPGQPPKLLIYAASNLESGIPARFSGSGSGTDFTLNIHPVEEEDAATYYCQQSNEDPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1e4w_H\nQVQLQQPGAELVKPGASVKLSCKASGFTFTNYWMHWVKQRPGQGLEWIGEILPSNGRTNYNEKFKTKATLTVDKSSNTAYMQLSSLTSEDSAVYYCARSPSDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEP\n>1e4w_L\nDIQMTQTPSSLSASLGDRVTISCRASQDISHYLNWFQQKPDGTVKLLIYYTSTLHSGVPSRFSGSGSGTDYSLTISNLEEEDIAFYFCQQGGALPFTFGSGTKLAIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLDSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2r6p_E\nDIVLTQSPASLAVSLGQRATISCRASESVVRYGNSFMHWYQQKPGQPPKLLIYRASSLESGIPTRFSGSGSRTDFTLTINPVEADDVATYYCQQTNVDPWAFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDRQNGVLNSWTDQDSTYSMSSTLTLTKDEYERHNSYTCEATSPIVKSFNRNE\n>2r6p_D\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYMHWVKQRPEQGLEWIGRIDPANGYSKYDPKFQGKATITADTSSNAAYLQLSSLTSEDTAVYFCARDYEGFAYWGQGTLVTVSSAKTTPPSVYPLAPGAAAATSSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQTITCNVAHPASSTKVDKKIEPR\n>4at6_A\nQVQLQQPGPELVTPGASVKMSCTASGYSFSSYNIHWVKQTPGQGLEWIGVIYPGNGDTSYNQKFRDKATLTADKSSSTAYMQLSSLTSEDSAVYHCARGGSGLLAYWGQGTLVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>4at6_C\nQVQLQQPGPELVTPGASVKMSCTASGYSFSSYNIHWVKQTPGQGLEWIGVIYPGNGDTSYNQKFRDKATLTADKSSSTAYMQLSSLTSEDSAVYHCARGGSGLLAYWGQGTLVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>2bmk_A\nDIELTQSPAIMAASPGEKVTITCSATSGVNYMHWFQQKPGTSPKLWIYSTSNLASAVPARFSGSGSGTSYSLTISRMEAEDAATYYCQQRSTYPFTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2bmk_H\nEVKLQESGGGLVQPGHSLRLSCATSGFTFTDYYMSWVRQPPGKALEWLGLIRNKANGYTKEYSASVKGRFTISRDNSQSILYLQMNALRAEDSATYYCVRDKGSYGNYEAWFAYWGQGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRD\n>1iqd_A\nIALTQSPGTLSLSPGERATLSCRASQSFSSSYLAWYQQKPGQAPRLLIYGASTRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQKYGTSAITFGQGTRLEIKGTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNR\n>1iqd_B\nQVQLVQSGAEVKKPGASVKVSCKVSGYTLTELPVHWVRQAPGKGLEWVGSFDPESGESIYAREFQGSVTMTADTSTNIAYMELSSLRSDDTAVYYCAVPDPDAFDIWGQGTMVTVSSASTKGPSVFPLAPCSRSTSESTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTATYTCNVDHKPSNTKVDKRV\n>1e4x_I\nQVQLQQPGAELVKPGPSVKLSCKASGFTFTNYWMHWVKQRPGQGLEWIGEILPSNGRTNYNEKFKTKATLTVDKSSNTAYMQLSSLTSEDSAVYYCARSPSDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRVPI\n>1e4x_H\nQVQLQQPGAELVKPGASVKLSCKASGFTFTNYWMHWVKQRPGQGLEWIGEILPSNGRTNYNEKFKTKATLTVDKSSNTAYMQLSSLTSEDSAVYYCARSPSDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRVPI\n>1ynt_A\nDIQVTQTTSSLSASLGDRVTISCRASQDISNYLNWYQQKPDGTVKLLIYYTSRLHSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQGNTLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>1ynt_C\nDIQVTQTTSSLSASLGDRVTISCRASQDISNYLNWYQQKPDGTVKLLIYYTSRLHSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQGNTLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3sm5_I\nEVQLVQSGAEVKKPGASVKVSCKASGYTFTDYHINWVRQAPGQGLEWMGWIHPNSGDTNYAQKFQGWVTMTRDTAISTAYMEVNGLKSDDTAVYYCARGGLEPRSVDYYYYGMDVWGQGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>3sm5_H\nEVQLVQSGAEVKKPGASVKVSCKASGYTFTDYHINWVRQAPGQGLEWMGWIHPNSGDTNYAQKFQGWVTMTRDTAISTAYMEVNGLKSDDTAVYYCARGGLEPRSVDYYYYGMDVWGQGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>1mim_H\nQLQQSGTVLARPGASVKMSCKASGYSFTRYWMHWIKQRPGQGLEWIGAIYPGNSDTSYNQKFEGKAKLTAVTSASTAYMELSSLTHEDSAVYYCSRDYGYYFDFWGQGTTLTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEP\n>1mim_L\nQIVSTQSPAIMSASPGEKVTMTCSASSSRSYMQWYQQKPGTSPKRWIYDTSKLASGVPARFSGSGSGTSYSLTISSMEAEDAATYYCHQRSSYTFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGE\n>4edx_A\nDIQMTQTTSSLSASLGDRVTISCRASQDISNHLNWYQQKPDGTVKLLIYYISRFHSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQSKTLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4edx_H\nQVQLKESGPGLVAPSQSLSITCTVSGFSLIGYDINWVRQPPGKGLEWLGMIWGDGTTDYNSALKSRLSISKDNSKSQVFLKMNSLRTDDTATYSCARGGYYYGTSYYFDYWGQGTTLTVSSASTTPPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>4kph_I\nEVQLQESGPSLVKPSQTLSLTCSVTGDSITSGYWNWIRKFPGNRLEYMGYINYSGNTFYNPSLKSRISITRDTSKNQYCLQLNSVTTEDTATYYCATYRFNYWGQGTLVTVSAAKTTPPSVYPLAPGCGDTTGSSVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPALLQSGLYTMSSSVTVPSSTWPSQTVTCSVAHPASSTTVDKKLEP\n>4kph_H\nEVQLQESGPSLVKPSQTLSLTCSVTGDSITSGYWNWIRKFPGNRLEYMGYINYSGNTFYNPSLKSRISITRDTSKNQYCLQLNSVTTEDTATYYCATYRFNYWGQGTLVTVSAAKTTPPSVYPLAPGCGDTTGSSVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPALLQSGLYTMSSSVTVPSSTWPSQTVTCSVAHPASSTTVDKKLEP\n>1mie_H\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSSWINWVKQRPGQGLEWIGNVYPGSSSTNYNEKFKNKATLTVDTSSSTAYMQLSSLTSDDSAFYYCVRKDYSWFPYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTSGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPTIKPCPPCK\n>1mie_L\nEIVMTQAAPSVPVTPGESVSISCRSSKSLLHSNGNTYLNWFLQRPGQSPQLLIYRMSNLASGVPDRFSGSGSETAFTLRTSRVEAEDVGVYYCMQHLEYPFTFGSGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1rvf_H\nQGQLQQSGAELVRPGSSVKISCKASGYAFSSFWVNWVKQRPGQGLEWIGQIYPGDGDNKYNGKFKGKATLTADKSSTTAYMQLYSLTSEDSAVYFCARSGNYPYAMDYWGQGTSVTVSS\n>1rvf_L\nQIVLTQSPAIMSAFPGEKVTITCSATSSVNYMHWFQQKPGTSPKLWIYSSSNLASGVPARFSGSGSGTSYSLTISRMEAEDAATYYCQQRSSYPITFGSGTKLEIKRADA\n>4edw_H\nQVQLQESGPGLVKPSETLSLTCTVSGFSLIGYDLNWIRQPPGKGLEWIGIIWGDGTTDYNSAVKSRVTISKDTSKNQFSLKLSSVTAADTAVYYCARGGYWYATSYYFDYWGQGTLVTVSSASTKGPSVFPLAPCSRSTSESTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSNFGTQTYTCNVDHKPSNTKVDKTVERKTSHHHHHHG\n>4edw_L\nDIQMTQSPSSLSASVGDRVTITCRASQSISNNLNWYQQKPGKAPKLLIYYTSRFHSGVPSRFSGSGSGTDFTFTISSLQPEDIATYYCQQEHTLPYTFGQGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1ynk_H\nRVQLLESGAELMKPGASVQISCKATGYTFSEYWIEWVKERPGHGLEWIGEILPGSGRTNYREKFKGKATFTADTSSNTAYMQLSSLTSEDSAVYYCTRGYSSMDYWGQGTSVTVSAAKTTPPSVYPLAPGCGDTTGSSVTLGCLVKGYFPESVTVTWNSGSLSSSVHTFPALLQSGLYTMSSSVTVPSSTWPSQTVTCSVAHPASSTTVDKKLEPSGPI\n>1ynk_L\nELVMTQSPLSLPVSLGDQASISCRPSQSLVHSNGNTYLHWYLQKPGQSPKLLIYRVSNRFSGVPDRFSGSGSGTAFTLKISRVEAEDLGVYFCSQGTHVPYTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3n85_H\nEVQLVESGGGLVQPGGSLRLSCAASGFSIWWSWIHWVRQAPGKGLEWVASISPSSGWTSYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARWWSSAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>3n85_L\nDIQMTQSPSSLSASVGDRVTITCRASQSVSSAVAWYQQKPGKAPKLLIYSASSLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQWWWWPSTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGECEIS\n>4gxv_I\nEVQLVQSGGGVVQPRRSLRLSCAASGFTFSSYAMHWVRQAPGKGLEWVAVISYDGRNKYYADSVKGRFTVSRDNSKNTLYLQMNSLRAEDTSVYYCARELLMDYYDHIGYSPGPTWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>4gxv_H\nEVQLVQSGGGVVQPRRSLRLSCAASGFTFSSYAMHWVRQAPGKGLEWVAVISYDGRNKYYADSVKGRFTVSRDNSKNTLYLQMNSLRAEDTSVYYCARELLMDYYDHIGYSPGPTWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>4gxu_M\nEVQLVQSGGGVVQPRRSLRLSCAASGFTFSSYAMHWVRQAPGKGLEWVAVISYDGRNKYYADSVKGRFTVSRDNSKNTLYLQMNSLRAEDTSVYYCARELLMDYYDHIGYSPGPTWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>4gxu_O\nEVQLVQSGGGVVQPRRSLRLSCAASGFTFSSYAMHWVRQAPGKGLEWVAVISYDGRNKYYADSVKGRFTVSRDNSKNTLYLQMNSLRAEDTSVYYCARELLMDYYDHIGYSPGPTWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>2r69_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYMHWVKQRPEQGLEWIGRIDPANGYSKYDPKFQGKATITADTSSNAAYLQLSSLTSEDTAVYFCARDYEGFAYWGQGTLVTVSSAKTTPPSVYPLAPGAATSSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQTITCNVAHPASSTKVDKKIEPR\n>2r69_L\nDIVLTQSPASLAVSLGQRATISCRASESVVRYGNSFMHWYQQKPGQPPKLLIYRASSLESGIPTRFSGSGSRTDFTLTINPVEADDVATYYCQQTNVDPWAFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATSPIVKSFNRNE\n>1om3_H\nEVQLVESGGGLVKAGGSLILSCGVSNFRISAHTMNWVRRVPGGGLEWVASISTSSTYRDYADAVKGRFTVSRDDLEDFVYLQMHKMRVEDTAIYYCARKGSDRLSDNDPFDAWGPGTVVTVSPASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKS\n>1om3_K\nEVQLVESGGGLVKAGGSLILSCGVSNFRISAHTMNWVRRVPGGGLEWVASISTSSTYRDYADAVKGRFTVSRDDLEDFVYLQMHKMRVEDTAIYYCARKGSDRLSDNDPFDAWGPGTVVTVSPASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKS\n>1vfb_A\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFWSTPRTFGGGTKLEIK\n>1vfb_B\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSS\n>1vfa_A\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFWSTPRTFGGGTKLEIKR\n>1vfa_B\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSS\n>4fz8_H\nEVQLVESGGGLVKPGGSLRLSCAASGFTFSSYSMNWVRQAPGRGLEWVSSISNTSTYIYYADSVEGRFTLSRDNAKNSLYLQMNSLRAEDTAVYYCARANQHFDWLLSLLGGYHYYGMDVWGQGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKT\n>4fz8_L\nDIVMTQSPLSLPVTPGEPASISCRSSQSLLHSNGYNYLDWYLQKPGQSPQLLIYLGSNRASGVPDRFIGSGSGTDFTLKISRVEAEDVGVFYCMQALQAVGFGPGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3klh_C\nDIQMTQTTSSLSASLGDRVTISCSASQDISSYLNWYQQKPEGTVKLLIYYTSSLHSGVPSRFSGSGSGTDYSLTISNLEPEDIATYYCQQYSKFPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>3klh_D\nQITLKESGPGIVQPSQPFRLTCTFSGFSLSTSGIGVTWIRQPSGKGLEWLATIWWDDDNRYNPSLKSRLTVSKDTSNNQAFLNMMTVETADTAIYYCAQSAITSVTDSAMDHWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPADC\n>3ezj_H\nQVQLQESGGGLVQAGGSLRLSCAASGSIFSINSMDWDRQAPGKQRELVATITSGGSTNYADSVKGRFTISRDNAKNTVYLQMNSLKPEDTAVYYCNANVKTWAGMTRDYWGQGTQVTVSSHHHHHH\n>3ezj_B\nQVQLQESGGGLVQAGGSLRLSCAASGSIFSINSMDWDRQAPGKQRELVATITSGGSTNYADSVKGRFTISRDNAKNTVYLQMNSLKPEDTAVYYCNANVKTWAGMTRDYWGQGTQVTVSSHHHHHH\n>3qsk_B\nGSQVQLVESGGGLVQAGGSLRLSCAASGYHHPYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRFTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGHHLRDHTYGQWGQGTQVTVSS\n>2j88_H\nQVTLKESGPGILQPSQTLSLTCSFSGFSLSTSGMGVSWIRQPSGKGLEWLAHIYWDDDKRYNPSLKSRLTISKDTSRNQVFLKITSVDTADTATYYCTLYYGSVDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSST\n>2j88_L\nDIQMTQSPASLSASVGETVTITCRASENIYSYLTWYQQKQGKSPQLLVYNAKTLAEGVPSRFSGSGSGTQFSLKISSLQPEDFGNYYCQHHYGTRTFGGGTRLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4hzl_A\nEVMLVESGGDLVKPGGSLKLPCAASGFTVSTYAMSWIRQTPEKRLEWVATISSGGSYTYYPDNVKGRFTISRDIAKNTLYLQMSSLRSEDTAMYYCARHPPTVVAGDAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>4hzl_H\nEVMLVESGGDLVKPGGSLKLPCAASGFTVSTYAMSWIRQTPEKRLEWVATISSGGSYTYYPDNVKGRFTISRDIAKNTLYLQMSSLRSEDTAMYYCARHPPTVVAGDAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>2p46_B\nGSQVQMVESGGGLVQAGGSLRLSCAASGYAYTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRMTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGYELRDRTYGQWGQGTQVTVSS\n>2p46_D\nGSQVQMVESGGGLVQAGGSLRLSCAASGYAYTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRMTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGYELRDRTYGQWGQGTQVTVSS\n>4hh9_A\nEVVLTQSPATLSLSPGERATISCRASQSVGGYLTWYQQKPGQAPRLLIYDASNRATGIPARFSGSGSGTDFTLTISGLEPEDFAIYYCQQRGNWPPITFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4hh9_C\nEVVLTQSPATLSLSPGERATISCRASQSVGGYLTWYQQKPGQAPRLLIYDASNRATGIPARFSGSGSGTDFTLTISGLEPEDFAIYYCQQRGNWPPITFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2p44_B\nGSQVQLVESGGGLVQAGGSLRLSCAASGYAYTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRMTISRDKGKNTVYLQMDSMKPEDTATYYCAAGGYELRDRTYGQWGQGTQVTVSS\n>2p45_B\nGSQVQMVESGGGLVQAGGSLRLSCAASGYAYTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRMTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGYELRDRTYGQWGQGTQVTVSS\n>2p42_B\nGSQVQLVESGGGLVQAGGSLRLSCAASGYAYTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRFTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGYELRDRTYGQWGQGTQVTVSS\n>2p42_D\nGSQVQLVESGGGLVQAGGSLRLSCAASGYAYTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRFTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGYELRDRTYGQWGQGTQVTVSS\n>2p43_B\nGSQVQLVESGGGLVQAGGSLRLSCAASGYAYTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRFTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGYELRDRTYGQWGQGTQVTVSS\n>3grw_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTFTSTGISWVRQAPGKGLEWVGRIYPTNGSTNYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARTYGIYDLYVDYTEYVMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHT\n>3grw_L\nDIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2p48_B\nGSQVQMVESGGGLVQAGGSLRLSCAASGYAYTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRMTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGYELRDRTYGQWGQGTQVTVSS\n>2p49_B\nGSQVQLVESGGGLVQAGGSLRLSCAASGYAYTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRFTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGYELRDRTYGQWGQGTQVTVSS\n>4ej1_C\nQVQLQESGGGLVQAGGSLRLSCTASGRTFSSYAMGWFRQTPGKEREFVAAITWGGSTTLYADSVKGRFTMSRDNAKNTVYLQMNSLKPEDTAVYYCAADGSQYRSTYSFRDKPDYGSWGQGTQVTVSSHHHHHH\n>4ej1_D\nQVQLQESGGGLVQAGGSLRLSCTASGRTFSSYAMGWFRQTPGKEREFVAAITWGGSTTLYADSVKGRFTMSRDNAKNTVYLQMNSLKPEDTAVYYCAADGSQYRSTYSFRDKPDYGSWGQGTQVTVSSHHHHHH\n>3qa3_A\nDIEMTQSPSSLGVSVGEKVTMSCKSSQNLLYSSNQKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGTGSGTDFTLTISSVKAEDLAVYYCQQYYSYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3qa3_C\nDIEMTQSPSSLGVSVGEKVTMSCKSSQNLLYSSNQKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGTGSGTDFTLTISSVKAEDLAVYYCQQYYSYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3go1_H\nEVQLQESGPGLVKPSETLSLTCTVSGGPINNAYWTWIRQPPGKGLEYLGYVYHTGVTNYNPSLKSRLTITIDTSRKQLSLSLKFVTAADSAVYYCAREWAEDGDFGNAFHVWGQGTMVAVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEP\n>3go1_L\nSYVLTQPPSVSVSPGQTARITCSAEALSNQYAYWYRQRPGQAPLLIIYKDTKRPSGIPERFSGSTSGTTVTLTISGVQAEDEADYYCQSADSSGDYVFGGGTKVTVLGQPKANPTVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADGSPVKAGVETTKPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAP\n>3u30_C\nEVQLVESGGGLVQPGGSLRLSCAASGFTFSNTYISWVRQAPGKGLEWVASITPSSGQTDYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARTWLLRWVMDLWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHT\n>3u30_B\nDIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSAKFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3u36_A\nQRLVESGGGVVQPGSSLRLSCAASGFDFSRQGMHWVRQAPGQGLEWVAFIKYDGSEKYHADSVWGRLSISRDNSKDTLYLQMNSLRVEDTATYFCVREAGGPDYRNGYNYYDFYDGYYNYHYMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKGLEVLFQ\n>3u36_C\nQRLVESGGGVVQPGSSLRLSCAASGFDFSRQGMHWVRQAPGQGLEWVAFIKYDGSEKYHADSVWGRLSISRDNSKDTLYLQMNSLRVEDTATYFCVREAGGPDYRNGYNYYDFYDGYYNYHYMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKGLEVLFQ\n>4fze_H\nQVQLVQSGAEVKKPGSSAKVSCKASRGTLSSYFISWVRQAPGQGLEWLGGITPLLGTANYAQKFQGRVTITADKSTNTAFMQLSSLTSDDTAVYYCAGTVYYDILTGLYTNFHYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKTH\n>4fze_L\nQSVLTQPPSVSVSPGQTASITCSGDNLRDGYASWYQQKPGQSPVLVIYRDDKRPSGIPERFSGSSSGNTAILTLSGAQAMDEADYYCQAWASTTVIFGGGTRLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>2hvk_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>2hvk_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>3ehb_C\nEVKLQESGGDLVQPGGSLKLSCAASGFTFSSYTMSWVRQTPEKRLEWVASINNGGGRTYYPDTVKGRFTISRDNAKNTLYLQMSSLKSEDTAMYYCVRHEYYYAMDYWGQGTTVTVSSAWRHPQFGG\n>3ehb_D\nDIELTQTPVSLSASVGETVTITCRASENIYSYLAWYQQKQGKSPQFLVYNAKTLGEGVPSRFSGSGSGTQFSLKINSLLPEDFGSYYCQHHYGTPPLTFGGGTKLEIKREQKLISEEDLM\n>2p4a_B\nQVQLVESGGGLVQAGGSLRLSCAASGYPWTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRFTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGDALVATRYGRWGQGTQVTVSS\n>2p4a_D\nQVQLVESGGGLVQAGGSLRLSCAASGYPWTYIYMGWFRQAPGKEREGVAAMDSGGGGTLYADSVKGRFTISRDKGKNTVYLQMDSLKPEDTATYYCAAGGDALVATRYGRWGQGTQVTVSS\n>3b2u_C\nQVQLQESGPGLVKPSQTLSLTCTVSGGSISSGDYYWSWIRQPPGKGLEWIGYIYYSGSTDYNPSLKSRVTMSVDTSKNQFSLKVNSVTAADTAVYYCARVSIFGVGTFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKS\n>3b2u_D\nEIVMTQSPATLSLSPGERATLSCRASQSVSSYLAWYQQKPGQAPRLLIYDASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCHQYGSTPLTFGGGTKAEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGA\n>4hha_A\nEVVLTQSPATLSLSPGERATISCRASQSVGGYLTWYQQKPGQAPRLLIYDASNRATGIPARFSGSGSGTDFTLTISGLEPEDFAIYYCQQRGNWPPITFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4hha_B\nQVQLVESGGGVVQPGRSLRLSCAASGFTFSNHGMHWVRQAPGKRLEWVAVISYDGRHEHYADLVKGRFTISRDNSKNTLYLQMNSLRAEDRALYFCAREGLSRDNSGFTGLIDYWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTGLE\n>3b2v_H\nQVQLQESGPGLVKPSQTLSLTCTVSGGSISSGDYYWSWIRQPPGKGLEWIGYIYYSGSTDYNPSLKSRVTMSVDTSKNQFSLKVNSVTAADTAVYYCARVSIFGVGTFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKS\n>3b2v_L\nEIVMTQSPATLSLSPGERATLSCRASQSVSSYLAWYQQKPGQAPRLLIYDASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCHQYGSTPLTFGGGTKAEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGA\n>3opz_I\nVKLQQSGVELVRPGTSVKMSCKAVGYTFTYDWIGWVKQRPGHGLEWIGDIYLGGGYINYNEKFKGKVILTADTSSSTAYMQLSSLTSEDSAIYYCARGHYDGSYFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTSGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPTI\n>3opz_H\nVKLQQSGVELVRPGTSVKMSCKAVGYTFTYDWIGWVKQRPGHGLEWIGDIYLGGGYINYNEKFKGKVILTADTSSSTAYMQLSSLTSEDSAIYYCARGHYDGSYFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTSGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPTI\n>3uzq_A\nEVKLLEQSGAELVKPGASVRLSCTASGFNIKDTYMSWVKQRPEQGLEWIGRIDPANGDTKYDPKFQGKATITADTSSNTAYLHLSSLTSGDTAVYYCSRGWEGFAYWGQGTLVTVSAGGGGSGGGGSGGGGSELVMTQTPASLAVSLGQRATISCRASENVDRYGNSFMHWYQQKAGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYFCQRSNEVPWTFGGGTKLEIKRPLEHHHHHH\n>3uzq_A\nEVKLLEQSGAELVKPGASVRLSCTASGFNIKDTYMSWVKQRPEQGLEWIGRIDPANGDTKYDPKFQGKATITADTSSNTAYLHLSSLTSGDTAVYYCSRGWEGFAYWGQGTLVTVSAGGGGSGGGGSGGGGSELVMTQTPASLAVSLGQRATISCRASENVDRYGNSFMHWYQQKAGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYFCQRSNEVPWTFGGGTKLEIKRPLEHHHHHH\n>3uze_A\nEVKLLEQSGAELVKPGASVRLSCTASGFNIKDTYMSWVKQRPEQGLEWIGRIDPANGDTKYDPKFQGKATITADTSSNTAYLHLSSLTSGDTAVYYCSRGWEGFAYWGQGTLVTVSAGGGGSGGGGSGGGGSELVMTQTPASLAVSLGQRATISCRASENVDRYGNSFMHWYQQKAGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYFCQRSNEVPWTFGGGTKLEIKRPLEHHHHHH\n>3uze_A\nEVKLLEQSGAELVKPGASVRLSCTASGFNIKDTYMSWVKQRPEQGLEWIGRIDPANGDTKYDPKFQGKATITADTSSNTAYLHLSSLTSGDTAVYYCSRGWEGFAYWGQGTLVTVSAGGGGSGGGGSGGGGSELVMTQTPASLAVSLGQRATISCRASENVDRYGNSFMHWYQQKAGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYFCQRSNEVPWTFGGGTKLEIKRPLEHHHHHH\n>3uze_B\nEVKLLEQSGAELVKPGASVRLSCTASGFNIKDTYMSWVKQRPEQGLEWIGRIDPANGDTKYDPKFQGKATITADTSSNTAYLHLSSLTSGDTAVYYCSRGWEGFAYWGQGTLVTVSAGGGGSGGGGSGGGGSELVMTQTPASLAVSLGQRATISCRASENVDRYGNSFMHWYQQKAGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYFCQRSNEVPWTFGGGTKLEIKRPLEHHHHHH\n>3uze_B\nEVKLLEQSGAELVKPGASVRLSCTASGFNIKDTYMSWVKQRPEQGLEWIGRIDPANGDTKYDPKFQGKATITADTSSNTAYLHLSSLTSGDTAVYYCSRGWEGFAYWGQGTLVTVSAGGGGSGGGGSGGGGSELVMTQTPASLAVSLGQRATISCRASENVDRYGNSFMHWYQQKAGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYFCQRSNEVPWTFGGGTKLEIKRPLEHHHHHH\n>3sy0_A\nDIVMSQSPSSLAVSAGEKVTMSCKSSQSLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTITSVQAEDLAVYYCKQSYNLRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3sy0_B\nEVKLVESGGGLVQSGGSLRLSCATSGFTFTDYYMSWVRQPPGKALEWLGFIRNKANGYTTEYSPSVKGRFTISRDNSQSILYLQMNTLRAEDSATYYCARDHDGYYERFSYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>3etb_I\nMADYKDIQMTQTTSSLSASLGDRVTVSCRASQDIRNYLNWYQQKPDGTVKFLIYYTSRLQPGVPSRFSGSGSGTDYSLTINNLEQEDIGTYFCQQGNTPPWTFGGGTKLEIKRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPELVKPGASVKISCKDSGYAFNSSWMNWVKQRPGQGLEWIGRIYPGDGDSNYNGKFEGKAILTADKSSSTAYMQLSSLTSVDSAVYFCARSGLLRYAMDYWGQGTSVTVSS\n>3etb_I\nMADYKDIQMTQTTSSLSASLGDRVTVSCRASQDIRNYLNWYQQKPDGTVKFLIYYTSRLQPGVPSRFSGSGSGTDYSLTINNLEQEDIGTYFCQQGNTPPWTFGGGTKLEIKRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPELVKPGASVKISCKDSGYAFNSSWMNWVKQRPGQGLEWIGRIYPGDGDSNYNGKFEGKAILTADKSSSTAYMQLSSLTSVDSAVYFCARSGLLRYAMDYWGQGTSVTVSS\n>3etb_H\nMADYKDIQMTQTTSSLSASLGDRVTVSCRASQDIRNYLNWYQQKPDGTVKFLIYYTSRLQPGVPSRFSGSGSGTDYSLTINNLEQEDIGTYFCQQGNTPPWTFGGGTKLEIKRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPELVKPGASVKISCKDSGYAFNSSWMNWVKQRPGQGLEWIGRIYPGDGDSNYNGKFEGKAILTADKSSSTAYMQLSSLTSVDSAVYFCARSGLLRYAMDYWGQGTSVTVSS\n>3etb_H\nMADYKDIQMTQTTSSLSASLGDRVTVSCRASQDIRNYLNWYQQKPDGTVKFLIYYTSRLQPGVPSRFSGSGSGTDYSLTINNLEQEDIGTYFCQQGNTPPWTFGGGTKLEIKRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPELVKPGASVKISCKDSGYAFNSSWMNWVKQRPGQGLEWIGRIYPGDGDSNYNGKFEGKAILTADKSSSTAYMQLSSLTSVDSAVYFCARSGLLRYAMDYWGQGTSVTVSS\n>3chn_A\nQVKLLEQSGAEVKKPGASVKVSCKASGYSFTSYGLHWVRQAPGQRLEWMGWISAGTGNTKYSQKFRGRVTFTRDTSATTAYMGLSSLRPEDTAVYYCARDPYGGGKSEFDYWGQGTLVTVSSASPTSPKVFPLSLCSTQPDGNVVIACLVQGFFPQEPLSVTWSESGQGVTARNFPPSQDASGDLYTTSSQLTLPATQCLAGKSVTCHVKHYTNPSQDVTVPCPVPSTPPTPSPSTPPTPSPSCCHPRLSLHRPALEDLLLGSEANLTCTLTGLRDASGVTFTWTPSSGKSAVQGPPERDLCGCYSVSSVLPGCAEPWNHGKTFTCTAAYPESKTPLTATLSKSGNTFRPEVHLLPPPSEELALNELVTLTCLARGFSPKDVLVRWLQGSQELPREKYLTWASRQEPSQGTTTFAVTSILRVAAEDWKKGDTFSCMVGHEALPLAFTQKTIDRLAGKPTHVNVSVVMAEVDGTCY\n>3chn_C\nQVKLLEQSGAEVKKPGASVKVSCKASGYSFTSYGLHWVRQAPGQRLEWMGWISAGTGNTKYSQKFRGRVTFTRDTSATTAYMGLSSLRPEDTAVYYCARDPYGGGKSEFDYWGQGTLVTVSSASPTSPKVFPLSLCSTQPDGNVVIACLVQGFFPQEPLSVTWSESGQGVTARNFPPSQDASGDLYTTSSQLTLPATQCLAGKSVTCHVKHYTNPSQDVTVPCPVPSTPPTPSPSTPPTPSPSCCHPRLSLHRPALEDLLLGSEANLTCTLTGLRDASGVTFTWTPSSGKSAVQGPPERDLCGCYSVSSVLPGCAEPWNHGKTFTCTAAYPESKTPLTATLSKSGNTFRPEVHLLPPPSEELALNELVTLTCLARGFSPKDVLVRWLQGSQELPREKYLTWASRQEPSQGTTTFAVTSILRVAAEDWKKGDTFSCMVGHEALPLAFTQKTIDRLAGKPTHVNVSVVMAEVDGTCY\n>1fig_H\nDVQLQQSGPELEKPGASVKISCKASGFSLPGHNINWIVQRNGKSLEWIGNIDPYYGGTNFNPKFKGKATLTVDKSSSTLYMHLTSLQSEDSAVYYCARRRDGNYGFTYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKI\n>1fig_L\nENVLTQSPAIMSASPGEKVTMACRASSSVSSTYLHWYQQKSGASPKLLIYSTSNLASGVPARFSGSGSGTSYSLTISSVEAEDAATYYCQQYSGYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1ngw_A\nELVMTQTPKFMSTTVGDRVSITCKASQNVGTPVAWYQQKPGQSPKLLIYSASNRYTGVPDRFTGSGSGTDFTLTISNMQSEDLADYFCQQYSSYPLTFGGGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRNE\n>1ngw_H\nQVQLLESGAELVKPGASVKLSCKASGYTFTSYWMHWVKQRPGRGLEWIGMIDPNSGGTKYNEKFKSKATLTVDKPSNTAYMQLSSLTSEDSAVYYCTRRDMDYWGAGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKIVPKS\n>4jpv_H\nQVQLLQSGAAVTKPGASVRVSCEASGYNIRDYFIHWWRQAPGQGLQWVGWINPKTGQPNNPRQFQGRVSLTRHASWDFDTYSFYMDLKALRSDDTAVYFCARQRSDYWDFDVWGSGTQVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>4jpv_L\nDIQMTQSPSSLSASVGDTVTITCQANGYLNWYQQRRGKAPKLLIYDGSKLERGVPSRFSGRRWGQEYNLTINNLQPEDIATYFCQVYEFVVPGTRLDLKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4jpw_H\nSQHLVQSGTQVKKPGASVRVSCQASGYTFTNYILHWWRQAPGQGLEWMGLIKPVFGAVNYARQFQGRIQLTRDIYREIAFLDLSGLRSDDTAVYYCARDESGDDLKWHLHPWGQGTQVIVSPASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>4jpw_L\nDIQMTQSPSSLSASVGDRVTINCQAGQGIGSSLNWYQKKPGRAPKLLVHGASNLQRGVPSRFSGSGFHTTFTLTISSLQPDDVATYFCAVFQWFGPGTKVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLRSPVTKSFNRGEC\n>4b5e_A\nEVQLVESGGGLVQAGGSLRLSCAASGRSFSRDAMGWFRQAPGKERDVVAAINLNGGRTYSADSVKGRFTISRDNDKNTVYLQMSNLKPEDTAVYYCAAREGDVGLVSYKRSSNYPYWGQGTQVTVSS\n>4b5e_B\nEVQLVESGGGLVQAGGSLRLSCAASGRSFSRDAMGWFRQAPGKERDVVAAINLNGGRTYSADSVKGRFTISRDNDKNTVYLQMSNLKPEDTAVYYCAAREGDVGLVSYKRSSNYPYWGQGTQVTVSS\n>1ngy_A\nELVMTQTPKFMSTTVGDRVSITCKASQNVGTPVAWYQQKPGQSPKLLIYSASNRYTGVPDRFTGSGSGTDFTLTISNMQSEDLADYFCQQYSSYPLTFGGGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGE\n>1ngy_B\nQVQLLESGAELVKPGASVKLSCKASGYTFTSYWMHWVKQRPGRGLEWIGMIDPNSGGTKYNEKFKSKATLTVDKPSNTAYMQLSSLTSEDSAVYYCTRRDMDYWGAGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKS\n>1ngz_A\nELVMTQTPKFMSTSVGDRVSITCKASQNVGTAVAWYQQKPGQSPKLLIYSASNRYTGVPDRFTGSGSGTDFTLTISNMQSEDLADYFCQQYSSYPLTFGGGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGE\n>1ngz_B\nQVQLLESGAELVKPGASVKLSCKASGYTFTSYWMHWVKQRPGRGLEWIGRIDPNSGGTKYNEKFKSKATLTVDKPSSTAYMQLSSLTSEDSAVYYCTRRDSDYWGAGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKT\n>4jpk_H\nQVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGWINPNSGGTNYAQKFQGRVTMTRDTSISTAYMELSRLRSDDTAVYYCARGKNSDYNWDFQHWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTKLGGSGGHHHHHHGGSGHG\n>4jpk_L\nEIVLTQSPATLSLSPGERATLSCRASQSVSSYLAWYQQKPGQAPRLLIYDASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCQQYEFFGQGTKLEIKRSTVAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4jpi_A\nQVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGWINPNSGGTNYAQKFQGRVTMTRDTSISTAYMELSRLRSDDTAVYYCARGKNCDYNWDFQHWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTKLGGSGGHHHHHHGGSGHG\n>4jpi_H\nQVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGWINPNSGGTNYAQKFQGRVTMTRDTSISTAYMELSRLRSDDTAVYYCARGKNCDYNWDFQHWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTKLGGSGGHHHHHHGGSGHG\n>1emt_H\nQVHLQESGPELVRPGASVKISCKTSGYVFSSSWMNWVKQRPGQGLKWIGRIYPGNGNTNYNEKFKGKATLTADKSSNTAYMQLSSLTSVDSAVYFCATSSAYWGQGTLLTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPR\n>1emt_L\nDIQMTQTTSSLSASLGDRVTFSCSASQDISNYLNWYQQKPDGTIKLLIYYTSSLRSGVPSRFSGSGSGTDYSLTINNLEPEDIATYFCQQYSRLPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2c1o_A\nVQLQQSGAELVRPGTSVKLSCKASGYSFTNYWMNWLRELVMTQSPLTLSVTIGQPASISCKSSQSLLYSNGKTYLNWLLQRPGQSPKRLIYLVSKLDSGDPDRFTGSGSGTDFTLKISRVEAEDLGIYYCVQGSHFPPTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>2c1o_H\nEVQLQQSGAELVRPGTSVKLSCKASGYSFTNYWMNWLRQRPGQGLDWIGMIHPSDSETRLNQKFKDKATLTVDRSSSTAYIQLSSPTSEDSAVYYCARDDYDGAFWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPAPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>4f57_H\nEVQLVESGGGVVQPGGSLRLSCVASGFSFSDFGMNWVRQAPGKGLEWVAFVPFDRRINYYAESVRGRFTISRDDSKNTVFLQMDSLRPEDTAIYYCAKHRSQWNFWPREGGLDHWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>4f57_L\nQSALTQPASVSGSPGQSITISCTGTSSDVGGYNYVSWYRQHPGEAPKAIIFDVTNRPSGISNRFSGSKFGNTASLTISGLQAEDEADYYCAAYTVASTLLFGGGTKVTVLRQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPT\n>1w72_I\nEVQLVESGGGLVQPGRSLRLSCAASGFTFDDYAMHWVRQAPGKGLEWVSGISWNSGSIGYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARGRGFHYYYYGMDIWGQGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>1w72_H\nEVQLVESGGGLVQPGRSLRLSCAASGFTFDDYAMHWVRQAPGKGLEWVSGISWNSGSIGYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARGRGFHYYYYGMDIWGQGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>4f58_I\nEVQLVESGGGVVQPGGSLRLSCVASGFSFSDFGMNWVRQAPGKGLEWVAFVPFDRRINYYAESVRGRFTISRDDSKNTVFLQMDSLRPEDTAIYYCAKHRSQWNFWPREGGLDHWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>4f58_H\nEVQLVESGGGVVQPGGSLRLSCVASGFSFSDFGMNWVRQAPGKGLEWVAFVPFDRRINYYAESVRGRFTISRDDSKNTVFLQMDSLRPEDTAIYYCAKHRSQWNFWPREGGLDHWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>3ffd_A\nEVQLVESGGDLVKPGGSLKLSCAASGFTFSSYGMSWIRQTPDKRLEWVATISSGGSYTYYPDSVKGRFTISRDNAKNTLYLQMSSLKSEDTAMFYCARQTTMTYFAYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIEPA\n>3ffd_B\nQLVLTQSSSASFSLGASAKLTCTLSSQHSTYTIEWYQQQPLKPPKYVMDLKQDGSHSTGDGIPDRFSGSSSGADRYLSISNIQPEDEAMYICGVGDTIKEQFVYVFGGGTKVTVLGEPKSTPTLTVFPPSSEELKENKATLVCLISNFSPSGVTVAWKANGTPITQGVDTSNPTKEGNKFMASSFLHLTSDQWRSHNSFTCQVTHEGDTVEKSLSPAECL\n>4nzr_H\nQLQMQESGPGLVKPSETLSLSCTVSGDSIRGGEWGDKDYHWGWVRHSAGKGLEWIGSIHWRGTTHYKESLRRRVSMSIDTSRNWFSLRLASVTAADTAVYFCARHRHHDVFMLVPIAGWFDVWGPGVQVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>4nzr_L\nEIVMTQSPDTLSVSPGETVTLSCRASQNINKNLAWYQYKPGQSPRLVIFETYSKIAAFPARFVASGSGTEFTLTINNMQSEDVAVYYCQQYEEWPRTFGQGTKVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4nzt_H\nQVQLVQSGAEVKKPGSSVKVSCKSSGGTSNNYAISWVRQAPGQGLDWMGGISPIFGSTAYAQKFQGRVTISADIFSNTAYMELNSLTSEDTAVYFCARHGNYYYYSGMDVWGQGTTVTVSSASTKGPSVFPLAPSSKSAAGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCHHHHHH\n>4nzt_L\nQSALTQPPAVSGTPGQRVTISCSGSDSNIGRRSVNWYQQFPGTAPKLLIYSNDQRPSVVPDRFSGSKSGTSASLAISGLQSEDEAEYYCAAWDDSLKGAVFGGGTQLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>4nzu_H\nAVSLVESGGGTVEPGSTLRLSCAASGFTFGSYAFHWVRQAPGDGLEWVAFISYNGSSKYYASFVSGRFTISRDNSSNTLSLQMNSLKASDTAVYYCARAPDCADADCHKGAFGYWGQGTLVTVSSASTKGPSVFPLAPSSKTSSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>4nzu_L\nDIEMTQSPSSLSASTGDKVTITCQASQDIAKFLDWYQQRPGKTPKLLIYDASNLAIGVPSRFTGSGSGTDFTFTISSLQPEDIAVYYCQHYDDFPISFGPGTKLETKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNR\n>4lbe_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>4lbe_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>4c83_A\nDVQLVESGGGLVQPGGSRKLSCAASGFTFRRFGMHWVRQSPEKGLEWVAYIGGGSSTIYYADTVKGRFTISRDNPKNTLFLQMTSLRSEDTAMYYCTRDETGSWFAYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRVP\n>4c83_C\nDVQLVESGGGLVQPGGSRKLSCAASGFTFRRFGMHWVRQSPEKGLEWVAYIGGGSSTIYYADTVKGRFTISRDNPKNTLFLQMTSLRSEDTAMYYCTRDETGSWFAYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRVP\n>3et9_F\nMADYKDIVLIQSTSSLSASLGDRVTISCRASQDIRNYLNWYQQKPDGTVKLLIYYTSRLLPGVPSRFSGSGSGTDYSLTISNLEQEDIGTYFCQQGNTLPWTFGGGTKLEIRRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPELVKPGASVKISCKDSGYAFSSSWMNWVKQRPGQGPEWIGRIYPGDGDTNYNGKFKGKATLTADKSSSTAYMQLSSLTSVDSAVYFCARSGLLRYAMDYWGQGTSVTVSS\n>3et9_F\nMADYKDIVLIQSTSSLSASLGDRVTISCRASQDIRNYLNWYQQKPDGTVKLLIYYTSRLLPGVPSRFSGSGSGTDYSLTISNLEQEDIGTYFCQQGNTLPWTFGGGTKLEIRRGGGGSGGGGSGGGGSGGGGSEVQLQQSGPELVKPGASVKISCKDSGYAFSSSWMNWVKQRPGQGPEWIGRIYPGDGDTNYNGKFKGKATLTADKSSSTAYMQLSSLTSVDSAVYFCARSGLLRYAMDYWGQGTSVTVSS\n>2c1p_A\nELVMTQSPLTLSVTIGQPASISCKSSQSLLYSNGKTYLNWLLQRPGQSPKRLIYLVSKLDSGDPDRFTGSGSGTDFTLKISRVEAEDLGIYYCVQGSHFPPTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>2c1p_H\nVQLQQSGAELVRPGTSVKLSCKASGYSFTNYWMNWLRQRPGQGLDWIGMIHPSDSETRLNQKFKDKATLTVDRSSSTAYIQLSSPTSEDSAVYYCARDDYDGAFWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPAPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>4ogx_H\nEVQLLESGGGLVQPGGSLRLSCAASGFTFSHYIMMWVRQAPGKGLEWVSGIYSSGGITVYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAYRRIGVPRRDEFDIWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSC\n>4ogx_L\nDIQMTQSPSTLSASVGDRVTITCRASQSISSWLAWYQQKPGKAPKLLIYKASTLESGVPSRFSGSGSGTEFTLTISSLQPDDFATYYCQQYNTYWTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4ogy_H\nEVQLLESGGGLVQPGGSLRLSCAASGFTFSHYIMMWVRQAPGKGLEWVSGIYSSGGITVYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAYRRIGVPRRDEFDIWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSC\n>4ogy_M\nEVQLLESGGGLVQPGGSLRLSCAASGFTFSHYIMMWVRQAPGKGLEWVSGIYSSGGITVYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAYRRIGVPRRDEFDIWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSC\n>1zwi_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>1zwi_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1m7i_A\nDVVLTQTPLSLPVRLGDQASISCRSSQSLLHSDGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQTTHVPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1m7i_B\nEVKVEESGGGLVQPGGSMKLSCVASGFTFSNYWMEWVRQSPEKGLEWVAEIRLKSNNYATHYAESVKGRFTISRDDSKSSVYLQMNNLRAEDTGIYYCTRGGAVGAMDYWGQGTSVTVSSATTTAPSVYPLVPGCSDTSGSSVTLGCLVKGYFPEPVTVKWNYGALSSGVRTVSSVLQSGFYSLSSLVTVPSSTWPSQTVICNVAHPASKVDLIKEPSGP\n>4o02_H\nQVQLQQSGAELAEPGASVKMSCKASGYTFSSFWMHWVKQRPGQGLEWIGYINPRSGYTECNEIFRDKATMTADTSSSTAYMQLSGLTSEDSAVYYCASFLGRGAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSAGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>4o02_L\nDIQMTQTTSSLSASLGDRVIISCRASQDISNYLSWYQQKPDGTVKLLIFYTSKLHSGVPSRFSGSGSGTDYSLTISNLDQEDIATYFCQQGNTFPYTFGGGTKVEMRRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4idl_A\nMAKVQLQQSGGGAVQTGGSLKLTCLASGNTASIRAMGWYRRAPGKQREWVASLTTTGTADYGDFVKGRFTISRDNANNAATLQMDSLKPEDTAVYYCNADGRRFDGARWREYESWGQGTQVTISSAAALEHHHHHH\n>4aeh_H\nQVQLQQPGAEVVKPGASVRLSCKASGYSFTSNWINWVKQRPGQGLEWIGNISPGGSNTNHNEKFKSKATLTADTSSSTAYMQLSSLTSDDSAVYYCARYDGDYGSFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSESITCNVAHPASSTKVDKKIEPRGPTIKPCPPCKC\n>4aeh_L\nDVQMTQSPASLSVSVGETVTITCRASENIYRNLAWYQQKQGKSPQLLVYAATNLAAGVPSRFSGSGSGTQYSLKINSLQSEDFGSYYCQHFWNIPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4aei_I\nEVHLVESGGGLVKPGGSLKLSCAASGFTFSGYYMYWVRQTPEKRLEWVASISDGGSFTYYPDSVKGRFTISRDNAKNNLYLQMSSLRSDDTAMYYCSRPDDYSYDGFAYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDCGCKPCIC\n>4aei_H\nEVHLVESGGGLVKPGGSLKLSCAASGFTFSGYYMYWVRQTPEKRLEWVASISDGGSFTYYPDSVKGRFTISRDNAKNNLYLQMSSLRSDDTAMYYCSRPDDYSYDGFAYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDCGCKPCIC\n>4oga_C\nQVQLKESGPGLVAPSQSLSITCTVSGFPLTAYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLQTDDTARYYCARDPYGSKPMDYWGQGTSVTVSS\n>4oga_D\nDIVMSQSPSSLVVSVGEKVTMSCKSSQSLLYSSNQKNFLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVKAEDLAVYYCQQYFRYRTFGGGTKLEIKRA\n>3dro_A\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYECEVTHQGLSSPVTKSFNRGEC\n>3dro_B\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTAGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEPKSC\n>3p30_H\nALQLVQSGAEVKKAGSSVRVSCKASGATFSSYSISWVRQAPGQGPQWMGGIVPSSGAAKYAQQFQGRLTITADTSTNTAYLELSSLRYDDTAVYYCTRDRSRVRYFDRESGWFDPWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>3p30_L\nQSVLTQPPSVSGTPGQRVTISCSGSSSNIGNNYVYWYQQLPGTAPKLLIYKNNIRPSGVPDRFSGSKSGTSASLAISGLRSEDEADYYCAAWDDSLSGPYVFGAGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPIKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAP\n>3utz_A\nDVLMTQTPLSLPVSLGDQASISCRSSQSIVHSNGNTFLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQASHVPPTFGSGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3utz_C\nEVKLVESGGGLVKPGGSLKLSCAASGFAFSTYDMSWIRQTPEKRLEWVATISSGGSYTYYPDSVKGRFTISKDNARNTLYLQMSSLRSGDTALYYCTRFRYDGWYFDVWGQGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKT\n>1za3_A\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYAASYLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQSSSSPYTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1za3_H\nEVQLVESGGGLVQPGGSLRLSCAASGFSIYSYSIHWVRQAPGKGLEWVASISPYSGYTSYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRYSSYYSYYYSSSSYSYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>3drq_A\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYECEVTHQGLSSPVTKSFNRGEC\n>3drq_B\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTAGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEPKSC\n>1za6_A\nDIVMSQSPDSLAVSLGERVTLNCKSSQSLLYSGNQKNYLAWYQQKPGQSPKLLIYWASARESGVPDRFSGSGSGTDFTLTISSVQAEDVAVYYCQQYYSYPLTFGAGTKLELKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1za6_C\nDIVMSQSPDSLAVSLGERVTLNCKSSQSLLYSGNQKNYLAWYQQKPGQSPKLLIYWASARESGVPDRFSGSGSGTDFTLTISSVQAEDVAVYYCQQYYSYPLTFGAGTKLELKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3drt_A\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYECEVTHQGLSSPVTKSFNRGEC\n>3drt_B\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTAGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEPKSC\n>1dqq_A\nDIVLTQSPATLSVTPGDSVSLSCRASQSISNNLHWYQQKSHESPRLLIKYASQSISGIPSRFSGSGSGTDFTLSINSVETEDFGMYFCQQSNSWPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1dqq_C\nDIVLTQSPATLSVTPGDSVSLSCRASQSISNNLHWYQQKSHESPRLLIKYASQSISGIPSRFSGSGSGTDFTLSINSVETEDFGMYFCQQSNSWPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3bz4_A\nDIVMTQAAFSNPVTLGTSASISCRSSKSLLHSDGITYLYWYLQKPGQSPHLLIYHLSNLASGVPDRFSSSGSGTDFTLRISRVEAEDVGIYYCAHNVELPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3bz4_C\nDIVMTQAAFSNPVTLGTSASISCRSSKSLLHSDGITYLYWYLQKPGQSPHLLIYHLSNLASGVPDRFSSSGSGTDFTLRISRVEAEDVGIYYCAHNVELPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1m71_A\nDVVLTQTPLSLPVRLGDQASISCRSSQSLLHSDGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQTTHVPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1m71_B\nEVKVEESGGGLVQPGGSMKLSCVASGFTFSNYWMEWVRQSPEKGLEWVAEIRLKSNNYATHYAESVKGRFTISRDDSKSSVYLQMNNLRAEDTGIYYCTRGGAVGAMDYWGQGTSVTVSSATTTAPSVYPLVPGCSDTSGSSVTLGCLVKGYFPEPVTVKWNYGALSSGVRTVSSVLQSGFYSLSSLVTVPSSTWPSQTVICNVAHPASKVDLIKEPSGP\n>1dql_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMHWVRQAPGKGLEWVAVISSDGGNKYYTDSVKGRFTISRNDSKNTLYLQMNSLRTEDTAVFYCARGNPPYSSGWGGGDYWGQGTMVTVSS\n>1dql_L\nDIQMTQSPSSLSASVGDRVTITCRASQDIRNDLGWYQQKPGKAPKKLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCLQQNSNWTFGQGTKVDIK\n>1dqm_H\nEVQLQESGPSLVKPSQTLSLTCSVTGDSVTSDYWSWIRKFPGNKLEYMGYISYSGSTYYHPSLKSRISITRDTSKNQYYLQLNSVTTEDTATYYCASWGGDVWGAGTTVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKI\n>1dqm_L\nDIVLTQSPATLSVTPGDSVSLSCRASQSISNNLHWYQQKSHESPRLLIKYASQSISGIPSRFSGSGSGTDFTLSINSVETEDFGMYFCQQSNSWPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1dqd_H\nEVQLQESGPSLVKPSQTLSLTCSVTGDSITSGYWNWIRKFPGNKLEYMGYISYSGSTYYNPSLKSRLSITRDTSRNQYYLQLKSVTPEDTATYYCASPPGYYGSGPYAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKISPG\n>1dqd_L\nAAQPAMADIVLSQSPAIMSASPGEKVTITCSASSSVSYMHWFQQKPGTSPKLCIYTTSNLASGVPARFSGSGSGTSYSLTISRMEAEDAATYYCQQRSTYPPTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPRDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNECA\n>1bgx_H\nEVQLQESGPGLVKPYQSLSLSCTVTGYSITSDYAWNWIRQFPGNKLEWMGYITYSGTTDYNPSLKSRISITRDTSKNQFFLQLNSVTTEDTATYYCARYYYGYWYFDVWGQGTTLTVSSAKTTAPSVYPLAPVSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>1bgx_L\nDIQMTQSPAIMSASPGEKVTMTCSASSSVSYMYWYQQKPGSSPRLLIYDSTNLASGVPVRFSGSGSGTSYSLTISRMEAEDAATYYCQQWSTYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>4k8r_H\nEVQLVESGGGLVKPGGSLRLSCAASGFTFSSYSMNWVRQAPGKGLEWVSSISSSSSYISYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYFCARDYDFWSAYYDAFDVWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCAADEVDHHHHHH\n>4k8r_C\nAIQLTQSPSSLSASVGDRVTITCRASQGISSALAWYQQKPGKAPKLLIYDASSLESGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQFNSYLITFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1zan_H\nQVQLKESGPGLVQPSQTLSLTCTVSGFSLTNNNVNWVRQATGRGLEWMGGVWAGGATDYNSALKSRLTITRDTSKSQVFLKMHSLQSEDTATYYCARDGGYSSSTLYAMDAWGQGTTVTVSSASTTAPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLASGVHTFPAVLQSGLYTLSSSVTVPASPWASEAVTCNVAHPASSTKVDKKIVPRDC\n>1zan_L\nDIQMTQSPASLSASLGETVTIECRASEDIYNALAWYQQKPGKSPQLLIYNTDTLHTGVPSRFSGSGSGTQYSLKINSLQSEDVASYFCQHYFGYPRTFGGGTKLELKRADAAPTVSIFPPSSEQLASGGASVVCLLNNFYPKDISVKWKIDGSERQNGVLDSVTDQDSKDSTYSMSSTLTLTKAEYESHNSYTCEVTHKTSTSPVVKSFNRGEC\n>2cju_H\nEVKLVESGGGLVQPGGSLRLSCATSGFTFTNYYMNWVRQPPGKALEWLVSIRNKANGYTTDYSASVKGRFTISRDNSQSILYLEMNNLRAEDSATYYCARGYGYGAWFAYWGQGTLVTVSA\n>2cju_L\nQVLMTQTPLSLPVSLGDQASISCRSSQSIVHSNGNTYLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHVPYTFGGGTKLEIKR\n>1hys_C\nDIQMTQTTSSLSASLGDRVTISCSASQDISSYLNWYQQKPEGTVKLLIYYTSSLHSGVPSAFSGSGSGTDYSLTISNLEPEDFATYYCQQYSKFPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVAWAIDGSAAANGVLNSWTDQDSKDSTYSMSSTLTLTADAYEAANSYTCAATHKTSTSPIVKSFNANEC\n>1hys_D\nQITLKESGPGIVQPSQPFRLTCTFSGFSLSTSGIGVTWIRQPSGKGLEWLATIWWDDDNRYNPSLKSRLTVSKDTSNNQAFLNMMTVETADTAIYYCAQSAITSVTDSAMDHWGQGTSVTVSSAATTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKI\n>4jfx_A\nDIVLTQSPATLSLSPGERATLSCMTSTDIDDDMNWYQQKPGQAPRLLISEGNTLRPGVPARFSGSGSGTDFTLTISSLEPEDFAVYYCLQSFNVPLTFGQGTKVEIKRTVAAPSVFIFPPSDSQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4jfx_H\nEISEVQLVESGGGLVQPGGSLRLSCVTSGFTFRKFGMSWVRQAPGKGLEWVASIVTGGRKTYYSDSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCTRGYSSTSYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKSHTATGA\n>4jfy_A\nDIVLTQSPATLSLSPGERATLSCMTSTDIDDDMNWYQQKPGQAPRLLISEGNTLRPGVPARFSGSGSGTDFTLTISSLEPEDFAVYYCLQSFNVPLTFGQGTKVEIKRTVAAPSVFIFPPSDSQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4jfy_H\nEISEVQLVESGGGLVQPGGSLRLSCVTSGFTFRKFGMSWVRQAPGKGLEWVASIVTGGRKTYYSDSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCTRGYSSTSYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKSHTATGA\n>4jfz_H\nEISEVQLVESGGGLVQPGGSLRLSCVTSGFTFRKFGMSWVRQAPGKGLEWVASIATGGHTTYYSDSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCTRGYSSTSYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKSHTATGA\n>4jfz_L\nDIVLTQSPATLSLSPGERATLSCMTSTDIDDDMNWYQQKPGQAPRLLISEGNTLRPGVPARFSGSGSGTDFTLTISSLEPEDFAVYYCLQSFNVPLTFGQGTKVEIKRTVAAPSVFIFPPSDSQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2p7t_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>2p7t_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>2itc_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>2itc_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1mnu_H\nEVNLQQSGTVLARPGASVRMSCKASGYSFTSYWLHWIKQRPGQGLEWIGGIYPGNRDTRYTQRFKDKAKLTAVTSANTAYMELSSLTNEDSAVYYCSIIYFDYADFIMDYWGQGTTVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPTI\n>1mnu_L\nDIVMTQTPLSLPVSLGDKASISCRSSQALVHSNGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVFFCSQSTHVPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4g7y_H\nEVQLVESGGGLVQPGGSLRLSCAASGFNVSSSSIHWVRQAPGKGLEWVASISSYYGYTSYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARSYSWSYAIDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>4g7y_L\nDIQMTQSPSSLSASVGDRVTITCRASQSVSSAVAWYQQKPGKAPKLLIYSASSLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQYFYWPITFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQAGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNR\n>2wub_Q\nDIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSNRAPATFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2wub_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTINGTYIHWVRQAPGKGLEWVGGIYPAGGATYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCAKWAWPAFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>2wuc_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTINGTYIHWVRQAPGKGLEWVGGIYPAGGATYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCAKWAWPAFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>2wuc_L\nDIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSNRAPATFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1g7m_A\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFVSTPRTFGGGTKLEIK\n>1g7m_B\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSS\n>1g7l_A\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFSSTPRTFGGGTKLEIK\n>1g7l_B\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSS\n>1tqb_C\nDVVMSQTPLTLSVTIGQPASISCKSSQSLLDSDGKTYLNWLLQRPGQSPKRLIYLVSRLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGIYFCWQGSHFPQTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1tqb_B\nQIQLVQSGPELKKPGETVKISCKASGYTFTNYGMNLVKQAPGKGFEWMGWINTFTGEPTYADDFKGRFVFSLDTSASTAYLQINNLKNEDTATYFFTRGTDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEP\n>1tqc_C\nDVVMSQTPLTLSVTIGQPASISCKSSQSLLDSDGKTYLNWLLQRPGQSPKRLIYLVSRLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGIYFCWQGSHFPQTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1tqc_B\nQIQLVQSGPELKKPGETVKISCKASGYTFTNYGMNLVKQAPGKGFEWMGWINTFTGEPTYADDFKGRFVFSLDTSASTAYLQINNLKNEDTATYFFTRGTDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEP\n>1g7i_A\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFFSTPRTFGGGTKLEIK\n>1g7i_B\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSS\n>1g7h_A\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFASTPRTFGGGTKLEIK\n>1g7h_B\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSS\n>1g7j_A\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFHSTPRTFGGGTKLEIK\n>1g7j_B\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSS\n>3c2a_I\nEVQLVESGGGLVKPGGSLRLTCVASGFTFSDVWLNWVRQAPGKGLEWVGRIKSRTDGGTTDYAASVKGRFTISRDDSKNTLYLQMNSLKTEDTAVYSCTTDGFIMIRGVSEDYYYYYMDVWGKGTTVTVSSASTKGPSVFPLAPCSRSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEL\n>3c2a_H\nEVQLVESGGGLVKPGGSLRLTCVASGFTFSDVWLNWVRQAPGKGLEWVGRIKSRTDGGTTDYAASVKGRFTISRDDSKNTLYLQMNSLKTEDTAVYSCTTDGFIMIRGVSEDYYYYYMDVWGKGTTVTVSSASTKGPSVFPLAPCSRSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEL\n>4oii_I\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSYWMHWVKLRPGQGFEWIGDINPNNGGPSYNEKFKRKATLTVDTSSSTAYMQLSSLTSEDSAVYYCTIDDGYRFGYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>4oii_H\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSYWMHWVKLRPGQGFEWIGDINPNNGGPSYNEKFKRKATLTVDTSSSTAYMQLSSLTSEDSAVYYCTIDDGYRFGYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>2vc2_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYVHWVKQRPEQGLEWIGRIDPANGYTKYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCVRPLYDYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>2vc2_L\nDILMTQSPSSMSVSLGDTVSITCHASQGISSNIGWLQQKPGKSFMGLIYYGTNLVDGVPSRFSGSGSGADYSLTISSLDSEDFADYYCVQYAQLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3hzy_A\nDIVMTQSPSSLAVSAGEKVTMSCKSSQSLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSYNLRTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDIAVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3hzy_B\nEVKLVESGGGLVQPGGSLRLSCATSGFTFTDYYMSWVRQPPGKALKWLAFIRNKAKGYTTEYSASVKGRFTISRDNSQSFLYLQMNTLRAEDSATYYCARDINPGSDGYYDALDYWGQGTSVTVSRAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>3hzv_A\nDIVMTQSPSSLAVSAGEKVTMSCKSSQSLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSYNLRTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKSIAVKWKIDGSERQNGVLNSWTDQDKKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3hzv_B\nEVKLVESGGGLVQSGGSLRLSCATSGFTFTDYYMSWVRQPPGKALEWLAFIRNKAKGYTTEYSSSVKGRFTISRDNSQSFLYLQMNTLRAEDSATYYCARDINPGSDGYYDALDYWGQGTSVTVSRAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>3hzm_A\nDIVMTQSPSSLAVSAGEKVTMSCKSSQSLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSYNLRTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKSIAVKWKIDGSERQNGVLNSWTDQDKKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3hzm_B\nEVKLVESGGGLVQSGGSLRLSCATSGFTFTDYYMSWVRQPPGKALEWLAFIRNKAKGYTTEYSSSVKGRFTISRDNSQSFLYLQMNTLRAEDSATYYCARDINPGSDGYYDALDYWGQGTSVTVSRAKTTPPSVYPLAPGSAAQNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>3hzk_A\nDIVMTQSPSSLAVSAGEKVTMSCKSSQSLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSYNLRTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKSIAVKWKIDGSERQNGVLNSWTDQDKKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3hzk_B\nEVKLVESGGGLVQSGGSLRLSCATSGFTFTDYYMSWVRQPPGKALEWLAFIRNKAKGYTTEYSSSVKGRFTISRDNSQSFLYLQMNTLRAEDSATYYCARDINPGSDGYYDALDYWGQGTSVTVSRAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>2uyl_A\nELVMTQTPPSLPVSLGDQASISCRSSQSIVHSNGDTYLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLEISRVEAEDLGVYYCFQGSHVPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2uyl_B\nQVQLEQPGAELVKPGASVKLSCKASGYTFTSNWINWVKQRPGQGLEWIGHISPGSSSTNYNEKFKSKATLTVDTSSSTAYMQLSSLTSDDSAVYYCGREETVRASFGNWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSQTVTCNVAHPASSTKVDKKIVPRDC\n>4dn3_H\nQVELVQSGAEVKKPGSSVKVSCKASGGTFSSYGISWVRQAPGQGLEWMGGIIPIFGTANYAQKFQGRVTITADESTSTAYMELSSLRSEDTAVYYCARYDGIYGELDFWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKT\n>4dn3_L\nEIVLTQSPATLSLSPGERATLSCRASQSVSDAYLAWYQQKPGQAPRLLIYDASSRATGVPARFSGSGSGTDFTLTISSLEPEDFAVYYCHQYIQLHSFTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2qqk_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTISGYGIHWVRQAPGKGLEWVAYIYPDSGYTDYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCAREDFRNRRRLWYVMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>2qqk_L\nDIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQAWAYLPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2qql_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTISGYGIHWVRQAPGKGLEWVAYIYPDSGYTDYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCAREDFRNRRRLWYVMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>2qql_L\nDIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQAWAYLPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2qqn_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMSWVRQAPGKGLEWVSQISPAGGYTNYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARGELPYYRMSKVMDVWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>2qqn_L\nDIQMTQSPSSLSASVGDRVTITCRASQYFSSYLAWYQQKPGKAPKLLIYGASSRASGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQYLGSPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1i7z_A\nDLVLTQSPASLAVSLGQRATISCRASKSVSTSGYNYMHWYQQKPGQPPKLLIYLASNLASGVPARFSGSGSGTDFTLNIHPVEEEDAATYYCLYSREFPPWTFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1i7z_C\nDLVLTQSPASLAVSLGQRATISCRASKSVSTSGYNYMHWYQQKPGQPPKLLIYLASNLASGVPARFSGSGSGTDFTLNIHPVEEEDAATYYCLYSREFPPWTFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1dcl_A\nPSALTQPPSASGSLGQSVTISCTGTSSNVGGYNYVSWYQQHAGKAPKVIIYEVNKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYEGSDNFVFGTGTKVTVLGQPKANPTVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADGSPVKAGVETTKPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>1dcl_B\nPSALTQPPSASGSLGQSVTISCTGTSSNVGGYNYVSWYQQHAGKAPKVIIYEVNKRPSGVPDRFSGSKSGNTASLTVSGLQAEDEADYYCSSYEGSDNFVFGTGTKVTVLGQPKANPTVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADGSPVKAGVETTKPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>3j30_A\nDIVLTQSPASLAVSLGQRATISCRASESVDSYGNSFMNWYQQKPGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYYCQQSNEDPFTFGSGTKLEIKRADAAPTVSIFPPSSKLGTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3j30_C\nDIVLTQSPASLAVSLGQRATISCRASESVDSYGNSFMNWYQQKPGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYYCQQSNEDPFTFGSGTKLEIKRADAAPTVSIFPPSSKLGTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>4hix_H\nVQLLESGGGLVQPGGSLRLSCAASGFTFSNYGMSWVRQAPGKGLEWVASIRSGGGRTYYSDNVKGRFTISRDNAKNSLYLQMNSLRAEDTALYYCVRYDHYSGSSDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPQPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCHHHHHH\n>4hix_L\nEYVVMTQSPLSLPVTPGEPASISCKSSQSLLDSDGKTYLNWLLQKPGQSPQRLIYLVSKLDSGVPDRFSGSGSGTDFTLKISRVEAEDVGVYYCWQGTHFPRTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4eig_B\nQVQLQESGGGLVQAGGSLRLSCKASGIIFSVYKMTWYRQAPGKERELVALITTNNNTMTVDSVKGRFTISRDNVQNTVYLEMNNLKPEDTAVYYCNANRGLAGPAYWGQGTQVTVSSHHHHHH\n>4kmt_H\nEVQLVQSGAEVKKPGESLKISCKGSGYSFTSYWIGWVRQMPGKGLEWMGIIYPGDSDTRYSPSFQGQVTISADKSISTAYLQWSSLKASDTAMYYCARYDGIYGELDFWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCHHHHHH\n>4kmt_L\nDIQMTQSPSSLSASVGDRVTITCRASQSISSYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYSTPLTFGQGTKVEVKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3b5g_A\nNFMLTQSHSVSESPGKTVTISCTRSSGSIASNYVQWYQQRPGSSPTTVIYEDNQRPSGVPDRFSGSIDSSSNSASLTISGLKTEDEADYYCQSYDSSNHVVFGGGTKLTVL\n>3b5g_B\nNFMLTQSHSVSESPGKTVTISCTRSSGSIASNYVQWYQQRPGSSPTTVIYEDNQRPSGVPDRFSGSIDSSSNSASLTISGLKTEDEADYYCQSYDSSNHVVFGGGTKLTVL\n>4kml_B\nAVQLQESGGGLVQPGGSLRLSCAASGRTFSSYNMGWFRQAPGKGREFVASITSSGDKSDYTDSVKGRFTISRDNAKNTMYLQMNNLKPEDTATYYCARGLGIYIIRARGGYDHWGQGTQVTVSSHHHHHH\n>4hij_A\nAGQLTQSPATLSLSPGERATLSCRASQSVTNYLAWYQQKPGQAPRLLIYGASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCQQRDNWPPDATFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLRSPVTKSFNRGECAAA\n>4hij_C\nAGQLTQSPATLSLSPGERATLSCRASQSVTNYLAWYQQKPGQAPRLLIYGASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCQQRDNWPPDATFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLRSPVTKSFNRGECAAA\n>4hii_A\nAGQLTQSPATLSLSPGERATLSCRASQSVTNYLAWYQQKPGQAPRLLIYGASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCQQRDNWPPDATFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLRSPVTKSFNRGECAAA\n>4hii_C\nAGQLTQSPATLSLSPGERATLSCRASQSVTNYLAWYQQKPGQAPRLLIYGASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCQQRDNWPPDATFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLRSPVTKSFNRGECAAA\n>1pkq_A\nMKQSTIALALLPLLFTPVTKADIELTQSPSSLAVSAGEKVTMSCKSSQSLLNSGNQKNYLAWYQQKPGLPPKLLIYGASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCQNDHSYPLTFGAGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1pkq_B\nMKKTAIAIAVALAGFATVAQAEVKLHESGAGLVKPGASVEISCKATGYTFSSFWIEWVKQRPGHGLEWIGEILPGRGRTNYNEKFKGKATFTAETSSNTAYMQLSSLTSEDSAVYYCATGNTMVNMPYWGQGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCSAWSHPQFEK\n>4eiz_C\nQVQLQESGGGLVQAGGSLRLSCTASGRTFSSYAMGWFRQTPGKEREFVAAITWGGSTTLYADSVKGRFTMSRDNAKNTVYLQMNSLKPEDTAVYYCAADGSQYRSTYSFRDKPDYGSWGQGTQVTVSSHHHHHH\n>4eiz_D\nQVQLQESGGGLVQAGGSLRLSCTASGRTFSSYAMGWFRQTPGKEREFVAAITWGGSTTLYADSVKGRFTMSRDNAKNTVYLQMNSLKPEDTAVYYCAADGSQYRSTYSFRDKPDYGSWGQGTQVTVSSHHHHHH\n>4hie_A\nQAGQLTQSPATLSLSPGERATLSCRASQSVTNYLAWYQQKPGQAPRLLIYGASNRATGIPARFSGSGSGTDFTLTISSLEPEDFAVYYCQQRDNWPPDATFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLRSPVTKSFNRGECAAA\n>4hie_B\nLINLVESGGGVVQPGRSLRLSCAASGFTFSRYGMHWVRQAPGKGLEWVAVVSSDGRTTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVFYCAKEGGDNKFSFDYWGQGTLVTVSSASTKGPSVFPLAPCSRSTSESTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSNFGTQTYTCNVDHKPSNTKVDKTVERKCWARHHHHHH\n>1ru9_H\nRVQLQQSGPGLVKPSQSLSLTCTVTGYSITSDFAWNWIRQFPGNKLEWMGYINYSGFTSHNPSLKSRISITRDTSKNQFFLQLNSVTTEDTATYYCAGLLWYDGGAGSWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPT\n>1ru9_L\nDVVMTQSPKTISVTIGQPASISCKSSQRLLNSNGKTFLNWLLQRPGQSPKRLIYLGTKLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGVYYCWQGTHFPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3j3z_H\nAVHLQGTELVKPGASAGVKLSCKASGYTFTNYDMNWVRQRPEQGLEWIGWIFPGDGSTRYNEKFKGKATLTTDKSSSTAYQLNRLTSEDSAVYFCARRGFHGSYSFAYWGQGTLVTVSGAKTTAPSVYPLAPAAGAAGAGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLADLYTLSSSVTVTSSTWPAESITCNVAHPASSTKVDKKIEPRG\n>3j3z_L\nDIVMTQSHKFMSTSVGDRVSITCKASQDVNTALAWYQQIPGQSPKLLIYSASNRYTGVPDRFTASGSGTDFTFTISSVQAEDLALYYCQQHYTTPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWAIDGAERAGGVLNSFTGQDSKDSTYSMSSTLTLTKDEYERHASYTCEATHKTSTAPIVKSFNRGAA\n>4nm4_I\nQVQLVQSGAEVKKPGASVKLSCKASGYTFTAYSMHWVRQAPGQSLEWLGWINTAIGNTQYSQKFQDRVTITRDTSARTSYMELSSLRSGDTAVYFCARGASWDARGWSGYWGKGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSC\n>4nm4_H\nQVQLVQSGAEVKKPGASVKLSCKASGYTFTAYSMHWVRQAPGQSLEWLGWINTAIGNTQYSQKFQDRVTITRDTSARTSYMELSSLRSGDTAVYFCARGASWDARGWSGYWGKGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSC\n>3j3p_H\nQVQLQQSGAELVRPGTSVKVSCKASGYAFTNYLIQWIKQRPGQGLEWIGVINPGSGGTDYNANFKGKATLTADKSSSIVYMQLSSLTSDDSAVYFCARDFYDYDVGFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>3j3p_L\nDVVMTQTPLSLPVSLGDQASISCSSSQSLVHSNGKTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTYFTLKISRVEAEDLGVYFCSQSTHVPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSEVQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1a5f_H\nEVALQQSGAELVKPGASVKLSCAASGFTIKDAYMHWVKQKPEQGLEWIGRIDSGSSNTNYDPTFKGKATITADDSSNTAYLQMSSLTSEDTAVYYCARVGLSYWYAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVSVPTSTETVTCNVAHAPSSTKVDKKIVPR\n>1a5f_L\nDIVMTQSPSSLTVTTGEKVTMTCKSSQSLLNSGAQKNYLTWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLSISGVQAEDLAVYYCQNNYNYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4nm8_I\nQVQLVQSGAEVKKPGASVKLSCKASGYTFTAYSMHWVRQAPGQSLEWLGWINTAIGNTQYSQKFQDRVTITRDTSARTSYMELSSLRSGDTAVYFCARGASWDARGWSGYWGKGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCHHHHHH\n>4nm8_H\nQVQLVQSGAEVKKPGASVKLSCKASGYTFTAYSMHWVRQAPGQSLEWLGWINTAIGNTQYSQKFQDRVTITRDTSARTSYMELSSLRSGDTAVYFCARGASWDARGWSGYWGKGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCHHHHHH\n>3j3o_H\nQVQLQQSGAELVRPGTSVKVSCKASGYAFTNYLIQWIKQRPGQGLEWIGVINPGSGGTDYNANFKGKATLTADKSSSIVYMQLSSLTSDDSAVYFCARDFYDYDVGFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>3j3o_L\nDVVMTQTPLSLPVSLGDQASISCSSSQSLVHSNGKTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTYFTLKISRVEAEDLGVYFCSQSTHVPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSEVQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2bx5_A\nDIQMTQSPSSLSASVGDRVTITCRASQSISSYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYSTPNTFGQGTKVEIK\n>2bx5_C\nDIQMTQSPSSLSASVGDRVTITCRASQSISSYLNWYQQKPGKAPKLLIYAASSLQSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYSTPNTFGQGTKVEIK\n>4ksd_B\nQVQLQESGGGLVQAGGSLRLSCAASGRTFNSAVMGWFRQAPGKERQFVATIDWSGEYTYYADSVKGRFTISRDNAKNTVYLQMTSLKPEDTALYYCAARLTLGQFDYWGQGTQVTVSSHHHHHH\n>1h0d_A\nDIVLTQSPASLAVSLGQRATISCRASESVDNYGISFMSWFQQKPGQPPKLLIYAASNQGSGVPARFSGSGSGTDFSLNIHPMEEDDTAMYFCQQSKEVPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVRWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHAASPIVKSFNRNEC\n>1h0d_B\nEVMLVESGGGLVKPGGSLKLSCAASGFTFSSYTMSWVRQTPEKRLEWVATISSGGGNTYYPDSVKGRFTISRDIAKNTLYLQMSSLRSEDTALYYCTRLGDYGYAYTMDYWGQGTSVTVSSAKTTPPSVYPLAPGGGGGGGAMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPWPSETVTCNVAHPASSTKVDKKIVPRDC\n>1rua_H\nRVQLQQSGPGLVKPSQSLSLTCTVTGYSITSDFAWNWIRQFPGNKLEWMGYINYSGFTSHNPSLKSRISITRDTSKNQFFLQLNSVTTEDTATYYCAGLLWYDGGAGSWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPT\n>1rua_L\nDVVMTQSPKTISVTIGQPASISCKSSQRLLNSNGKTFLNWLLQRPGQSPKRLIYLGTKLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGVYYCWQGTHFPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1rul_H\nRVQLQQSGPGLVKPSQSLSLTCTVTGYSITSDFAWNWIRQFPGNKLEWMGYINYSGFTSHNPSLKSRISITRDTSKNQFFLQLNSVTTEDTATYYCAGLLWYDGGAGSWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPT\n>1rul_L\nDVVMTQSPKTISVTIGQPASISCKSSQRLLNSNGKTFLNWLLQRPGQSPKRLIYLGTKLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGVYYCWQGTHFPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1rum_H\nRVQLQQSGPGLVKPSQSLSLTCTVTGYSITSDFAWNWIRQFPGNKLEWMGYINYSGFTSHNPSLKSRISITRDTSKNQFFLQLNSVTTEDTATYYCAGLLWYDGGAGSWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPT\n>1rum_L\nDVVMTQSPKTISVTIGQPASISCKSSQRLLNSNGKTFLNWLLQRPGQSPKRLIYLGTKLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGVYYCWQGTHFPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1ruk_H\nRVQLQQSGPGLVKPSQSLSLTCTVTGYSITSDFAWNWIRQFPGNKLEWMGYINYSGFTSHNPSLKSRISITRDTSKNQFFLQLNSVTTEDTATYYCAGLLWYDGGAGSWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPT\n>1ruk_L\nDVVMTQSPKTISVTIGQPASISCKSSQRLLNSNGKTFLNWLLQRPGQSPKRLIYLGTKLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGVYYCWQGTHFPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3gm0_A\nDYKDDDDKEVQLQESGPSLVKPSQTLSLTCSVTGDSVTSGYWSWIRQFPGNKLDYMGYISYRGSTYYNPSLKSRISITRDTSKNQVYLQLKSVSSEDTATYYCSYFDSDDYAMEYWGQGTSVTVSGGGGSGGGGSGGGGSQIVLTQSPAIMSASPGEKVTLTCSASSSVSSSHLYWYQQKPGSSPKLWIYSTSNLASGVPARFSGSGSGTSYSLTISSMEAEDAASYFCHQWSSFPFTFGSGTKLEIKRAPHHHHHH\n>3gm0_A\nDYKDDDDKEVQLQESGPSLVKPSQTLSLTCSVTGDSVTSGYWSWIRQFPGNKLDYMGYISYRGSTYYNPSLKSRISITRDTSKNQVYLQLKSVSSEDTATYYCSYFDSDDYAMEYWGQGTSVTVSGGGGSGGGGSGGGGSQIVLTQSPAIMSASPGEKVTLTCSASSSVSSSHLYWYQQKPGSSPKLWIYSTSNLASGVPARFSGSGSGTSYSLTISSMEAEDAASYFCHQWSSFPFTFGSGTKLEIKRAPHHHHHH\n>1rur_H\nEVQLEESGPELVRPGTSVKISCKASGYTFTNYWLGWVKQRPGHGFEWIGDIYPGGVYTTNNEKFRGKAILTADTSSSTAYMQLSSLTSEDSAVYFCARAGGYYTGGDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVP\n>1rur_L\nDIVLTQAAFSNPVTLGASASISCRSSKSLLNSNGIIHMYWYLQKPGQSPQLLIYQMSKLASGAPDRFSGSGSGTDFTLRISRVEAEDVGVYYCAQNLELPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDTKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1rup_H\nRVQLQQSGPGLVKPSQSLSLTCTVTGYSITSDFAWNWIRQFPGNKLEWMGYINYSGFTSHNPSLKSRISITRDTSKNQFFLQLNSVTTEDTATYYCAGLLWYDGGAGSWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPT\n>1rup_L\nDVVMTQSPKTISVTIGQPASISCKSSQRLLNSNGKTFLNWLLQRPGQSPKRLIYLGTKLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGVYYCWQGTHFPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1ruq_H\nEVQLEESGPELVRPGTSVKISCKASGYTFTNYWLGWVKQRPGHGFEWIGDIYPGGVYTTNNEKFRGKAILTADTSSSTAYMQLSSLTSEDSAVYFCARAGGYYTGGDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVP\n>1ruq_L\nDIVLTQAAFSNPVTLGASASISCRSSKSLLNSNGIIHMYWYLQKPGQSPQLLIYQMSKLASGAPDRFSGSGSGTDFTLRISRVEAEDVGVYYCAQNLELPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDTKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1lve_A\nDIVMTQSPDSLAVSLGERATINCKSSQSVLYSSNSKNYLAWYQQKPGQPPKLLIYWASTRESGVPDRFSGSGSGTDFTLTISSLQAEDVAVYYCQQYYSTPYSFGQGTKLEIKRTVAAPSVF\n>3pp3_I\nQVQLVQSGAEVKKPGSSVKVSCKASGYAFSYSWINWVRQAPGQGLEWMGRIFPGDGDTDYNGKFKGRVTITADKSTSTAYMELSSLRSEDTAVYYCARNVFDGYWLVYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>3pp3_H\nQVQLVQSGAEVKKPGSSVKVSCKASGYAFSYSWINWVRQAPGQGLEWMGRIFPGDGDTDYNGKFKGRVTITADKSTSTAYMELSSLRSEDTAVYYCARNVFDGYWLVYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>1nfd_H\nEVYLVESGGDLVQPGSSLKVSCAASGFTFSDFWMYWVRQAPGKGLEWVGRIKNIPNNYATEYADSVRGRFTISRDDSRNSIYLQMNRLRVDDTAIYYCTRAGRFDHFDYWGQGTMVTVSSATTTAPSVYPLAPACDSTTSTTDTVTLGCLVKGYFPEPVTVSWNSGALTSGVHTFPSVLHSGLYSLSSSVTVPSSTWPKQPITCNVAHPASSTKVDKKIEPR\n>1nfd_E\nYELIQPSSASVTVGETVKITCSGDQLPKNFAYWFQQKSDKNILLLIYMDNKRPSGIPERFSGSTSGTTATLTISGAQPEDEAAYYCLSSYGDNNDLVFGSGTQLTVLRGPKSSPKVTVFPPSPEELRTNKATLVCLVNDFYPGSATVTWKANGATINDGVKTTKPSKQGQNYMTSSYLSLTADQWKSHNRVSCQVTHEGETVEKSLSPAECL\n>4jqi_H\nEISEVQLVESGGGLVQPGGSLRLSCAASGFNVYSSSIHWVRQAPGKGLEWVASISSYYGYTYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARSRQFWYSGLDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHHHHHHHH\n>4jqi_L\nSDIQMTQSPSSLSASVGDRVTITCRASQSVSSAVAWYQQKPGKAPKLLIYSASSLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQYKYVPVTFGQGTKVEIKRTVAAPSVFIFPPSDSQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1qkz_H\nDVKLVESGGGLVKPGRSLKLSCAASGFTFSDYYMFWVRQTPEQRLEWVATISDGGAYTYYPDSVKGRFTISRDNAKNNLYLQMNSLKSEDTGMYYCARDPLEYYGMDYWGQGTSVAVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVNVTSSTWPSQSITCNVAHPASSTKVDKKIVPR\n>1qkz_L\nNIVMTQTPLSLPVSLGDQASISCRSSQSLVHSNGNTYLHWYLQKPGQSPKLLIYTVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQSTHFPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGKERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>4lcu_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>4lcu_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>4lci_H\nQIQLVQSGPELKKPGETVKISCKASGYTFTNYGMTWVKQAPRKGLKWMGWINTYTGRPTYADDFKGRFAFSLETSASTAYLQINNLKHEDTATYFCASLGEDFWGQGTTLTVSSHHHHHH\n>4lci_L\nMDIVMTQAAPSVPVTPGESVSISCRSTKSLLHSNGNTYLYWFLQRPGQSPQRLIYYMSNLASGVPDRFSGRGSGTDFTLRISRVEAEDAGVYYCMQSLEYPYTFGGGTKLEIKRLVP\n>3zl4_H\nQVQLQESGPGLVKPSETLSLTCAVSGYSISSGYYWGWIRQPPGKGLEWIGSIYHSGSTYYNPSLKSRVTISVDTSKNQFSLKLSSVTAADTAVYYCAGLTQSSHNDANWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCLAMDYKDHDGDYKDHDIDYKDDDDKVDHHHHHH\n>3zl4_L\nQSVLTQPPSVSAAPGQKVTISCSGSSSNIGNNYVSWYQQLPGTAPKLLIYDNNKRPSGIPDRFSGSKSGTSATLGITGLQTGDEADYYCGTWDSSLNPVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECSGIDAAAAASFLEQKLISEEDLNSAVDHHHHHH\n>3n9g_H\nEVQLVQSGAEVRKPGASTKVSCKASGYTFTHYYMHWVRQAPGQGLEWMGIINPSGGSTTYAQKLQGRVTMTRDTSTSTVYMELSSLRSEDTAVYYCARDWGSNYVWGSYPKYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKTH\n>3n9g_L\nQSVLTQPSSVSGTPGQRVTISCSGSSSNIGSNTVNWYQQLPGTAPKLLIYGNNQRPSGVPDRFSGSKSGTSASLAISGLQSEDEADYYCAAWDDSLNGPVFGGGTKLTVLGAAAGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>1fh5_H\nSGGGLVKPAGSLKLSCAASGFTFSSYYMYWVRQTPDKRLEWVATISDGGSYTYYPDSVKGRFTISRDNAKNNLYLQMSSLKSEDTAMYYCARDAMDYWGQGTLVTVSAAKTTPPSVYPLAVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>1fh5_L\nDIVLTQSPATLSVTPGESVSLSCRASQSISNNLHWYQQKSHESPRLLIKYASQSISGIPSRFSGSGSGTDFTLSINSVETEDFGMYYCQQSNSWPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>2fr4_A\nELQMTQSPASLSASVGETVTITCRASENIYSYLAWYQQKQGKSPQLLVYNAKTLAEGVPSRFSGSGSGTQFSLKINSLQPEDFGSYYCQHHYGTPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2fr4_H\nQVKLLESGPELVKPGASVKMSCKASGYTFTSYVMHWVKQKPGQGLEWIGYINPYNDGTKYNEKFKGKATLTSDKSSSTAYMELSSLTSEDSAVYYCVRGGYRPYYAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDCTSHHHHHH\n>1kb9_K\nDIELTQTPVSLAASLGDRVTISCRASQDINNFLNWYQQKPDGTIKLLIYYTSRLHAGVPSRFSGSGSGTDYSLTISNLEPEDIATYFCQHHIKFPWTFGAGTKLEIK\n>1kb9_J\nEVKLQESGAGLVQPSQSLSLTCSVTGYSITSGYYWNWIRLFPGNKLEWVGYISNVGDNNYNPSLKDRLSITRDTSKNQFFLKLNSVTTEDTATYYCARSEYYSVTGYAMDYWGQGTTVTVSSAWRHP\n>1kb5_H\nEVQLQQSGPELEKPGASVKISCKASGYSFTGYNMNWVKQSNGKSLEWIGNIDPYYGGISYNQKFKGRATLTVDKSSSTAYMQLKSLTSEDSAVYYCARSRTDLYYFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>1kb5_L\nDIQMTQSPASLSASVGETVTITCRASKNIYSYLAWYQQKQGKSPQLLVYNAKTLGEGVPSRFSGSGSGTQFSLKINSLQPEDFGSYYCQHHYGTPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3zlq_C\nQVQLQESGGGLVQPGGSLRLSCAASGFTFSSAIMTWVRQAPGKGREWVSTIGSDGSITTYADSVKGRFTISRDNARNTLYLQMNSLKPEDTAVYYCTSAGRRGPGTQVTVSSHHHHHHEPEA\n>3zlq_D\nQVQLQESGGGLVQPGGSLRLSCAASGFTFSSAIMTWVRQAPGKGREWVSTIGSDGSITTYADSVKGRFTISRDNARNTLYLQMNSLKPEDTAVYYCTSAGRRGPGTQVTVSSHHHHHHEPEA\n>3s37_H\nEVQLVQSGGGLVKPGGSLRLSCAASGFTFSSYSMNWVRQAPGKGLEWVSSISSSSSYIYYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARVTDAFDIWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCAA\n>3s37_L\nDIQMTQSPSSVSASIGDRVTITCRASQGIDNWLGWYQQKPGKAPKLLIYDASNLDTGVPSRFSGSGSGTYFTLTISSLQAEDFAVYFCQQAKAFPPTFGGGTKVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3s36_H\nEVQLVQSGGGLVKPGGSLRLSCAASGFTFSSYSMNWVRQAPGKGLEWVSSISSSSSYIYYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARVTDAFDIWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCAA\n>3s36_L\nDIQMTQSPSSVSASIGDRVTITCRASQGIDNWLGWYQQKPGKAPKLLIYDASNLDTGVPSRFSGSGSGTYFTLTISSLQAEDFAVYFCQQAKAFPPTFGGGTKVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3s35_H\nKVQLQQSGTELVKPGASVKVSCKASGYIFTEYIIHWVKQRSGQGLEWIGWLYPESNIIKYNEKFKDKATLTADKSSSTVYMELSRLTSEDSAVYFCTRHDGTNFDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>3s35_L\nDIVLTQSPASLAVSLGQRATISCRASESVDSYGNSFMHWYQQKPGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYYCQQSNEDPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3s34_H\nEVQLVQSGGGLVKPGGSLRLSCAASGFTFSSYSMNWVRQAPGKGLEWVSSISSSSSYIYYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARVTDAFDIWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCAA\n>3s34_L\nDIQMTQSPSSVSASIGDRVTITCRASQGIDNWLGWYQQKPGKAPKLLIYDASNLDTGVPSRFSGSGSGTYFTLTISSLQAEDFAVYFCQQAKAFPPTFGGGTKVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1cr9_H\nKVKLQQSGAELVRSGASVKLSCTASGFNIKDYYIQWVKQRPEQGLEWIGWIDPENGNSEYAPRFQGKATMTADTLSNTAYLQLSSLTSEDTAVYYCNADLHDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRVTS\n>1cr9_L\nDVVMTQTPLSLSVTIGQPASISCKSSQSLLDSDGKTYLIWVFQRPGQSPKRLIFLVSKRDSGVPDRFTGSGSGTDFTLKISRVEAEDVGVYYCWQGTHFPHTVGGGTKLEIARADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4lu5_I\nEVKLVESGGGLVQPGGSLKLSCATSGFTFSDYYIYWVRQTPEKRLEWVAYISNGGYKTYYPDTVKGRFTISRDNAKNILYLQMSRLKSEDTGIYYCARGMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>4lu5_H\nEVKLVESGGGLVQPGGSLKLSCATSGFTFSDYYIYWVRQTPEKRLEWVAYISNGGYKTYYPDTVKGRFTISRDNAKNILYLQMSRLKSEDTGIYYCARGMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>3bkj_H\nVTLKESGPGLLKPSQTLSLTCSFSGFSIRTSKVGVSWIRQPSGKGLEWLAHIYWDDDKRYNPSLESRLTISKDTSRDMVFMKITSVDTADTATYYCARRGFYGRKYEVNHFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSESITCNVAHPASSTKVDKKIVPR\n>3bkj_L\nDQSPQAVSSGCLLKMKLPVRLLVLMFWIPGSSSDVLMTQTPLSLPVNLGEQASISCRSSQSIVHSNGHTYLEWYLQRPGQSPKLLIYQVSTRFSGVPDRFSGSGSGTDFTLRISRVEAEDLGVYYCFQASLVPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1jv5_A\nDIQMTQTTSSLSASLGDRVTISCRASQDINNYLNWYQQKPDGTVKLLIHYTSRLHSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQGNTLPWTFGGGTKLEIK\n>1jv5_B\nQVQLQQPGAELVKPGTSVKLSCKASGYNFTSYWINWVKLRPGQGLEWIGDIYPGSGITNYNEKFKSKATLTVDTSSSTAYMQLSSLASEDSALYYCAGQYGNLWFAYWGQGTLVTVS\n>3bkm_H\nVTLKESGPGLLKPSQTLSLTCSFSGFSIRTSKVGVSWIRQPSGKGLEWLAHIYWDDDKRYNPSLESRLTISKDTSRDMVFMKITSVDTADTATYYCARRGFYGRKYEVNHFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSESITCNVAHPASSTKVDKKIVPR\n>3bkm_L\nDQSPQAVSSGCLLKMKLPVRLLVLMFWIPGSSSDVLMTQTPLSLPVNLGEQASISCRSSQSIVHSNGHTYLEWYLQRPGQSPKLLIYQVSTRFSGVPDRFSGSGSGTDFTLRISRVEAEDLGVYYCFQASLVPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3bkc_H\nEVTLKESGPGLLKPSQTLSLTCSFSGFSIRTSKVGVSWIRQPSGKGLEWLAHIYWDDDKRYNPSLESRLTISKDTSRDMVFMKITSVDTADTATYYCARRGFYGRKYEVNHFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSESITCNVAHPASSTKVDKKIVPRDCG\n>3bkc_L\nDQSPQAVSSGCLLKMKLPVRLLVLMFWIPGSSSDVLMTQTPLSLPVNLGEQASISCRSSQSIVHSNGHTYLEWYLQRPGQSPKLLIYQVSTRFSGVPDRFSGSGSGTDFTLRISRVEAEDLGVYYCFQASLVPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1bfv_H\nQVQLQESGGGLVNLGGSMTLSCVASGFTFNTYYMSWVRQTPEKTLELVAAINSDGEPIYYPDTLKGRVTISRDNAKKTLYLQMSSLNFEDTALYYCARLNYAVYGMDYWGQGTTVTVSS\n>1bfv_L\nDIELTQSPPSLPVSLGDQVSISCRSSQSLVSNNRRNYLHWYLQKPGQSPKLVIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVAAEDLGLYFCSQSSHVPLTFGSGTKLEIKR\n>3bky_H\nQAYLQQSGAELVRPGASVKMSCKASGYTFTSYNMHWVKQTPRQGLEWIGAIYPGNGDTSYNQKFKGKATLTVDKSSSTAYMQLSSLTSEDSAVYFCARVVYYSNSYWYFDVWGTGTTVTVSAASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCD\n>3bky_L\nQIVLSQSPAILSASPGEKVTMTCRASSSVSYMHWYQQKPGSSPKPWIYAPSNLASGVPARFSGSGSGTSYSLTISRVEAEDAATYYCQQWSFNPPTFGAGTKLELKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1bfo_A\nDIKMTQSPSFLSASVGDRVTLNCKASQNIDKYLNWYQQKLGESPKLLIYNTNNLQTGIPSRFSGSGSGTDFTLTISSLQPEDVATYFCLQHISRPRTFGTGTKLELKRANAAPTVSIFPPSTEQLATGGASVVCLMNKFYPRDISVKWKIDGTERNGVLNSVTDQDSADSTYSMSSTLSLTKADYQSHNLYTCQVVHKTSSSPVVAKNFNRNEC\n>1bfo_C\nDIKMTQSPSFLSASVGDRVTLNCKASQNIDKYLNWYQQKLGESPKLLIYNTNNLQTGIPSRFSGSGSGTDFTLTISSLQPEDVATYFCLQHISRPRTFGTGTKLELKRANAAPTVSIFPPSTEQLATGGASVVCLMNKFYPRDISVKWKIDGTERNGVLNSVTDQDSADSTYSMSSTLSLTKADYQSHNLYTCQVVHKTSSSPVVAKNFNRNEC\n>4pub_H\nEVQLLESGGGLVQPGGSLRLSCAASGFTFSHYIMMWVRQAPGKGLEWVSGIYSSGGITVYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAYRRIGVPRRDEFDIWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSC\n>4pub_L\nDIQMTQSPSTLSASVGDRVTITCRASQSISSWLAWYQQKPGKAPKLLIYKASTLESGVPSRFSGSGSGTEFTLTISSLQPDDFATYYCQQYNTYWTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1seq_H\nEVKLVESGGGLVQPGGSLKLSCAASGFTFSTYTMSWARQTPEKKLEWVAYISKGGGSTYYPDTVKGRFTISRDNAKNTLYLQMSSLKSEDTALYYCARGAMFGNDFKYPMDRWGQGTSVTVSSAATTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLKSDLYTLSSSVTVPSSVWPSETVTCNVAHPASSTTVDKKIVPRDC\n>1seq_L\nDIVLTQSPAIMSASLGSSVTLTCSASSSVSYMHWYQQKSGTSPVLLIYTTSNLASGVPSRFSGSGSGTFYSLTISSVEASDAADYYCHQWSSYPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKSINSKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKNEYERHNSYTCEATHKTSTSPIVKSFNRSEC\n>3iu4_H\nEVQLKESGPGLVAPSQSLSITCTVSGFSLSRYSVHWVRQPPGKGLEWLGMIWGGGSTDYNSALKSRLSISKDNSKSQVFLKMNSLQTDDTAMYYCARSGVREGRAQAWFAYWGQGTLVTVSAASTKGPSVFPLAPSSKGSTSGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPAQGGRVSAGSQAQRSCLDASRLCSPSPGQQGRPRLPLHPEA\n>3iu4_L\nDIVMTQSHKFMSTSVGDRVSITCKASQDVSTAVAWYQQKPGQSPKLLIYSASYRYTGVPDRFTGSGSGTDFTFTISSVQAEDLAVYYCQQHYSTPWTFGGGTKLELKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGE\n>3lex_A\nDVQLQESGPGLVKPSQSLSLTCTVTGYSITSDYAWSWIRQFPGNKLEWMGYINYSGYTSYNPSLKSRISITRDTSENQFFLQLHSVTPEDTATYFCAYGNYLPAYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPTIK\n>3lex_H\nDVQLQESGPGLVKPSQSLSLTCTVTGYSITSDYAWSWIRQFPGNKLEWMGYINYSGYTSYNPSLKSRISITRDTSENQFFLQLHSVTPEDTATYFCAYGNYLPAYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPTIK\n>3ley_H\nDVQLQESGPGLVKPSQSLSLTCTVTGYLITTDYAWNWIRQFPGNKLEWMGYISYSGFTSYNPSLKSQISITRDTSKNQFFLQLNSVTTEDTATYYCAFGNYLPAYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPTIK\n>3ley_L\nDVVMTQTPLSLSVTLGQPASISCKSSQSLLDSDGKTYLNWLLQRPGQSPKRLIYLVSKLASGVPDRFTGSGSGTDFTLKINRVEAEDLGIYYCWQGTHFPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3iu3_A\nQLQQSGTVLARPGASVKMSCKASGYSFTRYWMHWIKQRPGQGLEWIGAIYPGNSDTSYNQKFEGKAKLTAVTSASTAYMELSSLTHEDSAVYYCSRDYGYYFDFWGQGTTLTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEP\n>3iu3_C\nQLQQSGTVLARPGASVKMSCKASGYSFTRYWMHWIKQRPGQGLEWIGAIYPGNSDTSYNQKFEGKAKLTAVTSASTAYMELSSLTHEDSAVYYCSRDYGYYFDFWGQGTTLTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEP\n>1fve_A\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLESGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1fve_C\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLESGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1fvd_A\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLESGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1fvd_C\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLESGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3lev_H\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>3lev_L\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2x7l_A\nQEQLVESGGRLVTPGTALTLTCKVSGFSLSGFWLNWVRQAPGKGLEWVGAIYRGSGSEWYASWAKGRFTISDTSTTVTLKLTSPTTEDTATYFCAADTTDNGYFTIWGPGTLVTVSSASTKGPSVFPLAPSAKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKAEPKSCDKTRGHHHHHH\n>2x7l_C\nQEQLVESGGRLVTPGTALTLTCKVSGFSLSGFWLNWVRQAPGKGLEWVGAIYRGSGSEWYASWAKGRFTISDTSTTVTLKLTSPTTEDTATYFCAADTTDNGYFTIWGPGTLVTVSSASTKGPSVFPLAPSAKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKAEPKSCDKTRGHHHHHH\n>1y18_A\nELVVTQESALTTSPGETVTLTCRSSSGAVTTSNYATWVQEKPDHLFTGLIGGTNKRAPGVPARFSGSLIGDRAALTITGAQTEDEAIYFCALWNSNHLVFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1y18_C\nELVVTQESALTTSPGETVTLTCRSSSGAVTTSNYATWVQEKPDHLFTGLIGGTNKRAPGVPARFSGSLIGDRAALTITGAQTEDEAIYFCALWNSNHLVFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3ztn_H\nQVQLVESGGGVVQPGRSLRLSCAASGFTFSTYAMHWVRQAPGKGLEWVAVISYDANYKYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKDSQLRSLLYFEWLSQGYFDYWGQGTLVTVSSASTKGPSVFPLAPSSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>3ztn_L\nDIVMTQSPDSLAVSLGERATINCKSSQSVTFNYKNYLAWYQQKPGQPPKLLIYWASTRESGVPDRFSGSGSGTDFTLTISSLQAEDVAVYYCQQHYRTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2pr4_H\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEPKSC\n>2pr4_L\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYECEVTHQGLSSPVTKSFNRGEC\n>1jvk_A\nETALTQPASVSGSPGQSITVSCTGVSSIVGSYNLVSWYQQHPGKAPKLLTYEVNKRPSGVSDRFSGSKSGNSASLTISGLQAEDEADYYCSSYDGSSTSVVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTKPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTAC\n>1jvk_B\nETALTQPASVSGSPGQSITVSCTGVSSIVGSYNLVSWYQQHPGKAPKLLTYEVNKRPSGVSDRFSGSKSGNSASLTISGLQAEDEADYYCSSYDGSSTSVVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTKPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTAC\n>4jg1_H\nEISEVQLVESGGGLVQPGGSLRLSCVTSGFTFRKFGMSWVRQAPGKGLEWVASISTPRGSTTYYSDSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCTRGYSSTSYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCSHTATGA\n>4jg1_L\nDIVLTQSPATLSLSPGERATLSCMTSTDIDDDMNWYQQKPGQAPRLLISEGNTLRPGVPARFSGSGSGTDFTLTISSLEPEDFAVYYCLQSFNVPLTFGQGTKVEIKRTVAAPSVFIFPPSDSQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4jg0_H\nEISEVQLVESGGGLVQPGGSLRLSCVTSGFTFRKFGMSWVRQAPGKGLEWVASISTPRGSTTYYSDSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCTRGYSSTSYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKSHTATGA\n>4jg0_L\nDIVLTQSPATLSLSPGERATLSCMTSTDIDDDMNWYQQKPGQAPRLLISEGNTLRPGVPARFSGSGSGTDFTLTISSLEPEDFAVYYCLQSFNVPLTFGQGTKVEIKRTVAAPSVFIFPPSDSQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4f2m_A\nQVQLQQSGPELVKPGASVKISCKASGYAFSSSWMNWVKQRPGQGLEWIGRIYPGDGETNYSEKFKGKATLTADKSSSTAYMHLSSLTSVDSAVYFCARGGYRYDPYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEP\n>4f2m_C\nQVQLQQSGPELVKPGASVKISCKASGYAFSSSWMNWVKQRPGQGLEWIGRIYPGDGETNYSEKFKGKATLTADKSSSTAYMHLSSLTSVDSAVYFCARGGYRYDPYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEP\n>4h20_H\nEVQLQQSGPVLVKPGASVKMSCKASGYTFTDYYVNWVKQSRGKSLEWLGLIIPSNGGTTYNQKFRGKATLTVDKSSSTAYMELNSLTSEDSAVYYCARRGLTGALFAYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPALLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIVPRV\n>4h20_L\nDIVMTQSHKFMSTSVGDRVSITCKASQDVTSAVAWFQQKPGQSPKLLIYSASYRYTGVPDRFTGSGSGTDFTFTISSVQAEDLAVYYCQQHYGTPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4m1c_C\nMKKNIAFLLASMFVFSIATNAYAEISEVQLVESGGGLVQPGGSLRLSCAASGFNVSSYSIHWVRQAPGKGLEWVASISSYYGSTSYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARDRVMYYWSFSKYGYPYGMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHT\n>4m1c_E\nMKKNIAFLLASMFVFSIATNAYAEISEVQLVESGGGLVQPGGSLRLSCAASGFNVSSYSIHWVRQAPGKGLEWVASISSYYGSTSYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARDRVMYYWSFSKYGYPYGMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHT\n>4m1g_H\nQVQLKESGPGLVAPSQSLSITCTVSGFSLTDYGVSWIRQPPGKGLEWLGVTWGGGTTYYNSALKSRLSISKDNSKSQVFLKMNSLQTDDTAMYYCAKHKASYNGLDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>4m1g_L\nELVLTQSPTTMAASPGEKITITCSASSSISSNYLHWYQQKPGFSPKLLIYRTSNLASGVPARFSGSGSGTSYSLTIGTMEAEDVATYYCQQGSSIPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4m1d_I\nEVQLVESGGGLVKPGGSLRLTCVASGFTFSDVWLNWVRQAPGKGLEWVGRIKSRTDGGTTDYAASVKGRFTISRDDSKNTLYLQMNSLKTEDTAVYSCTTDGFIMIRGVSEDYYYYYMDVWGKGTTVTVSSASTKGPSVFPLAPCSRSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEL\n>4m1d_H\nEVQLVESGGGLVKPGGSLRLTCVASGFTFSDVWLNWVRQAPGKGLEWVGRIKSRTDGGTTDYAASVKGRFTISRDDSKNTLYLQMNSLKTEDTAVYSCTTDGFIMIRGVSEDYYYYYMDVWGKGTTVTVSSASTKGPSVFPLAPCSRSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEL\n>1zv5_A\nDVQLVESGGGSVQAGESLRLSCAASGVTYKNYCIGWFRQAPGKDREGVVFINSDGGITYYADSVKGRFTISQDNAKNTVYLQMNSLKPEDTASYYCAAGYRNYGQCATRYWGQGTQVTVSSRGRHHHHHH\n>2vdk_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYVHWVKQRPEQGLEWIGRIDPANGYTKYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCVRPLYDYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>2vdk_L\nDILMTQSPSSMSVSLGDTVSITCHASQGISSNIGWLQQKPGKSFMGLIYYGTNLVDGVPSRFSGSGSGADYSLTISSLDSEDFADYYCVQYAQLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2vdl_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYVHWVKQRPEQGLEWIGRIDPANGYTKYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCVRPLYDYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>2vdl_L\nDILMTQSPSSMSVSLGDTVSITCHASQGISSNIGWLQQKPGKSFMGLIYYGTNLVDGVPSRFSGSGSGADYSLTISSLDSEDFADYYCVQYAQLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2vdm_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYVHWVKQRPEQGLEWIGRIDPANGYTKYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCVRPLYDYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>2vdm_L\nDILMTQSPSSMSVSLGDTVSITCHASQGISSNIGWLQQKPGKSFMGLIYYGTNLVDGVPSRFSGSGSGADYSLTISSLDSEDFADYYCVQYAQLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2vdn_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYVHWVKQRPEQGLEWIGRIDPANGYTKYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCVRPLYDYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>2vdn_L\nDILMTQSPSSMSVSLGDTVSITCHASQGISSNIGWLQQKPGKSFMGLIYYGTNLVDGVPSRFSGSGSGADYSLTISSLDSEDFADYYCVQYAQLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2vdo_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYVHWVKQRPEQGLEWIGRIDPANGYTKYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCVRPLYDYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>2vdo_L\nDILMTQSPSSMSVSLGDTVSITCHASQGISSNIGWLQQKPGKSFMGLIYYGTNLVDGVPSRFSGSGSGADYSLTISSLDSEDFADYYCVQYAQLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4etq_A\nQVQLQQSGPELVKPGASVKISCKASGYSFNFYWMHWVKQRPGQGLEWIGMIDPSESESRLNQKFKDKATLTVDRSSSTAHMQLSSPTSEDSAVYYCTRSNYRYDYFDVWGAGTTVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGG\n>4etq_H\nQVQLQQSGPELVKPGASVKISCKASGYSFNFYWMHWVKQRPGQGLEWIGMIDPSESESRLNQKFKDKATLTVDRSSSTAHMQLSSPTSEDSAVYYCTRSNYRYDYFDVWGAGTTVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGG\n>1dba_H\nQIQLVQSGPELKKPGETVKISCKASGYAFTNYGVNWVKEAPGKELKWMGWINIYTGEPTYVDDFKGRFAFSLETSASTAYLEINNLKNEDTATYFCTRGDYVNWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPR\n>1dba_L\nDVVMTQIPLSLPVNLGDQASISCRSSQSLIHSNGNTYLHWYLQKPGQSPKLLMYKVSNRFYGVPDRFSGSGSGTDFTLKISRVEAEDLGIYFCSQSSHVPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>3okm_A\nDIVMTQSPSSLAVSAGEKVTMNCKSSQSLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFALTISSVQAEDLAVYYCKQSYNLRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERANGVLNSWTDQDSKDSTYSMTSTLTLTKDEYERHNSYTCEASHKTSTSPIVKSFNRNEC\n>3okm_B\nEVKLVESGGGLVQPGGSLRLACATSGFTFTDYYMSWVRQPPGKALEWLGFIRNKAKGYTTEYSASVKGRFTISRDNSQSSLYLQMNTLRAEDSATYYCARDHDGYYERFAYWGQGTLVTVSAAATTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSTGVHTFPAVLSSDLYTLTSSVTVPSKTWPSETVTCNVAHPASSTKVDKKIVPR\n>1dbb_H\nQIQLVQSGPELKKPGETVKISCKASGYAFTNYGVNWVKEAPGKELKWMGWINIYTGEPTYVDDFKGRFAFSLETSASTAYLEINNLKNEDTATYFCTRGDYVNWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPR\n>1dbb_L\nDVVMTQIPLSLPVNLGDQASISCRSSQSLIHSNGNTYLHWYLQKPGQSPKLLMYKVSNRFYGVPDRFSGSGSGTDFTLKISRVEAEDLGIYFCSQSSHVPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>3ls4_H\nEVKLVESGGGLVKPGGSLKLSCAASGFTFNNYVMVWLRQTPEKRLEWVASISRGGSTYYPDSVKGRFTISRDNARNILYLQMSSLRSEDTAMYYCVRGTTIVAGDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>3ls4_L\nDIVLTQSPTTMAASPGEKITITCSASSSISSNYLHWYQQKPGFSPKLLIYRTSNLASGVPARFSGSGSGTSYSLTIGTMEAEDVATYYCQQGSSIPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3ls5_H\nEVKLVESGGGLVKPGGSLKLSCAASGFTFNNYVMVWLRQTPEKRLEWVASISRGGSTYYPDSVKGRFTISRDNARNILYLQMSSLRSEDTAMYYCVRGTTIVAGDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>3ls5_L\nDIVLTQSPTTMAASPGEKITITCSASSSISSNYLHWYQQKPGFSPKLLIYRTSNLASGVPARFSGSGSGTSYSLTIGTMEAEDVATYYCQQGSSIPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2vdp_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYVHWVKQRPEQGLEWIGRIDPANGYTKYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCVRPLYDYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>2vdp_L\nDILMTQSPSSMSVSLGDTVSITCHASQGISSNIGWLQQKPGKSFMGLIYYGTNLVDGVPSRFSGSGSGADYSLTISSLDSEDFADYYCVQYAQLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2vdq_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYVHWVKQRPEQGLEWIGRIDPANGYTKYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCVRPLYDYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>2vdq_L\nDILMTQSPSSMSVSLGDTVSITCHASQGISSNIGWLQQKPGKSFMGLIYYGTNLVDGVPSRFSGSGSGADYSLTISSLDSEDFADYYCVQYAQLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1dbk_H\nQIQLVQSGPELKKPGETVKISCKASGYAFTNYGVNWVKEAPGKELKWMGWINIYTGEPTYVDDFKGRFAFSLETSASTAYLEINNLKNEDTATYFCTRGDYVNWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPR\n>1dbk_L\nDVVMTQIPLSLPVNLGDQASISCRSSQSLIHSNGNTYLHWYLQKPGQSPKLLMYKVSNRFYGVPDRFSGSGSGTDFTLKISRVEAEDLGIYFCSQSSHVPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1dbj_H\nQIQLVQSGPELKKPGETVKISCKASGYAFTNYGVNWVKEAPGKELKWMGWINIYTGEPTYVDDFKGRFAFSLETSASTAYLEINNLKNEDTATYFCTRGDYVNWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPR\n>1dbj_L\nDVVMTQIPLSLPVNLGDQASISCRSSQSLIHSNGNTYLHWYLQKPGQSPKLLMYKVSNRFYGVPDRFSGSGSGTDFTLKISRVEAEDLGIYFCSQSSHVPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1dbm_H\nQIQLVQSGPELKKPGETVKISCKASGYAFTNYGVNWVKEAPGKELKWMGWINIYTGEPTYVDDFKGRFAFSLETSASTAYLEINNLKNEDTATYFCTRGDYVNWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPR\n>1dbm_L\nDVVMTQIPLSLPVNLGDQASISCRSSQSLIHSNGNTYLHWYLQKPGQSPKLLMYKVSNRFYGVPDRFSGSGSGTDFTLKISRVEAEDLGIYFCSQSSHVPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1zvo_A\nQSVLTQPPSASGTPGQRVTISCFGSSSNIGRYYVYWYQQLPGTTPKLLIYKDNQRPSGVPDRFSGSKSGTSASLAISGLRSEDEADYYCAAWDDSLWVFGGGTTLTVLSQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>1zvo_C\nRLQLQESGPGLVKPSETLSLTCIVSGGPIRRTGYYWGWIRQPPGKGLEWIGGVYYTGSIYYNPSLRGRVTISVDTSRNQFSLNLRSMSAADTAMYYCARGNPPPYYDIGTGSDDGIDVWGQGTTVHVSSAPTKAPDVFPIISGCRHPKDNSPVVLACLITGYHPTSVTVTWYMGTQSQPQRTFPEIQRRDSYYMTSSQLSTPLQQWRQGEYKCVVQHTASKSKKEIFRWPESPKAQASSVPTAQPQAEGSLAKATTAPATTRNTGRGGEEKKKEKEKEEQEERETKTPECPSHTQPLGVYLLTPAVQDLWLRDKATFTCFVVGSDLKDAHLTWEVAGKVPTGGVEEGLLERHSNGSQSQHSRLTLPRSLWNAGTSVTCTLNHPSLPPQRLMALREPAAQAPVKLSLNLLASSDPPEAASWLLCEVSGFSPPNILLMWLEDQREVNTSGFAPARPPPQPGSTTFWAWSVLRVPAPPSPQPATYTCVVSHEDSRTLLNASRSLEVSYVTDHGPM\n>1r3l_A\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1r3l_B\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>1zvy_A\nDVQLVESGGGSVQAGGSLRLSCAASGSTDSIEYMTWFRQAPGKAREGVAALYTHTGNTYYTDSVKGRFTISQDKAKNMAYLRMDSVKSEDTAIYTCGATRKYVPVRFALDQSSYDYWGQGTQVTVSSRGRHHHHHH\n>1r3i_H\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>1r3i_L\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1r3j_A\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1r3j_B\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>1r3k_A\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1r3k_B\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>3ogo_H\nMQVQLVESGGALVQPGGSLRLSCAASGFPVNRYSMRWYRQAPGKEREWVAGMSSAGDRSSYEDSVKGRFTISRDDARNTVYLQMNSLKPEDTAVYYCNVNVGFEYWGQGTQVTVSSKHHHHHH\n>3ogo_E\nMQVQLVESGGALVQPGGSLRLSCAASGFPVNRYSMRWYRQAPGKEREWVAGMSSAGDRSSYEDSVKGRFTISRDDARNTVYLQMNSLKPEDTAVYYCNVNVGFEYWGQGTQVTVSSKHHHHHH\n>3ogc_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>3ogc_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>2zjs_H\nQVQLQQSGAELMKPGASVKISCKATGYTFSSYWIAWVKQRPGHGLEWIGEILPGSGSTNYNEKFKGKATFTADTSSNTAYMQLSSLTSEDSAVYYCARSPYYYGNWDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>2zjs_L\nDIQMTQTTSSLSASLGDRVTISCRASQDISNYLNWYQQKPDGTVKLLIYYTSRLHSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQGNTLPWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4g5z_H\nQVQLVESGGGVVQPGRSLRLSCAASGFTFSVYGMNWVRQAPAKGLEWVAIIWYDGDNQYYADSVKGRFTISRDNSKNTLYLQMNGLRAEDTAVYYCARDLRTGPFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVAP\n>4g5z_L\nEIVLTQSPDFQSVTPKEKVTITCRASQSIGSSLHWYQQKPDQSPKLLIKYASQSFSGVPSRFSGSGSGTDFTLTINSLEAEDAAAYYCHQSSSLPFTFGPGTKVDIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRG\n>4j8r_A\nDIVMTQSHKFMSTSVGDRVSITCKASQVGTALAWYQQKPGQSPKLLIYWASTRHTGVPDRFTGSGSGTDFTLTISNVQSEDLSDYFCQQYSSYPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSETDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRA\n>4j8r_C\nDIVMTQSHKFMSTSVGDRVSITCKASQVGTALAWYQQKPGQSPKLLIYWASTRHTGVPDRFTGSGSGTDFTLTISNVQSEDLSDYFCQQYSSYPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSETDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRA\n>1a2y_A\nDIVLTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFWSTPRTFGGGTKLEIK\n>1a2y_B\nQVQLQESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSS\n>6fab_H\nEVQLQQSGVELVRAGSSVKMSCKASGYTFTSNGINWVKQRPGQGLEWIGYNNPGNGYIAYNEKFKGKTTLTVDKSSSTAYMQLRSLTSEDSAVYFCARSEYYGGSYKFDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRD\n>6fab_L\nDIQMTQIPSSLSASLGDRVSISCRASQDINNFLNWYQQKPDGTIKLLIYFTSRSQSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQGNALPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2r0w_H\nQVTLKESGPGILKPSQTLSLTCSLSGFSLRTSGMGVGWIRQPSGKGLEWLAHIWWDDDKNYNPSLKSQLTISKDTSRNQVFLKITSVDTADTATYYCVRRAHNVVLGDWFAYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>2r0w_L\nDVLMTQTPLSLPVSLGDQASISCRSSQSIVHSNGNTYLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHVPLTFGAGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3vi4_H\nQVHLQQSGAELMKPGASVKISCKATGYTFTSYWIEWVKQRPGHGLEWLGEILPGSGYIHYNEKFKGKATFTTDTSSNTAYMQLSSLTSEDSAVYYCSRALALYAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>3vi4_E\nDIVMTQATPSIPVTPGESVSISCRSNKSLLHSNGNTYLYWFLQRPGQSPRLLIFRMSNLASGVPDRFSGSGSGTAFTLRISRVEAADVGIYFCLQHLEYPFTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2r0z_H\nQVTLKESGPGILKPSQTLSLTCSFSGFSLSTSGMGVGWIRQPSGKGLEWLAHIWWDDDRSYNPSLKSQLTISKDTSRNQVFLRITSVDTADTATYYCVRRAHTTVLGDWFAYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPALLQSDLYTLSSSSTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>2r0z_L\nDVLMTQTPLSLPVSLGDQASISCRSSQSIVHSNGNTYLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHVPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4krm_B\nQVKLEESGGGSVQTGGSLRLTCAASGRTSRSYGMGWFRQAPGKEREFVSGISWRGDSTGYADSVKGRFTISRDNAKNTVDLQMNSLKPEDTAIYYCAAAAGSAWYGTLYEYDYWGQGTQVTVSSALEHHHHHH\n>4krm_D\nQVKLEESGGGSVQTGGSLRLTCAASGRTSRSYGMGWFRQAPGKEREFVSGISWRGDSTGYADSVKGRFTISRDNAKNTVDLQMNSLKPEDTAIYYCAAAAGSAWYGTLYEYDYWGQGTQVTVSSALEHHHHHH\n>4krl_B\nQVKLEESGGGSVQTGGSLRLTCAASGRTSRSYGMGWFRQAPGKEREFVSGISWRGDSTGYADSVKGRFTISRDNAKNTVDLQMNSLKPEDTAIYYCAAAAGSAWYGTLYEYDYWGQGTQVTVSSALEHHHHHH\n>4kro_C\nDILLTQSPVILSVSPGERVSFSCRASQSIGTNIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIADYYCQQNNNWPTTFGAGTKLELKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNR\n>4kro_B\nQVQLQESGGGLVQPGGSLRLSCAASGRTFSSYAMGWFRQAPGKQREFVAAIRWSGGYTYYTDSVKGRFTISRDNAKTTVYLQMNSLKPEDTAVYYCAATYLSSDYSRYALPQRPLDYDYWGQGTQVTVSSLEHHHHHH\n>4krn_A\nQVQLQESGGGLVQPGGSLRLSCAASGRTFSSYAMGWFRQAPGKQREFVAAIRWSGGYTYYTDSVKGRFTISRDNAKTTVYLQMNSLKPEDTAVYYCAATYLSSDYSRYALPQRPLDYDYWGQGTQVTVSSLEHHHHHH\n>4krp_C\nDILLTQSPVILSVSPGERVSFSCRASQSIGTNIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIADYYCQQNNNWPTTFGAGTKLELKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNR\n>4krp_B\nEVQLVESGGGLVQAGGSLRLSCAASGRTFSSYAMGWFRQAPGKEREFVVAINWSSGSTYYADSVKGRFTISRDNAKNTMYLQMNSLKPEDTAVYYCAAGYQINSGNYNFKDYEYDYWGQGTQVTVSSALEHHHHHH\n>1h3p_H\nEVQLVESGGGLVKPGGSLKLSCAASGFTFSSYAMSWVRQSPEKRLEWVAEVSSDGSYAYYPDTLTGRFTISRDNAKNTLYLEMTSLRSEDTAMYYCASFNWDVAYWGQGTLVTVSAAKTTPPSVYPLAPGSLAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRDC\n>1h3p_L\nDIVMTQSPSSLAVSVGEKVTMSCRSSQSLLNTRTRKSYLAWFQQKPGQSPKMLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSYSLYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNECEVQLVESGGGLVKPGGSLKLS\n>2r0k_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTITGSAIHWVRQAPGKGLEWVAIINPNGGYTYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARSARFSFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHT\n>2r0k_L\nDIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2r0l_H\nEVQLVESGGGLVQPGGSLRLSCAASGFTISNSGIHWVRQAPGKGLEWVGWIYPTGGATDYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARFWWRSFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>2r0l_L\nDIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>2boc_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>2boc_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>2bob_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>2bob_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1psk_H\nEVQLQQSGPELVKPGASVKISCKTSGYTFTKYTMHWVKQSHGKSLEWIGDINPNNGGTNYNQKFKGTATLTVHKSSTTAYMELRSLTSEDSAVYYCTSKSFDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSAVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDK\n>1psk_L\nQIVLTQSPAIMSASPGEKVTITCSASSSVSNIHWFQQKPGTFPKLWIYSTSTLASGVPGRFSGSGSGTSYSLTISRMGAEDAATYYCQQRSGYPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4gw5_A\nDILLTQSPVILSVSPGERVSFSCRASQSIGTNIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIADYYCQQNNNWPTTFGAGTKLELKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4gw5_C\nDILLTQSPVILSVSPGERVSFSCRASQSIGTNIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIADYYCQQNNNWPTTFGAGTKLELKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>1moe_A\nDIVLTQSPASLAVSLGQRATMSCRAGESVDIFGVGFLHWYQQKPGQPPKLLIYRASNLESGIPVRFSGTGSRTDFTLIIDPVEADDVATYYCQQTNEDPYTFGGGTKLEIKGGGSGGGGEVQLQQSGAELVEPGASVKLSCTASGFNIKDTYMHWVKQRPEQGLEWIGRIDPANGNSKYVPKFQGKATITADTSSNTAYLQLTSLTSEDTAVYYCAPFGYYVSDYAMAYWGQGTSVTVSS\n>1moe_A\nDIVLTQSPASLAVSLGQRATMSCRAGESVDIFGVGFLHWYQQKPGQPPKLLIYRASNLESGIPVRFSGTGSRTDFTLIIDPVEADDVATYYCQQTNEDPYTFGGGTKLEIKGGGSGGGGEVQLQQSGAELVEPGASVKLSCTASGFNIKDTYMHWVKQRPEQGLEWIGRIDPANGNSKYVPKFQGKATITADTSSNTAYLQLTSLTSEDTAVYYCAPFGYYVSDYAMAYWGQGTSVTVSS\n>1moe_B\nDIVLTQSPASLAVSLGQRATMSCRAGESVDIFGVGFLHWYQQKPGQPPKLLIYRASNLESGIPVRFSGTGSRTDFTLIIDPVEADDVATYYCQQTNEDPYTFGGGTKLEIKGGGSGGGGEVQLQQSGAELVEPGASVKLSCTASGFNIKDTYMHWVKQRPEQGLEWIGRIDPANGNSKYVPKFQGKATITADTSSNTAYLQLTSLTSEDTAVYYCAPFGYYVSDYAMAYWGQGTSVTVSS\n>1moe_B\nDIVLTQSPASLAVSLGQRATMSCRAGESVDIFGVGFLHWYQQKPGQPPKLLIYRASNLESGIPVRFSGTGSRTDFTLIIDPVEADDVATYYCQQTNEDPYTFGGGTKLEIKGGGSGGGGEVQLQQSGAELVEPGASVKLSCTASGFNIKDTYMHWVKQRPEQGLEWIGRIDPANGNSKYVPKFQGKATITADTSSNTAYLQLTSLTSEDTAVYYCAPFGYYVSDYAMAYWGQGTSVTVSS\n>1tpx_C\nDVVMSQTPLTLSVTIGQPASISCKSSQSLLDSDGKTYLNWLLQRPGQSPKRLIYLVSRLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGIYFCWQGSHFPQTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1tpx_B\nQIQLVQSGPELKKPGETVKISCKASGYTFTNYGMNLVKQAPGKGFEWMGWINTFTGEPTYADDFKGRFVFSLDTSASTAYLQINNLKNEDTATYFFTRGTDYWGQGTTLTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEP\n>2ok0_H\nEVQLEESGPELVKPGASVKISCKASGYTFTDYYMNWLRQKPGQGLEWIGWVYPGSIKYNEKFKDKATLTADTSSSIVYMHLSSLTSDDNAVYFCTRWTYGSSFDYWGEGTLLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>2ok0_L\nDILMTQTPLSLPVSLGDQASISCRSSQSIVHSNGNTYLEWYLQKPGQSPTLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYYCFQGSHIPLTFGAGTKLEVKRSDAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1ub5_A\nEVKLLESGGGLVKPGGSLKLSCTASGITFSRYIMSWVRQIPEKRLEWVASISSGGITYYPDSVAGRFTISRDNVRNILYLQMSSLRSEDTALYYCARGQGRPYWGQGTLVTVSSAKTTPPSVYPAAPGCGDTTGSSVTLGCLVKGYFPEPVTVTWNSGGSSVHTFPALLQSGLYTMSSSVTVPSSTWPSTVTCSVAHPASSTTVDKKLE\n>1ub5_H\nEVKLLESGGGLVKPGGSLKLSCTASGITFSRYIMSWVRQIPEKRLEWVASISSGGITYYPDSVAGRFTISRDNVRNILYLQMSSLRSEDTALYYCARGQGRPYWGQGTLVTVSSAKTTPPSVYPAAPGCGDTTGSSVTLGCLVKGYFPEPVTVTWNSGGSSVHTFPALLQSGLYTMSSSVTVPSSTWPSTVTCSVAHPASSTTVDKKLE\n>1ub6_A\nAALLESGGGLVKPGGSLKLSCTASGITFSRYIMSWVRQIPEKRLEWVASISSGGITYYPDSVAGRFTISRDNVRNILYLQMSSLRSEDTALYYCARGQGRPYWGQGTLVTVSAAKTTPPSVYPAAPGCGDTTGSSVTLGCLVKGYFPESVTVTWNSGGSSVHTFPALLQSGLYTMSSSVTVPSSTWPSTVTCSVAHPASGTTVDKKLE\n>1ub6_H\nAALLESGGGLVKPGGSLKLSCTASGITFSRYIMSWVRQIPEKRLEWVASISSGGITYYPDSVAGRFTISRDNVRNILYLQMSSLRSEDTALYYCARGQGRPYWGQGTLVTVSAAKTTPPSVYPAAPGCGDTTGSSVTLGCLVKGYFPESVTVTWNSGGSSVHTFPALLQSGLYTMSSSVTVPSSTWPSTVTCSVAHPASGTTVDKKLE\n>3raj_H\nTLVQLKQSGPSLVQPSQRLSITCTVSGFSLISYGVHWVRQSPGKGLEWLGVIWRGGSTDYNAAFMSRLSITKDNSKSQVFFKMNSLQADDTAIYFCAKTLITTGYAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIENR\n>3raj_L\nIQMTQSSSSFSVSLGDRVTITCKASEDIYNRLAWYQQKPGNAPRLLISGATSLETGVPSRFSGSGSGKDYTLSITSLQTEDVATYYCQQYWSTPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>4hj0_Q\nSYVLTQPPSASGTPGQRVAISCSGSNSNIGSNTVHWYQQLPGAAPKLLIYSNNQRPSGVPDRFSGSNSGTSASLAISRLQSEDEADYYCAAWDDSLNGVVFGGGTKVTVLQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>4hj0_P\nQVQLQQSGAEVKKPGSSVKVSCKASGGTFSSYAISWVRQAPGQGLEWMGGIIPTFGTANYAQKFQGRVTITADESTSTAYMELSSLRSEDTAVYYCAQGPIVGAPTDYWGKGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDKTHT\n>3h0t_A\nNFMLTQPHSVSESPGKTVTISCTRSSGSIASYYVQWYQQRPGSSPTTVIYEDSQRPSGVPDRFSGSIDSSSNSASLTISGLKTEDEADYYCQSYDSSNVVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>3h0t_B\nQVQLQQSGPGLVKPSQTLSLTCAISGDSVSSNSAAWNWIRQSPSRGLEWLGRTYYRSKWFNDYAVSVQSRITINPDTSKNQFSLQLNSVTPEDTAVYYCARGIVFSYAMDVWGQGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCAADEVDHHHHHH\n>3u46_A\nEVQLVESGGGLIRPGGSLRLSCKGSGFIFENFGFGWVRQGPGKGLEWVSGTNWNGGDSRYGDSVKGRFTISRDNSNNFVYLQMNSLRPEDTAIYYCARGTDYTIDDQGIRYQGSGTFWYFDVWGRGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>3u46_H\nEVQLVESGGGLIRPGGSLRLSCKGSGFIFENFGFGWVRQGPGKGLEWVSGTNWNGGDSRYGDSVKGRFTISRDNSNNFVYLQMNSLRPEDTAIYYCARGTDYTIDDQGIRYQGSGTFWYFDVWGRGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDK\n>1yee_H\nEVKLQESGAELVRPGASVKLSCKTSGYIFTSYWIHWVKQRAAAGLEWIARIYPGTGSSYYNVKFKGKATLTADKSSSTAYMQLSSLKSDDSAVYFCVRWGFIPVREDYVLDYWGQGTLVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEP\n>1yee_L\nDIVMTQSPLTLSVTIGQPASISCKSSQSLLYSNGKTYLSWLLQRPGQSPKRLIYLVSKLDSGVPDRFTGSGSGTDFTLKISRVEAADLGLYYCVQGTHFPYTFGGGTKLEILRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2fat_H\nGVKLQQSGPEVVKPGASVKISCKASGYSFTNFYIHWVKQRPGQGLEWIGWIFHGSDNTEYNEKFKDKATLTADTSSSTAYMQLSSLTSEDSAVYFCARWGPHWYFDVWGQGTTVTVSSAKTTPPSVYPLAPGNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIAAAG\n>2fat_L\nDIVLTQSPDITAASLGQKVTITCSASSSVSYMHWYQQKSGTSPKPWIFEISKLASGVPARFSGSGSGTSYSLTISSMEAEDAAIYYCQQWNYPFTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1f4w_H\nEVQLEESGGGLVTPGGSLRLSCAASGYVFSTYDMSWVRQTPEKRLEWVAFISSGGGRTSYPDTVKGRFTISRDDAKNTLYLQMSSLQSEDTAMYYCTRHFYAVLDYWGRGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVP\n>1f4w_L\nQAVVTQESALTTSPGETVTLTCRSSTGTVTTSNYANWVQEKPDHLFTGLIGATNNRAAGVPVRFSGSLIGGKAALTITGAQTEDEAIYFCALWYSGHWVFGGGTKLTVLGQPKSSPSVTLFPPSSEELETNKATLVCTITDFYPGVVTVDWKVDGTPVTQGMETTNPSKQSNNKYMASSYLTLTARAWERHSSYSCQVTHEGHTVEKSLS\n>2jb5_H\nQVQLVQSGAEVKKPGSSVKVSCKASGGTFSNYAINWVRQAPGQGLEWMGNIEPYFGTANYAQKFQGRVTITADESTSTAYMELSSLRSEDTAVYYCARYFMSYKHLSDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSEFEQKLISEEDLNGAPHHHHHH\n>2jb5_L\nDIALTQPASVSGSPGQSITISCTGTSSDVGSNNYVSWYQQHPGKAPKLMIYGGSNRPSGVSNRFSGSKSGNTASLTISGLQAEDEADYYCRSWDSNLSYSVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTEA\n>4dtg_H\nEVQLVESGGGLVKPGGSLRLSCAASGFTFSNYAMSWVRQTPEKRLEWVATISRSGSYSYFPDSVQGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARLGGYDEGDAMDSWGQGTTVTVSSASTKGPSVFPLAPCSRSTSESTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTKTYTCNVDHKPSNTKVDKRVESK\n>4dtg_L\nDIVMTQTPLSLSVTPGQPASISCKSSQSLLESDGKTYLNWYLQKPGQSPQLLIYLVSILDSGVPDRFSGSGSGTDFTLKISRVEAEDVGVYYCLQATHFPQTFGGGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3w9e_A\nQVTLKQSGAEVKKPGSSVKVSCTASGGTLRTYGVSWVRQAPGQGLEWLGRTIPLFGKTDYAQKFQGRVTITADKSMDTSFMELTSLTSEDTAVYYCARDLTTLTSYNWWDLWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>3w9e_B\nEIVLTQSPGTLSLSPGERATLSCRASQSVTSSQLAWYQQKPGQAPRLLISGASNRATGIPDRFSGSGSGTDFTLTISRLEPEDFAVYYCQQYGSSPTFGGGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKLYACEVTHQGLSSPVTKSFNRGEC\n>3w9d_A\nQVTLKQSGAEVKKPGSSVKVSCTASGGTLRTYGVSWVRQAPGQGLEWLGRTIPLFGKTDYAQKFQGRVTITADKSMDTSFMELTSLTSEDTAVYYCARDLTTLTSYNWWDLWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>3w9d_C\nQVTLKQSGAEVKKPGSSVKVSCTASGGTLRTYGVSWVRQAPGQGLEWLGRTIPLFGKTDYAQKFQGRVTITADKSMDTSFMELTSLTSEDTAVYYCARDLTTLTSYNWWDLWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEP\n>3gb7_A\nQVQLQQPGAELVKPGASVKLSCKASGYTFTSDWIHWVKQRPGHGLEWIGEIIPSYGRANYNEKIQKKATLTADKSSSTAFMQLSSLTSEDSAVYYCARERGDGYFAVWGAGTTVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRD\n>3gb7_B\nDILLTQSPAILSVSPGERVSFSCRASQSIGTDIHWYQQRTNGSPRLLIKYASESISGIPSRFSGSGSGTDFTLSINSVESEDIANYYCQQSNRWPFTFGSGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1lgv_A\nETALTQPASVSGSPGQSITVSCTGVSSIVGSYNLVSWYQQHPGKAPKLLTYEVNKRPSGVSDRFSGSKSGNSASLTISGLQAEDEADYYCSSYDGSSTSVVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTKPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTAC\n>1lgv_B\nETALTQPASVSGSPGQSITVSCTGVSSIVGSYNLVSWYQQHPGKAPKLLTYEVNKRPSGVSDRFSGSKSGNSASLTISGLQAEDEADYYCSSYDGSSTSVVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTKPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTAC\n>4hjg_A\nDIQMTQSPILLSASVGDRVTITCRASQDVNTAVAWYQQRTNGSPRLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDIADYYCQQHYTTPPTFGAGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4hjg_B\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQSPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAIYYCSRWGGDGFYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>3kj4_H\nQVQLKESGPGLVAPSQSLSISCSVSGFSLSSYGVHWVRQSPGQGLEWLGVIWSGGNTHYNSALMSRLSISKENSKNQVFLKMNSLQTDDTAIYYCARVGIYYEGAWFAYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>3kj4_C\nQVQLKESGPGLVAPSQSLSISCSVSGFSLSSYGVHWVRQSPGQGLEWLGVIWSGGNTHYNSALMSRLSISKENSKNQVFLKMNSLQTDDTAIYYCARVGIYYEGAWFAYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>3kj6_H\nEVQLQQSGAELARPGASVKLSCKASGYIFTDYYINWVRQRTGQGFEWIGEIYPGSGNIDYNERFKDKATLTADKSSSTAYMQLSSLTSEDSAVYFCVRGFGYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSAVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDCGC\n>3kj6_L\nDIKMTQSPSSMYASLGERVTITCKASQDINSYLSWFQQKPGKSPKTLIYRANRLVDGVPSRFIGTGSGQDYSLTISSLDYADMGIYYCLQYDEFPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4hjj_H\nEVTLRESGPALVKPTQTLTLTCTFSGFSLSKSVMGVSWIRQPPGKALEWLAHIYWDDDKYYNPSLSARLTISKDTSKNQVVLTMTNMDPVDTATYYCARRGIRSAMDYWGQGTTVTVSSASTKGPEVQLVQSGTEVKKPGESLKISCKGSGYTVTSYWIGWVRQMPGKGLEWMGFIYPGDSETRYSPTFQGQVTISADKSFNTAFLQWSSLKASDTAMYYCARVGSGWYPYTFDIWGQGTMVTVSSASTKGPSVFPLAPSSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>4hjj_L\nDIVMTQSPDSLAVSLGERATINCKASQSVSNDVAWYQQKPGQPPKLLIYYASNRYTGVPDRFSGSGSGTDFTLTISSLEAEDVAVYYCQQDYNSPWTFGGGTKVEIKRTVAAPEIVMTQSPATLSVSPGERATLSCRASESISSNLAWYQQKPGQAPRLFIYTASTRATDIPARFSGSGSGTEFTLTISSLQSEDFAVYYCQQYNNWPSITFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGE\n>4ht1_H\nQEQLVESGGGLVQPGGSLTLSCKASGFDFSTYYMSWVRQAPGKGLEWIGTVYVRQGTTYYASWLNGRFTISSDNAQNTVDLKMNSLTAADTATYFCAKGGYNYDDAFVIWGPGTLVTVSFASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTH\n>4ht1_L\nAIEMTQTPFSVSAAVGGTVTINCQASQNIYSNLAWYQQKPGQPPKLLMYTASYLASGVPSRFKGSGSRTEYTLTISGVQCADAATYYCQTAYYNSRPDTVAFGGGTEVVVKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3ra7_I\nEVQLVESGGGLVKPGGSLKLSCAVSGFTFSDYAMSWIRQTPENRLEWVASINIGATYAYYPDSVKGRFTISRDNAKNTLFLQMSSLGSEDTAMYYCARPGSPYEYDKAYYSMAYWGPGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRDCG\n>3ra7_H\nEVQLVESGGGLVKPGGSLKLSCAVSGFTFSDYAMSWIRQTPENRLEWVASINIGATYAYYPDSVKGRFTISRDNAKNTLFLQMSSLGSEDTAMYYCARPGSPYEYDKAYYSMAYWGPGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRDCG\n>3k1k_C\nMAQVQLVESGGALVQPGGSLRLSCAASGFPVNRYSMRWYRQAPGKEREWVAGMSSAGDRSSYEDSVKGRFTISRDDARNTVYLQMNSLKPEDTAVYYCNVNVGFEYWGQGTQVTVSSHHHHHH\n>3k1k_D\nMAQVQLVESGGALVQPGGSLRLSCAASGFPVNRYSMRWYRQAPGKEREWVAGMSSAGDRSSYEDSVKGRFTISRDDARNTVYLQMNSLKPEDTAVYYCNVNVGFEYWGQGTQVTVSSHHHHHH\n>3mj8_A\nSYTLTQPPLVSVALGQKATITCSGDKLSDVYVHWYQQKAGQAPVLVIYEDNRRPSGIPDHFSGSNSGNMATLTISKAQAGDEADYYCQSWDGTNSAWVFGSGTKVTVLGQPNAAPSVTLFPPSSEELKTNQATLVCMINGFYPADVAVTWEADGTPITQGVKTTQPSKSDSKYMATSYLTMTADAWKSRNTFICKVTHGGNTVEKSLSPSACS\n>3mj8_H\nQVQLKESGPGLLQPSQTLSLTCTVSGISLSDYGVHWVRQAPGKGLEWMGIIGHAGGTDYNSNLKSRVSISRDTSKSQVFLKLNSLQQEDTAMYFCARHFYTYFDVWGQGIQVTVSSATTTAPSVYPLAPACDSTTSTTNTVTLGCLVKGYFPEPVTVSWNSGALTSGVHTFPSVLHSGLYSLSSSVTVPSSTWPSQTVTCNVAHPASSTKVDKKIVPGDGSGC\n>3mj9_H\nQVQLKESGPGLLQPSQTLSLTCTVSGISLSDYGVHWVRQAPGKGLEWMGIIGHAGGTDYNSNLKSRVSISRDTSKSQVFLKLNSLQQEDTAMYFCARHFYTYFDVWGQGIQVTVSSATTTAPSVYPLAPACDSTTSTTNTVTLGCLVKGYFPEPVTVSWNSGALTSGVHTFPSVLHSGLYSLSSSVTVPSSTWPSQTVTCNVAHPASSTKVDKKIVPGDGSGC\n>3mj9_L\nSYTLTQPPLVSVALGQKATITCSGDKLSDVYVHWYQQKAGQAPVLVIYEDNRRPSGIPDHFSGSNSGNMATLTISKAQAGDEADYYCQSWDGTNSAWVFGSGTKVTVLGQPNAAPSVTLFPPSSEELKTNQATLVCMINGFYPADVAVTWEADGTPITQGVKTTQPSKSDSKYMATSYLTMTADAWKSRNTFICKVTHGGNTVEKSLSPSACS\n>3qcu_I\nEVQLVQSGAEVKKPGESLKISCQAFGYGFINYLIEWIRQMPGQGLEWIGLINPGSDYTNYNENFKGQATLSADKSSSTAYLQWSSLKASDTAMYFCARRFGYYGSGNYFDYWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>3qcu_H\nEVQLVQSGAEVKKPGESLKISCQAFGYGFINYLIEWIRQMPGQGLEWIGLINPGSDYTNYNENFKGQATLSADKSSSTAYLQWSSLKASDTAMYFCARRFGYYGSGNYFDYWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>3gbm_I\nEVQLVESGAEVKKPGSSVKVSCKASGGPFRSYAISWVRQAPGQGPEWMGGIIPIFGTTKYAPKFQGRVTITADDFAGTVYMELSSLRSEDTAMYYCAKHMGYQVRETMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>3gbm_H\nEVQLVESGAEVKKPGSSVKVSCKASGGPFRSYAISWVRQAPGQGPEWMGGIIPIFGTTKYAPKFQGRVTITADDFAGTVYMELSSLRSEDTAMYYCAKHMGYQVRETMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>3gbn_H\nEVQLVESGAEVKKPGSSVKVSCKASGGPFRSYAISWVRQAPGQGPEWMGGIIPIFGTTKYAPKFQGRVTITADDFAGTVYMELSSLRSEDTAMYYCAKHMGYQVRETMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>3gbn_L\nQSVLTQPPSVSAAPGQKVTISCSGSSSNIGNDYVSWYQQLPGTAPKLLIYDNNKRPSGIPDRFSGSKSGTSATLGITGLQTGDEANYYCATWDRRPTAYVVFGGGTKLTVLGAAAGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>3qcv_I\nEVQLVQSGAEVKKPGESLKISCQAFGYGFINYLIEWIRQMPGQGLEWIGLINPGSDYTNYNENFKGQATLSADKSSSTAYLQWSSLKASDTAMYFCARRFGYYGSGNYFDYWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>3qcv_H\nEVQLVQSGAEVKKPGESLKISCQAFGYGFINYLIEWIRQMPGQGLEWIGLINPGSDYTNYNENFKGQATLSADKSSSTAYLQWSSLKASDTAMYFCARRFGYYGSGNYFDYWGQGTMVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>3ejz_C\nVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>3ejz_E\nVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>3ejy_C\nVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>3ejy_E\nVRLLESGGGLVQPGGSLKLSCAASGFDYSRYWMSWVRQAPGKGLKWIGEINPVSSTINYTPSLKDKFIISRDNAKDTLYLQISKVRSEDTALYYCARLYYGYGYWYFDVWGAGTTVTVSSAKTTPPSVYPLAPGSAAAAASMVTLGCLVKGYFPEPVTVTWNSGSLAAGVHTFPAVLQAALYTLSSSVTVPSSSWPSETVTCNVAHPASSTKVDKKIVPRA\n>1yei_H\nEMQLQQSGAELLRPGTSVKLSCKTSGYIFTSYWIHWVKQRSGQGLEWIARIYPGTGSTYYNEKFKGKATLTADKSSSTAYMQLSTLKSEDSAVYFCTRWGFIPVREDYVMDYWGQGTLVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEP\n>1yei_L\nDIVMTQSPLTLSVTIGQPASISCKSSQSLLYSNGKTYLNWLLQRPGQSPKRLIHLVSKLDSGVPDRITGSGSGTDFTLKISRVEAADLGVYYCVQGTHFPYTFGGGTKLEILRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1f4x_H\nEVQLEESGGGLVTPGGSLRLSCAASGYVFSTYDMSWVRQTPEKRLEWVAFISSGGGRTSYPDTVKGRFTISRDDAKNTLYLQMSSLQSEDTAMYYCTRHFYAVLDYWGRGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVP\n>1f4x_L\nQAVVTQESALTTSPGETVTLTCRSSTGTVTTSNYANWVQEKPDHLFTGLIGATNNRAAGVPVRFSGSLIGGKAALTITGAQTEDEAIYFCALWYSGHWVFGGGTKLTVLGQPKSSPSVTLFPPSSEELETNKATLVCTITDFYPGVVTVDWKVDGTPVTQGMETTNPSKQSNNKYMASSYLTLTARAWERHSSYSCQVTHEGHTVEKSLS\n>1yzz_A\nDVQLVESGGGSVQAGGSLRLSCAVSGSTYSPCTTGWVRQAPGKGLEWVSSISSPGTIYYQDSVKGRFTISRDNAKNTVYLQMNSLQREDTGMYYCQIQCGVRSIREYWGQGTQVTVSSHHHHHH\n>1yzz_B\nDVQLVESGGGSVQAGGSLRLSCAVSGSTYSPCTTGWVRQAPGKGLEWVSSISSPGTIYYQDSVKGRFTISRDNAKNTVYLQMNSLQREDTGMYYCQIQCGVRSIREYWGQGTQVTVSSHHHHHH\n>1rjl_A\nDIQMNQSPSSLSASLGDTITITCHASQNINVWLNWFQQKPGSIPKLLIYMASNLHTGVPSRFSGSGSGTGFTLTISSLQPEDIATYYCQQGQSFPLTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>1rjl_B\nQVQLQQPGSVLVRPGASVKLSCKASGFTFTSSWMHWAKQRPGQGLEWIGEIHPNSGNTHYNEKFKGKATLTVDTSSSTAYVDLSSLTSEDSAVYYCARMRYGDYYAMDNWGQGTSVTVSSAKTTAPPVYPLAPVCGDTTGSSVTLGCLVKGYFPESVTLLWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRG\n>1wz1_H\nEVKLEESGGGLVQPGGSMKLSCATSGFTFSDAWMDWVRQSPEKGLEWVAEIRNKANNHATYYAESVKGRFTISRDDSKRRVYLQMNTLRAEDTGIYYCTGIYYHYPWFAYWGQGTLVTVSAEP\n>1wz1_L\nDVVMTQTPLSLPVSLGNQASISCRSSQSLVHSNGNTYLHWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKISRVEAEDLGVYFCSQSTHVPFTFGSGTKLEIKR\n>2wzp_E\nQVQLQESGGGLVQAGGSLRLSCTASRRTGSNWCMGWFRQLAGKEPELVVALNFDYDMTYYADSVKGRFTVSRDSGKNTVYLQMNSLKPEDTAIYYCAARSGGFSSNRELYDGWGQGTQVTVSS\n>2wzp_D\nQVQLQESGGGLVQAGGSLRLSCTASRRTGSNWCMGWFRQLAGKEPELVVALNFDYDMTYYADSVKGRFTVSRDSGKNTVYLQMNSLKPEDTAIYYCAARSGGFSSNRELYDGWGQGTQVTVSS\n>3j2y_A\nQIVLTQSPAIMSASPGEKVTMTCSASSSVTYMYWYQQKPGSSPRLLIYDTSNLASGVPVRFSGSGSGTSYSLTISRMEAEDAATYYCQQRTNYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3j2y_C\nQIVLTQSPAIMSASPGEKVTMTCSASSSVTYMYWYQQKPGSSPRLLIYDTSNLASGVPVRFSGSGSGTSYSLTISRMEAEDAATYYCQQRTNYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3j2x_A\nDIVLTQSPASLAVSLGQRATISCRASESVDSYGNSFMNWYQQKPGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYYCQQSNEDPFTFGSGTKLEIKRADAAPTVSIFPPSSKLGTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3j2x_C\nDIVLTQSPASLAVSLGQRATISCRASESVDSYGNSFMNWYQQKPGQPPKLLIYRASNLESGIPARFSGSGSRTDFTLTINPVEADDVATYYCQQSNEDPFTFGSGTKLEIKRADAAPTVSIFPPSSKLGTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3eyv_A\nDIQMTQSPSSLSASVGDRVTITCRSSQRIVHSNGNTYLEWYQQTPGKAPKLLIYKVSNRFSGVPSRFSGSGSGTDFTFTISSLQPEDIATYYCFQGSHVPFTFGQGTKLQITRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3eyv_H\nEVQLVESGGGVVQPGRSLRLSCSTSGFTFSDYYMYWVRQAPGKGLEWVAYMSNVGAITDYPDTVKGRFTISRDNSKNTLFLQMDSLRPEDTGVYFCARGTRDGSWFAYWGQGTPVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPQPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSC\n>3sn6_N\nQVQLQESGGGLVQPGGSLRLSCAASGFTFSNYKMNWVRQAPGKGLEWVSDISQSGASISYTGSVKGRFTISRDNAKNTLYLQMNSLKPEDTAVYYCARCPAPFTRDCFDVTSTTYAYRGQGTQVTVSSHHHHHHEPEA\n>1kc5_H\nQVKLQQSGPGLVKPSQSLSLTCTVTGYSITSDYAWNWIRQFPGNKLEWMAYISYSGSTTYNPSLKSRISITRDTSKNQFFLQLNSVTTEDTAIYYCARGGTGFDYWGAGTTLTVSAAATTPPSVYPLAPGSATAAASMVTLGCLVKGYFPEPVTVTWNSGALSSGVHTFPAVLQSDLYTLSSSVTVPSSPWPSETVTCNVAHPASSTKVDKKIVPRD\n>1kc5_L\nDIVLTQSPKSMSMSVGEKVTLSCKASENVDTYVSWYQQRPEQPPALLIYGASNRYTGVPDRFTGSGSATDFTLTISSVQAEDLADYHCGQSYSYPLTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVANSWTAQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPVVKSFNRNEC\n>4lve_A\nDIVMTQSPDSLAVSLGERATINCKSSQSVLYSSNSTNYLAWYQQKPGQPPKLLIYWASTRESGVPDRFSGSGSGTDFTLTISSLQAEDVAVYYCQQYYSTPYSFGQGTKLEIKR\n>4lve_B\nDIVMTQSPDSLAVSLGERATINCKSSQSVLYSSNSTNYLAWYQQKPGQPPKLLIYWASTRESGVPDRFSGSGSGTDFTLTISSLQAEDVAVYYCQQYYSTPYSFGQGTKLEIKR\n>3ldb_C\nQIQLQESGPGLVTPSQSLTLTCSVTGDSITSYHWSWIRQFPGKKLEWMGYIYNSGGTDYNPSLKSRVSITREISRNQLFLQLNSVTTEDTATYYCARRDYGTYYFDYWGQGTMVTVSSATTTAPSVYPLAPACDSTTSTTNTVTLGCLVKGYFPEPVTVSWNSGALTSGVHTFPSVLHSGLYSLSSSVTVPSSTWPSQTVTCNVAHPASSTKVDKKIVPGD\n>3ldb_B\nDIVMTQSPSSLAVSAGEKVTMSCRSSQSLYYSGIKKNLLAWYQLKPGQSPKLLIYYASTLFTGVPDRFTGSGSGTDYTLTITSVQAEDMGQYFCQQGISNPYTFGAGTKLEIKRADAKPTVSIFPPSSEQLGTGSATLVCFVNNFYPKDINVKWKVDGSEKRDGVLQSVTDQDSKDSTYSLSSTLSLTKADYERHNLYTCEVTHKTSTAAIVKTLNRNEC\n>4lvn_C\nQVQLQESGPDLVKPSSSLKLTCTTTGYSISSGYSWHWIRQEPGKSLEWMGYIHYSGSTDYNDSLKARITITRDTASNMFFLQLSSVTSDDTAVYYCVIYRYDGQWVFDDWGAGTTVTVSSAKTTPPSVFPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPGVLQSGLYTLSSSVTVPSSPWPSETVTCNVAHPASSTKVDKKIVPR\n>4lvn_B\nDIVLTQSPATMSASLGQRVSMSCSASSSVSTSYFHWYQQKPGSSPKLWIYSTSNLASGVPGRFSGSGSGTSYSLSISSMEAEDAATYYCHQFHRSPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>4lvo_C\nQVQLQESGPDLVKPSSSLKLTCTTTGYSISSGYSWHWIRQEPGKSLEWMGYIHYSGSTDYNDSLKARITITRDTASNMFFLQLSSVTSDDTAVYYCVIYRYDGQWVFDDWGAGTTVTVSSAKTTPPSVFPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPGVLQSGLYTLSSSVTVPSSPWPSETVTCNVAHPASSTKVDKKIVPR\n>4lvo_B\nDIVLTQSPATMSASLGQRVSMSCSASSSVSTSYFHWYQQKPGSSPKLWIYSTSNLASGVPGRFSGSGSGTSYSLSISSMEAEDAATYYCHQFHRSPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>4lvh_C\nDIQMTQSPASLAVSPGQRATITCRASESVSNYGINFINWFQQKPGQPPKLLIYTASNKGTGVPARFSGSGSGTDFTLTINPVEAEDTANYFCQQTKEVPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLDEYERHNSYTCEATHKTSTSPIVKSFN\n>4lvh_B\nVKLQQSGGGVVQPGGSLRLSCAASGFTFSDYDMSWIRQAPGKGLEWVSGILGGSERSYYRDSVKGRFTISRDNSRKTLYLQMNSLRAEDTAVYYCARHGSPGYTLYAWDYWGQGTMVTVSSASTKGPSVFPLAPSKSSTSGATAALGCLVKDYFPEPVTVSWNSGALTSSVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKSCAA\n>1hil_A\nDIVMTQSPSSLTVTAGEKVTMSCTSSQSLFNSGKQKNYLTWYQQKPGQPPKVLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCQNDYSNPLTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1hil_C\nDIVMTQSPSSLTVTAGEKVTMSCTSSQSLFNSGKQKNYLTWYQQKPGQPPKVLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCQNDYSNPLTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1him_H\nDIVMTQSPSSLTVTAGEKVTMSCTSSQSLFNSGKQKNYLTWYQQKPGQPPKVLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCQNDYSNPLTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1him_J\nDIVMTQSPSSLTVTAGEKVTMSCTSSQSLFNSGKQKNYLTWYQQKPGQPPKVLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCQNDYSNPLTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>1hin_H\nEVQLVESGGDLVKPGGSLKLSCAASGFSFSSYGMSWVRQTPDKRLEWVATISNGGGYTYYPDSVKGRFTISRDNAKNTLYLQMSSLKSEDSAMYYCARRERYDENGFAYWGQGTLVTVSAAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPR\n>1hin_L\nDIVMTQSPSSLTVTAGEKVTMSCTSSQSLFNSGKQKNYLTWYQQKPGQPPKVLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCQNDYSNPLTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>3idi_A\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYECEVTHQGLSSPVTKSFNRGEC\n>3idi_B\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEPKSCDK\n>3idj_A\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYECEVTHQGLSSPVTKSFNRGEC\n>3idj_B\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEPKSCDK\n>3cx5_K\nDIELTQTPVSLAASLGDRVTISCRASQDINNFLNWYQQKPDGTIKLLIYYTSRLHAGVPSRFSGSGSGTDYSLTISNLEPEDIATYFCQHHIKFPWTFGAGTKLEIK\n>3cx5_J\nEVKLQESGAGLVQPSQSLSLTCSVTGYSITSGYYWNWIRLFPGNKLEWVGYISNVGDNNYNPSLKDRLSITRDTSKNQFFLKLNSVTTEDTATYYCARSEYYSVTGYAMDYWGQGTTVTVSSAWRHP\n>3cfi_I\nQVQLQESGGGLVQPGGSLRLSCAASGFAFSGYAMSWVRQAPGKGLEWVSGINRDGSTSYTAPVKGRFTISRDNAKNILYLQMNSLRPEDTAVYYCAKWLGGRDWYDRGQGTQVTVS\n>3cfi_C\nQVQLQESGGGLVQPGGSLRLSCAASGFAFSGYAMSWVRQAPGKGLEWVSGINRDGSTSYTAPVKGRFTISRDNAKNILYLQMNSLRPEDTAVYYCAKWLGGRDWYDRGQGTQVTVS\n>3idn_A\nALQLTQSPSSLSASVGDRITITCRASQGVTSALAWYRQKPGSPPQLLIYDASSLESGVPSRFSGSGSGTEFTLTISTLRPEDFATYYCQQLHFYPHTFGGGTRVDVRRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYECEVTHQGLSSPVTKSFNRGEC\n>3idn_B\nRITLKESGPPLVKPTQTLTLTCSFSGFSLSDFGVGVGWIRQPPGKALEWLAIIYSDDDKRYSPSLNTRLTITKDTSKNQVVLVMTRVSPVDTATYFCAHRRGPTTLFGVPIARGPVNAMDVWGQGITVTISSTSTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYTCNVNHKPSNTKVDKRVEPKSCDK\n>3cfk_A\nELVVTQESALTTSPGETVTLTCRSSSGAVTTSNYATWVQEKPDHLFTGLIGGTNKRAPGVPARFSGSLIGDRAALTITGAQTEDEAIYFCALWNSNHLVFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3cfk_C\nELVVTQESALTTSPGETVTLTCRSSSGAVTTSNYATWVQEKPDHLFTGLIGGTNKRAPGVPARFSGSLIGDRAALTITGAQTEDEAIYFCALWNSNHLVFGGGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3cfd_A\nDIQMTQTTSSLSASLGDRVTISCRASQDISNYLNWYQQKPDGTVKLLIYYTSRLHSGVPSRFSGSGSGTDYSLTISNLDQDDIATYFCQQGTTLPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3cfd_H\nEVQLQESGPGLVKPSQSLSLTCTVTGYSITSDYAWNWLRQLPGNKLEWMGYISYSGRIRYNPSLKRRISITRDTSKNQFFLQLNSVTTEDTATYYCARSDYGNYGRGDYWGQGTSVTVSSAKTTPPSVYPLAPGCGDTTGSSVTSGCLVKGYFPESVTVTWNSGSLSSSVHTFPALLQSGLYTMSSSVTVPSSTWPSETVTCSVAHPASSTTVDKKLEPS\n>3cfe_A\nDIQMTQTTSSLSASLGDRVTISCRASQDISNYLNWYQQKPDGTVKLLIYYTSRLHSGVPSRFSGSGSGTDYSLTISNLDQDDIATYFCQQGTTLPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3cfe_H\nEVQLQESGPGLVKPSQSLSLTCTVTGYSITSDYAWNWLRQLPGNKLEWMGYISYSGRIRYNPSLKRRISITRDTSKNQFFLQLNSVTTEDTATYYCARSDYGNYGRGDYWGQGTSVTVSSAKTTPPSVYPLAPGCGDTTGSSVTSGCLVKGYFPESVTVTWNSGSLSSSVHTFPALLQSGLYTMSSSVTVPSSTWPSETVTCSVAHPASSTTVDKKLEPS\n>4nx3_A\nMESQTQVLMFLLLWVSGACADIVMTQSPSSLAMSVGQKVTMSCKSSQSLLNSNNQKNYLAWYQQKPGQSPKLLVYFASTRESGVPDRFIGSGSGTDFTLTISSVQAEDLADYFCQQHYSTPYTFGGGTKLEIRRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4nx3_B\nMKCSWVIFFLMAVVTGVISEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYIHWVNQRPEQGLEWIGRIDPANGHTQYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCATSDYSYALDSWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGPTIKPCPPCKCPAPNLLGGPSVFIFPPKIKDVLMISLSPIVTCVVVDVSEDDPDVQISWFVNNVEVHTAQTQTHREDYNSTLRVVSALPIQHQDWMSGKEFKCKVNNKDLPAPIERTISKPKGSVRAPQVYVLPPPEEEMTKKQVTLTCMVTDFMPEDIYVEWTNNGKTELNYKNTEPVLDSDGSYFMYSKLRVEKKNWVERNSYSCSVVHEGLHNHHTTKSFSRTPGK\n>3cfb_A\nDIVMTQAAFSNPVTLGTSASISCRSTKSLLHSNGITYLYWYLQKPGQSPQLLIYQMSNLASGVPDRFSSSGSGTDFTLRISRVEAEDVGVYYCAQNLELPPTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3cfb_H\nEVKLVESGGGLVKPGGSLKLSCTASGITFSRYIMSWVRQIPEKRLEWVASISSGGITYYPDSVKGRFTISRDNVRNILYLQMSSLRSEDTALYYCARGQGRPYWGQGTLVTVSSAKTTPPSVYPLAPGCGDTTGSSVTLGCLVKGYFPESVTVTWNSGSLSSSVHTFPALLQSGLYTMSSSVTVPSSTWPSETVTCSVAHPASSTTVDKKLEP\n>4k24_H\nEVQLQQSGPELVKTGASVKISCKASGYSFTSYYMHWVKQSHGKSLEWIGEINPYNGGASYNQKIKGRATFTVDTSSRTAYMQFNSLTSEDSAVYYCARSIYGHSVLDYWGQGTSVSVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSQTVTCNVAHPASSTKVDKKIVPRDCGCKPCIC\n>4k24_L\nDVVMTQTPLTLSVTIGQPASISCKSSQSLLDSDGKTYLNWLLQRPGQSPKRLIYLVSKLDSGVPDRFTGSGSGTDFTLKISRVEAEDLGVYYCWQGTHFPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1fgn_H\nEIQLQQSGAELVRPGALVKLSCKASGFNIKDYYMHWVKQRPEQGLEWIGLIDPENGNTIYDPKFQGKASITADTSSNTAYLQLSSLTSEDTAVYYCARDNSYYFDYWGQGTTLTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKI\n>1fgn_L\nDIKMTQSPSSMYASLGERVTITCKASQDIRKYLNWYQQKPWKSPKTLIYYATSLADGVPSRFSGSGSGQDYSLTISSLESDDTATYYCLQHGESPYTFGGGTKLEINRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>3ld8_C\nQIQLQESGPGLVTPSQSLTLTCSVTGDSITSYHWSWIRQFPGKKLEWMGYIYNSGGTDYNPSLKSRVSITREISRNQLFLQLNSVTTEDTATYYCARRDYGTYYFDYWGQGTMVTVSSATTTAPSVYPLAPACDSTTSTTNTVTLGCLVKGYFPEPVTVSWNSGALTSGVHTFPSVLHSGLYSLSSSVTVPSSTWPSQTVTCNVAHPASSTKVDKKIVPGD\n>3ld8_B\nDIVMTQSPSSLAVSAGEKVTMSCRSSQSLYYSGIKKNLLAWYQLKPGQSPKLLIYYASTLFTGVPDRFTGSGSGTDYTLTITSVQAEDMGQYFCQQGISNPYTFGAGTKLEIKRADAKPTVSIFPPSSEQLGTGSATLVCFVNNFYPKDINVKWKVDGSEKRDGVLQSVTDQDSKDSTYSLSSTLSLTKADYERHNLYTCEVTHKTSTAAIVKTLNRNEC\n>1kcu_H\nQVKLQQSGPGLVKPSQSLSLTCTVTGYSITSDYAWNWIRQFPGNKLEWMAYISYSGSTTYNPSLKSRISITRDTSKNQFFLQLNSVTTEDTAIYYCARGGTGFDYWGAGTTLTVSAAATTPPSVYPLAPGSATAAASMVTLGCLVKGYFPEPVTVTWNSGALSSGVHTFPAVLQSDLYTLSSSVTVPSSPWPSETVTCNVAHPASSTKVDKKIVPRD\n>1kcu_L\nDIVLTQSPKSMSMSVGEKVTLSCKASENVDTYVSWYQQRPEQPPALLIYGASNRYTGVPDRFTGSGSATDFTLTISSVQAEDLADYHCGQSYSYPLTFGGGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVANSWTAQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPVVKSFNRNEC\n>1kcv_H\nQVTLSQSGPGLVKPSQSLSLTCTVTSYSITSDYAWNWIRQFAGQSLEWMGYISYSGSTSYNPSLKSRISITRDTSKNQFFLQLNSVTTDDTATYYCARGGTGFPYWGTGTNVTVSAASTTAPSVFPLVPGSATAAASAVTLGCLVKGYFPEPVTVAWNEGALSSGVLTVSAVLQSGLYTLSSNTTVASGTWPSASVTCLVAHPKSSTAADKKIEPKD\n>1kcv_L\nDIVMTQSPKSMGMSVGEAVTLNCKASENVGTYVSWYQQKPGQSPVLLIYGASNRYTGVPDRFTGSGSATDFTLTISSVQADDDADYYCGQSYSSPLTFGGGTKLELKRADAAPTSSIFPPSSEQLSSGGASVVCFLNSFYPKSIAVKWKVDGSKRANGTANSWTDQDSASSTYSMSSTLTLTKDKYERHNSYTCEATHKTSSSPVVKSFNRNEC\n>1kcs_H\nQVTLSQSGPGLVKPSQSLSLTCTVTSYSITSDYAWNWIRQFAGQSLEWMGYISYSGSTSYNPSLKSRISITRDTSKNQFFLQLNSVTTDDTATYYCARGGTGFPYWGTGTNVTVSAASTTAPSVFPLVPGSATAAASAVTLGCLVKGYFPEPVTVAWNEGALSSGVLTVSAVLQSGLYTLSSNTTVASGTWPSASVTCLVAHPKSSTAADKKIEPKD\n>1kcs_L\nDIVMTQSPKSMGMSVGEAVTLNCKASENVGTYVSWYQQKPGQSPVLLIYGASNRYTGVPDRFTGSGSATDFTLTISSVQADDDADYYCGQSYSSPLTFGGGTKLELKRADAAPTSSIFPPSSEQLSSGGASVVCFLNSFYPKSIAVKWKVDGSKRANGTANSWTDQDSASSTYSMSSTLTLTKDKYERHNSYTCEATHKTSSSPVVKSFNRNEC\n>1kcr_H\nQVALQESGPGLVKPSQSLSLTCTVTGYSITSDYAWNWIRQFPGNKLEWMGYIRNGGSTTYNPSLASRISITRDTSKNQFFLQLNSVTTEDTATYYCARGGTGFTYWGAGTLVTVSAAATTPPSVYPLAPGSAAAAAAMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSALYTLSSSVTVPSSPRPSATVTCNVAHPASSTKVDKKIVPRDC\n>1kcr_L\nDIVLTQSPKSMSMSVGERVTLSCKASENVGTYVSWYQQKPEQSPKLLIYGASNRYTGVPDRFTGSGSATDFTLKISSVQAEDLADYHCGQTYSYPTFGGGTKLAIKRADAAPTVSIFPPSSEQLTAGGASVVCFLNNFYPKDINVKWKIDGSERQNGVANSWTAQDSADSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1fgv_H\nEVQLVESGGGLVQPGGSLRLSCATSGYTFTEYTMHWMRQAPGKGLEWVAGINPKNGGTSYADSVKGRFTISVDKSKNTLYLQMNSLRAEDTAVYYCARWRGLNYGFDVRYFDVWGQGTLVTVSS\n>1fgv_L\nDIQMTQSPSSLSASVGDRVTITCRASQDINNYLNWYQQKPGKAPKLLIYYTSTLESGVPSRFSGSGSGTDYTLTISSLQPEDFATYYCQQGNTLPPTFGAGTKVEIKRT\n>2vdr_H\nEVQLQQSGAELVKPGASVKLSCTASGFNIKDTYVHWVKQRPEQGLEWIGRIDPANGYTKYDPKFQGKATITADTSSNTAYLQLSSLTSEDTAVYYCVRPLYDYYAMDYWGQGTSVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTWPSQSITCNVAHPASSTKVDKKIEPRGP\n>2vdr_L\nDILMTQSPSSMSVSLGDTVSITCHASQGISSNIGWLQQKPGKSFMGLIYYGTNLVDGVPSRFSGSGSGADYSLTISSLDSEDFADYYCVQYAQLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2i5y_Q\nDIVMTQSPATLSVSPGERATLSCRASESVSSDLAWYQQKPGQAPRLLIYGASTRATGVPARFSGSGSGAEFTLTISSLQSEDFAVYYCQQYNNWPPRYTFGQGTRLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRG\n>2i5y_H\nEVQLVESGAEVKKPGSSVKVSCKASGDTFIRYSFTWVRQAPGQGLEWMGRIITILDVAHYAPHLQGRVTITADKSTSTVYLELRNLRSDDTAVYFCAGVYEGEADEGEYDNNGFLKHWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>4f33_A\nDIELTQSPAIMSASPGEKVTMTCSASSSVSYMHWYQQKSGTSPKRWIYDTSKLASGVPGRFSGSGSGNSYSLTISSVEAEDDATYYCQQWSKHPLTFGSGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>4f33_C\nDIELTQSPAIMSASPGEKVTMTCSASSSVSYMHWYQQKSGTSPKRWIYDTSKLASGVPGRFSGSGSGNSYSLTISSVEAEDDATYYCQQWSKHPLTFGSGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n>3cxd_H\nEVQLVESGGGLVQPKGSLKISCAASGFTFNIYAMNWVRQAPGKGLEWVARIRSQSNNYTTYYADSVKDRFTISRDDSQSMLYLQMNNLKTEDTAMYYCVRQMGDYWGQGTTLTVSSAVKTPPSVYPLAPGGGAISNSMVTLGCLVNGYFPEPVTVTWNAGSLGSGVHTFPAVLQSDLYTLSSSVTVPVSTWPSEAVTCNVAHPASATSVDKAISPV\n>3cxd_L\nYIQMTQSPASLSVSVGETVTITCRASENIYSFLAWYQQKQGKSPQLLVYAATNLADGVPSRFSGSGSGTQFSLKINSLQSEDFGTYYCQHFWGTPFTFGSGTKLEIKRSDAAPTVSIFPPSAAQLSSGGGSVVCFLNNFYPKDINVKWKIDGAERGNGVLNSWTSQDSADSTYSMSSTLTSGGDEYERHNSYTCEATHKTSTSPIVKSFNRAA\n>2i9l_A\nDMVMSQSPSSLAVSAGEKVSMSCKSSQTLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSYNLWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERAAGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>2i9l_C\nDMVMSQSPSSLAVSAGEKVSMSCKSSQTLLNSRTRKNYLAWYQQKPGQSPKLLIYWASTRESGVPDRFTGSGSGTDFTLTISSVQAEDLAVYYCKQSYNLWTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERAAGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>4ffy_H\nQVQLLQPGAELVKPGASMKLSCKASGYTFTNWWMHWVRLRPGRGLEWIGRIDPNSDVNKYNEKFENRASLTVDKHSSTAYMQLSSLTSEDSAIYYCARWFFPWYFDVWGTGTTVTVSSAASGADHHHHHH\n>4ffy_L\nNIVLTQSPASLAVSLGQRATISCRASESVDHYGNSFIYWYQQKPGQPPKLLIYLASNLESGVPARFSGSGSETDFTLTIDSVETDDAATYYCQQNNEDPYTFGGGTKLEIKGGGGSGGGGSGGGGS\n>4ffz_Y\nNIVLTQSPASLAVSLGQRATISCRASESVDHYGNSFIYWYQQKPGQPPKLLIYLASNLESGVPARFSGSGSETDFTLTIDSVETDDAATYYCQQNNEDPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRN\n>4ffz_H\nQVQLLQPGAELVKPGASMKLSCKASGYTFTNWWMHWVRLRPGRGLEWIGRIDPNSDVNKYNEKFENRASLTVDKHSSTAYMQLSSLTSEDSAIYYCARWFFPWYFDVWGTGTTVTVSSAKTTAPSVYPLAPVCGGTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPALLQSGLYTLSSSVTVTSNTWPSQTITCNVAHPASSTKVDKKIES\n>4ffv_H\nEFQLQQSGPELVKPGASVKISCKASGYSFTDYNINWMKQSNGKSLEWIGVVIPKYGTTNYNQKFQGKATLTVDQSSSTAYIQLNSLTSEDSAVYYCTRFRDVFFDVWGTGTTVTVSSAKTTAPSVYPLAPVCGGTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPALLQSGLYTLSSSVTVTSNTWPSQTITCNVAHPASSTKVDKKIVPR\n>4ffv_C\nQIVLSQSPAILSASPGEKVTMTCRASSSVNNMHWYQQKPGSSPKPWLHGTSNLASGVPVRFSGSGSGTSFSLTISRVEAEDAATYFCQQWSNHPPTFGGGTKLEIDRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>2kh2_B\nDIQMTQSPSSLSASVGDRVTITCRTSGNIHNYLTWYQQKPGKAPQLLIYNAKTLADGVPSRFSGSGSGTQFTLTISSLQPEDFANYYCQHFWSLPFTFGQGTKVEIKRTGGGGSGGGGSGGGGSGGGGSEVQLVESGGGLVQPGGSLRLSCAASGFDFSRYDMSWVRQAPGKRLEWVAYISSGGGSTYFPDTVKGRFTISRDNAKNTLYLQMNSLRAEDTAVYYCARQNKKLTWFDYWGQGTLVTVSSHHHHHH\n>2kh2_B\nDIQMTQSPSSLSASVGDRVTITCRTSGNIHNYLTWYQQKPGKAPQLLIYNAKTLADGVPSRFSGSGSGTQFTLTISSLQPEDFANYYCQHFWSLPFTFGQGTKVEIKRTGGGGSGGGGSGGGGSGGGGSEVQLVESGGGLVQPGGSLRLSCAASGFDFSRYDMSWVRQAPGKRLEWVAYISSGGGSTYFPDTVKGRFTISRDNAKNTLYLQMNSLRAEDTAVYYCARQNKKLTWFDYWGQGTLVTVSSHHHHHH\n>1ikf_H\nEVKLVESGGGLVQPGGSLKLSCATSGFTFSDYYMYWVRQNSEKRLEWVAFISNGGGSAFYADIVKGRFTISRDNAKNTLYLQMSRLKSEDTAMYYCTRHTLYDTLYGNYPVWFADWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSSRPSETVTCNVAHPASSTKVDKKIVPRDC\n>1ikf_L\nDIQMTQTTSSLSASLGDRVTISCRASQDISTYLNWYQQKPDGTVKLLIFYTSRLRSGVPSRFSGSGSGTDYSLTISNLEQEDIATYFCQQGSRIPPTFGGGTKLEILRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRAAC\n>3cxh_K\nDIELTQTPVSLAASLGDRVTISCRASQDINNFLNWYQQKPDGTIKLLIYYTSRLHAGVPSRFSGSGSGTDYSLTISNLEPEDIATYFCQHHIKFPWTFGAGTKLEIK\n>3cxh_J\nEVKLQESGAGLVQPSQSLSLTCSVTGYSITSGYYWNWIRLFPGNKLEWVGYISNVGDNNYNPSLKDRLSITRDTSKNQFFLKLNSVTTEDTATYYCARSEYYSVTGYAMDYWGQGTTVTVSSAWRHP\n>4ldl_B\nQVQLQESGGGLVQAGGSLRLSCAASGSIFALNIMGWYRQAPGKQRELVAAIHSGGTTNYANSVKGRFTISRDNAANTVYLQMNSLKPEDTAVYYCNVKDFGAIIYDYDYWGQGTQVTVSS\n>4ldo_B\nQVQLQESGGGLVQAGGSLRLSCAASGSIFALNIMGWYRQAPGKQRELVAAIHSGGTTNYANSVKGRFTISRDNAANTVYLQMNSLKPEDTAVYYCNVKDFGAIIYDYDYWGQGTQVTVSS\n>1hi6_A\nDIKMTQSPSSMYTSLGERVTITCKASQDINSFLTWFLQKPGKSPKTLIYRANRLMIGVPSRFSGSGSGQTYSLTISSLEYEDMGIYYCLQYDDFPLTFGAGTKLDLKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKEINVKWKIDGSERQNGVLDSWTEQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC\n>1hi6_B\nQDQLQQSGAELVRPGASVKLSCKALGYIFTDYEIHWVKQTPVHGLEWIGGIHPGSSGTAYNQKFKGKATLTADKSSTTAFMELSSLTSEDSAVYYCTRKDYWGQGTLVTVSAAKTTAPSVYPLVPVCGGTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPALLQSGLYTLSSSVTVTSNTWPSQTITCNVAHPASSTKVDKKIEPRV\n>4lde_B\nQVQLQESGGGLVQAGGSLRLSCAASGSIFALNIMGWYRQAPGKQRELVAAIHSGGTTNYANSVKGRFTISRDNAANTVYLQMNSLKPEDTAVYYCNVKDFGAIIYDYDYWGQGTQVTVSS\n>3vrl_H\nDVKLVESGGGLVKPGGSLKLSCAASGFTFSSYTMSWVRQTPEKRLEWVAIISSGGSYTYYSDSVKGRFTISRDNAKNTLYLQMSSLKSEDTAMYYCTRDEGNGNYVEAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>3vrl_E\nDVKLVESGGGLVKPGGSLKLSCAASGFTFSSYTMSWVRQTPEKRLEWVAIISSGGSYTYYSDSVKGRFTISRDNAKNTLYLQMSSLKSEDTAMYYCTRDEGNGNYVEAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPRDC\n>4k4m_I\nGPAATVWTELVKPGTSVKISCKTSGYTFTENTMHWVKQSHGESLDWVGGINTDNGGTTYSQKFKGKATLTVDKSSSTAYMELRSLTSEDSAVYYCSTGYDAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>4k4m_H\nGPAATVWTELVKPGTSVKISCKTSGYTFTENTMHWVKQSHGESLDWVGGINTDNGGTTYSQKFKGKATLTVDKSSSTAYMELRSLTSEDSAVYYCSTGYDAMDYWGQGTSVTVSSAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>4hpo_H\nEVQLVQSGAEVKKPGESLKISCKGSGYRFTSYWIVWVRQMPGKGLEWMGIIYPGDFDTKYSPSFQGQVTISADKSISTAYLQWSSLKASDTAMYYCARLGGRYYHDSSGYYYLDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>4hpo_L\nNFMLTQPHSVSESPGKTVTISCTRSSGSVASDYVQWYQQRPGSAPTTVVYEDNQRPSGVPDRFSGSIDSSSNSASLTISGLKTEDEADYYCQSYDNSSWVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>1dsf_H\nQLVESGGGLVKPGGSLKLSCAASGFIFSDNYMYWVRQTPEKCLEWVATISDGGTYIDYSDSVKGRFTISRDNAKNNLYLQMSSLRSEDTGMYYCGRSPIYYDYAPFTYWGQGTLVTVSA\n>1dsf_L\nDVVMTQTPLSLPVSLGDQASISCRSSQNLVHSDGKTYLHWFLQKPGQSPTLLIYKVSNRFSGVPDRFSGSGSGTDFILKISRVEAEDLGVYFCSQSTHVPLTFGCGTKLELK\n>3wfb_H\nEVQLQQSGTVLARPGASVKMSCKASGYSFTSYWMHWVKQRPGQGLEWIGAVYPGNSDTSYNQKFKGKAKLTAVTSASTAYMELSSLTNEDSAVYYCSRSSLDGYYVKNWCFDVWGQGTTVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTRPSQSITCNVAHPASSTKVDKKIEPRG\n>3wfb_L\nDIQMTQSPPYLAASPGETITINCRASKSIRKYLAWYQEKPGKTNKLLIYSGSTLQFGIPSRFSGSGSGTEFTLTISSLEPEDFAMYYCQQHNEYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3wfc_H\nEVQLQQSGTVLARPGASVKMSCKASGYSFTSYWMHWVKQRPGQGLEWIGAVYPGNSDTSYNQKFKGKAKLTAVTSASTAYMELSSLTNEDSAVYYCSRSSLDGYYVKNWCFDVWGQGTTVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTRPSQSITCNVAHPASSTKVDKKIEPRG\n>3wfc_L\nDIQMTQSPPYLAASPGETITINCRASKSIRKYLAWYQEKPGKTNKLLIYSGSTLQFGIPSRFSGSGSGTEFTLTISSLEPEDFAMYYCQQHNEYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3wfd_H\nEVQLQQSGTVLARPGASVKMSCKASGYSFTSYWMHWVKQRPGQGLEWIGAVYPGNSDTSYNQKFKGKAKLTAVTSASTAYMELSSLTNEDSAVYYCSRSSLDGYYVKNWCFDVWGQGTTVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTRPSQSITCNVAHPASSTKVDKKIEPRG\n>3wfd_L\nDIQMTQSPPYLAASPGETITINCRASKSIRKYLAWYQEKPGKTNKLLIYSGSTLQFGIPSRFSGSGSGTEFTLTISSLEPEDFAMYYCQQHNEYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3wfe_H\nEVQLQQSGTVLARPGASVKMSCKASGYSFTSYWMHWVKQRPGQGLEWIGAVYPGNSDTSYNQKFKGKAKLTAVTSASTAYMELSSLTNEDSAVYYCSRSSLDGYYVKNWCFDVWGQGTTVTVSSAKTTAPSVYPLAPVCGDTTGSSVTLGCLVKGYFPEPVTLTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVTSSTRPSQSITCNVAHPASSTKVDKKIEPRG\n>3wfe_L\nDIQMTQSPPYLAASPGETITINCRASKSIRKYLAWYQEKPGKTNKLLIYSGSTLQFGIPSRFSGSGSGTEFTLTISSLEPEDFAMYYCQQHNEYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNE\n>3wfh_A\nKVQLQQSGAELVKPGASVKLSCKASGYTFTEYFIHWVKQRSGQGLEWIGWFYPGSGSLNYNGKFKDKATFTADKSSSTVYLELSRLTSEDSAVYFCASHAYDKEPYWGQGTLVTVSAAKTTPPSVYPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSTWPSETVTCNVAHPASSTKVDKKIVPR\n>3wfh_B\nDVLMTQTPLSLPVSLGDQASISCRSSQSIVHSNGNTYLEWYLQKPGQSPKLLIYKVSNRFSGVPDRFSGSGSGTDFTLKINRVEAEDLGIYYCLQGSHVPLTFGAGTTLELKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNR\n>3lrh_A\nMGSQPVLTQSPSVSAAPRQRVTISVSGSNSNIGSNTVNWIQQLPGRAPELLMYDDDLLAPGVSDRFSGSRSGTSASLTISGLQSEDEADYYAATWDDSLNGWVFGGGTKVTVLSAHHHHHH\n>3lrh_C\nMGSQPVLTQSPSVSAAPRQRVTISVSGSNSNIGSNTVNWIQQLPGRAPELLMYDDDLLAPGVSDRFSGSRSGTSASLTISGLQSEDEADYYAATWDDSLNGWVFGGGTKVTVLSAHHHHHH\n>3bj9_1\nVLHQPPAMSSALGTTIRLTCTLRNDHDIGVYSVYWYQQRPGHPPRFLLRYFSQSDKSQGPQVPPRFSGSKDVARNRGYLSISELQPEDEAMYYCAMGARSTHVFGSGTQLTVLSAA\n>3lrs_A\nQEQLVESGGGVVQPGGSLRLSCLASGFTFHKYGMHWVRQAPGKGLEWVALISDDGMRKYHSDSMWGRVTISRDNSKNTLYLQFSSLKVEDTAMFFCAREAGGPIWHDDVKYYDFNDGYYNYHYMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>3lrs_C\nQEQLVESGGGVVQPGGSLRLSCLASGFTFHKYGMHWVRQAPGKGLEWVALISDDGMRKYHSDSMWGRVTISRDNSKNTLYLQFSSLKVEDTAMFFCAREAGGPIWHDDVKYYDFNDGYYNYHYMDVWGKGTTVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPK\n>1r24_A\nDIQMTQITSSLSVSLGDRVIISCRASQDIGNFLNWYQQKPDGSLKLLIYYTSRLQSGVPSRFSGWGSGTDYSLTISNLEEEDIATFFCQQGKTLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIV\n>1r24_C\nDIQMTQITSSLSVSLGDRVIISCRASQDIGNFLNWYQQKPDGSLKLLIYYTSRLQSGVPSRFSGWGSGTDYSLTISNLEEEDIATFFCQQGKTLPYTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIV\n>4hpy_H\nEVQLVESGGGLVQPGRSLRLSCAASGFTFDDGAMHWVRQAPGKGLEWVSGISWNSNIIAYADSVKGRFTISRDNAKNSLYLEMNSLRVEDTALYYCAKDSPRGELPLNYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKRVEPKSCDK\n>4hpy_L\nDSYELTQPPSVSVSPGQTARITCSGDALPKNYAYWYQQKSGQAPVLVIYEDSKRPSGIPERFSGSSSGTMATLTISGAQVEDEADYYCYSTDSSGNHRVFGGGTKLTVLGQPKAAPSVTLFPPSSEELQANKATLVCLISDFYPGAVTVAWKADSSPVKAGVETTTPSKQSNNKYAASSYLSLTPEQWKSHRSYSCQVTHEGSTVEKTVAPTECS\n>2qad_H\nEVQLVQSGAEVKKPGSSVKVSCKASGGTFSNYAINWVRQAPGQGLEWMGGIIPIFNIAHYAQRFQGRVSITADESTSTAYMELSSLRSEDTAVFYCASPYPNDYNDYAPEEGMSWYFDLWGRGTLVTVSPASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>2qad_C\nDIQMTQSPSTLSASVGDRVTITCRASQSISNWLAWYQQKPGRAPKLLMYKASSLKSGVPSRFSGSGSGTEFTLTISSLQSDDFATYYCQQHDSSPYTFGQGTKLEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKLYACEVTHQGLSSPVTKSFNRGEC\n>3ivk_A\nSEVQLVESGGGLVQPGGSLRLSCAASGFYISYSSIHWVRQAPGKGLEWVASISPYSGSTYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARQGYRRRSGRGFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>3ivk_H\nSEVQLVESGGGLVQPGGSLRLSCAASGFYISYSSIHWVRQAPGKGLEWVASISPYSGSTYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARQGYRRRSGRGFDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPK\n>1bey_H\nQVQLQESGPGLVRPSQTLSLTCTVSGFTFTDFYMNWVRQPPGRGLEWIGFIRDKAKGYTTEYNPSVKGRVTMLVDTSKNQFSLRLSSVTAADTAVYYCAREGHTAAPFDYWGQGSLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKV\n>1bey_L\nDIQMTQSPSSLSASVGDRVTITCKASQNIDKYLNWYQQKPGKAPKLLIYNTNNLQTGVPSRFSGSGSGTDFTFTISSLQPEDIATYYCLQHISRPRTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC\n"
  },
  {
    "path": "Example_scripts_and_sequences/lysozyme.fasta",
    "content": ">2LYZ:A|PDBID|CHAIN|SEQUENCE\nKVFGRCELAAAMKRHGLDNYRGYSLGNWVCAAKFESNFNTQATNRNTDGSTDYGILQINSRWWCNDGRTPGSRNLCNIPC\nSALLSSDITASVNCAKKIVSDGNGMNAWVAWRNRCKGTDVQAWIRGCRL\n"
  },
  {
    "path": "Example_scripts_and_sequences/run_numbering_benchmark.sh",
    "content": "\n# Demo script to run benchmark numbering runs.\n# ANARCI can be run to generate multiple sequence alignments in csv format according to a chosen numbering scheme.\n# Parallel processing is enabled by the --ncpu option. \n\nOUTDIR='/tmp'\nNCPU=4\n\n# Expect < 5 minutes per run with 4 processes on a desktop. ~10,000 sequences all of which are numbered. \ntime ANARCI -i pdb_sequences.fa.txt.gz -s i --csv -o $OUTDIR/pdb_imgt --ncpu $NCPU --assign_germline\ntime ANARCI -i pdb_sequences.fa.txt.gz -s k --csv -o $OUTDIR/pdb_kabat --ncpu $NCPU --assign_germline\ntime ANARCI -i pdb_sequences.fa.txt.gz -s c --csv -o $OUTDIR/pdb_chothia --ncpu $NCPU --assign_germline\ntime ANARCI -i pdb_sequences.fa.txt.gz -s m --csv -o $OUTDIR/pdb_martin --ncpu $NCPU --assign_germline\ntime ANARCI -i pdb_sequences.fa.txt.gz -s a --csv -o $OUTDIR/pdb_aho --ncpu $NCPU --assign_germline \ntime ANARCI -i pdb_sequences.fa.txt.gz -s w --csv -o $OUTDIR/pdb_wolfguy --ncpu $NCPU --assign_germline\n\n"
  },
  {
    "path": "INSTALL",
    "content": "########################\n# ANARCI INSTALLATION  #\n########################\n\nRequirements:\n    - HMMER3 version 3.1 or higher - http://hmmer.janelia.org/ \n\t- Biopython\n\nTo install, simply run:\n\npython setup.py install\n\nDuring the installation process, germline data will be downloaded from IMGT/GENE-DB and used to build hidden Markov models.\n\nFor more information about installing python programs see:\nhttps://docs.python.org/2/install/#alternate-installation-the-user-scheme\n\nFor help see README or run:\n$ ANARCI -h\n"
  },
  {
    "path": "LICENCE",
    "content": "Copyright 2019 Charlotte Deane, James Dunbar, Alexsandr Kovaltsuk, Claire Marks\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "LICENCE_MUSCLE",
    "content": "MUSCLE is public domain software\nThe MUSCLE software, including object and source code and documentation, is donated to the public domain. You may therefore freely copy it for any legal purpose you wish. Acknowledgement of authorship and citation in publications is appreciated.\n\nDisclaimer of warranty\nTHIS SOFTWARE IS PROVIDED \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. \n"
  },
  {
    "path": "README.md",
    "content": "```\nANARCI                                                 \\\\    //\nAntibody Numbering and Antigen Receptor ClassIfication  \\\\  //\n                                                          ||\n(c) Oxford Protein Informatics Group (OPIG). 2015-20      ||\n\nAuthor: James Dunbar (dunbar@stats.ox.ac.uk)\n        Charlotte Deane (deane@stats.ox.ac.uk)\n\nContact: opig@stats.ox.ac.uk\n\n```\n\n# Usage:\n\n* Numbering a single sequence\n```python\nANARCI -i EVQLQQSGAEVVRSGASVKLSCTASGFNIKDYYIHWVKQRPEKGLEWIGWIDPEIGDTEYVPKFQGKATMTADTSSNTAYLQLSSLTSEDTAVYYCNAGHDYDRGRFPYWGQGTLVTVSA\n```\n\n* Numbering sequences in a FASTA file\n\n```python\nANARCI -i myfile.fasta \n```\n\n* Please note that while ANARCI uses alignment to species V and J germlines to determine the species of the antibody for purposes of numbering, we do not recommend using ANARCI as your primary species annotation tool\n\n# Installation\n\nThe easiest way to install ANARCI and its dependencies is using conda\n\n```python\nconda install -c conda-forge biopython -y\nconda install -c bioconda hmmer=3.3.2 -y\ncd ANARCI\npython setup.py install\n```\n\n# Further info\n\n## Output files\n\n* The numbering file.\n\nThe numbering file (`--outfile` or stdout) reports the numbering for all sequences given in the sequence file. Each record is separated by \"//\".\nThose chains for which no significant alignment was found report the name as in the fasta file. e.g:\n\n```    \n# 1A14:N|PDBID|CHAIN|SEQUENCE\n//\n     \n    Those sequences where a significant alignment has been found report as below: \n    \n# 1A14:H|PDBID|CHAIN|SEQUENCE\n# ANARCI numbered\n# Domain 1 of 1\n# Most significant HMM hit\n#|species|chain_type|e-value|score|seqstart_index|seqend_index|\n#|mouse|H|8.6e-58|184.9|0|119|\n# Scheme = imgt\nH 1       Q\nH 2       V\nH 3       Q\nH 4       L\nH 5       Q\n  . \n  .\n  .\n//\n\n    where:\n    species          = The species of the most significant aligned HMM\n    chain_type       = The chain type of the most significant aligned HMM\n    e-value          = The e-value of the alignment to the most significant aligned HMM\n    score            = The bit-score of the alignment to the most significant aligned HMM\n    seqstart_index   = The index in the sequence of the first numbered residue\n    seqend_index     = The index in the sequence of the last numbered residue\n    Scheme           = The numbering scheme used to number the sequence\n    \n    Then follows the numbering. Chain type (H, L (for both kappa(K) and lambda(L) chain types) , A (alpha), B (beta))\n\n    If the \"assign_germline\" option has been specified the further following lines are added to the header. e.g.\n\n# Most sequence-identical germlines\n#|species|v_gene|v_identity|j_gene|j_identity|\n#|mouse|IGHV1-12*01|0.86|IGHJ2*01|0.79|\n\n    where:\n    species          = The species of the most sequence identical germline\n    v_gene           = The identifier of the most sequence identical germline over the v-region\n    v_identity       = The sequence identity over the v-region to the most sequence identical germline\n    j_gene           = The identifier of the most sequence identical germline over the j-region\n    j_identity       = The sequence identity over the j-region to the most sequence identical germline\n```\n\n* The csv format output file.\n\n    When the `--csv` option is specified, numbered sequences are output into separate comma separated value files depending on their\n    chain type. This provides a horizontal output format and contains all the properties detailed above. In addition, sequences \n    are aligned according to the numbering scheme. \n\n\n* The hit file.\n\n    The hit file reports the statistics for all alignments to each HMM in the database even if the sequence was not numbered.\n    Each record is separated by \"//\". \n    \n    The corresponding hit table for the numbered entry above looks like:\n\n```    \n    \"\"\"\n        NAME     1a14_H mol:protein length:120  NC10 FV (HEAVY CHAIN)\n    SEQUENCE QVQLQQSGAELVKPGASVRMSCKASGYTFTNYNMYWVKQSPGQGLEWIGIFYPGNGDTSYNQKFKDKATLT\n    SEQUENCE ADKSSNTAYMQLSSLTSEDSAVYYCARSGGSYRYDGGFDYWGQGTTVTV\n                   id       description            evalue          bitscore              bias   best_dom_evalue best_dom_bitscore     best_dom_bias    domain_exp_num    domain_obs_num\n              mouse_H                             1.1e-57             184.5               1.5           1.3e-57             184.4               1.5               1.0                 1\n              human_H                             7.8e-53             169.0               1.9           8.7e-53             168.8               1.9               1.0                 1\n                rat_H                             4.7e-47             150.2               2.2           5.2e-47             150.0               2.2               1.0                 1\n             rabbit_H                             3.7e-37             118.2               0.7             4e-37             118.1               0.7               1.0                 1\n                pig_H                             1.5e-35             113.3               2.7           1.6e-35             113.1               2.7               1.0                 1\n             rhesus_H                             4.4e-32             101.5               1.8           4.9e-32             101.4               1.8               1.0                 1\n              mouse_B                             2.4e-19              60.6               0.7           2.6e-19              60.5               0.7               1.0                 1\n              human_B                             4.2e-19              59.7               0.9           4.6e-19              59.5               0.9               1.0                 1\n              mouse_A                             8.7e-19              58.5               1.1           9.6e-19              58.4               1.1               1.0                 1\n              human_A                             1.7e-18              57.6               0.9           1.9e-18              57.5               0.9               1.0                 1\n              mouse_D                             5.1e-17              53.3               0.7           5.9e-17              53.1               0.7               1.1                 1\n             rhesus_L                             1.6e-16              51.7               2.7           1.9e-16              51.4               2.7               1.1                 1\n              human_L                             1.7e-15              48.3               3.5             2e-15              48.0               3.5               1.1                 1\n              human_D                             6.7e-15              46.1               0.2           7.4e-15              45.9               0.2               1.0                 1\n             rhesus_K                             3.9e-13              40.6               1.7           5.1e-13              40.2               1.7               1.2                 1\n              mouse_G                             4.1e-13              40.3               0.0           4.3e-13              40.2               0.0               1.0                 1\n             rabbit_L                             6.1e-13              40.0               2.8           8.1e-13              39.6               2.8               1.2                 1\n                rat_K                             3.9e-12              37.4               1.4           4.4e-12              37.2               1.4               1.1                 1\n                pig_L                             4.2e-12              37.5               1.0           4.7e-12              37.3               1.0               1.1                 1\n              mouse_K                             1.2e-11              35.7               2.6           1.3e-11              35.6               2.6               1.1                 1\n              human_K                             2.2e-11              34.8               2.9           3.5e-11              34.2               2.9               1.4                 1\n              mouse_L                             1.9e-10              31.8               2.2           3.4e-10              30.9               2.2               1.4                 1\n                rat_L                             2.5e-10              31.7               1.2           2.9e-10              31.5               1.2               1.1                 1\n                pig_K                             3.2e-10              31.1               1.9           4.5e-10              30.6               1.9               1.3                 1\n              human_G                             2.9e-09              27.8               0.8           4.9e-09              27.1               0.8               1.4                 1\n             rabbit_K                             2.5e-06              18.4               5.8           4.2e-06              17.7               5.8               1.4                 1\n    //\n    \"\"\"\n\n```\n\nWe therefore get a ranking of the alignments to each chain type. \n\n## Schemes:\n\n    \n* Currently implemented schemes: \n    IMGT\n    Chothia (IGs only)\n    Kabat (IGs only)\n    Martin / Enhanced Chothia (IGs only)\n    AHo \n    Wolfguy (IGs only)\n        \n* Currently recognisable species (chains):\n    Human (heavy, kappa, lambda, alpha, beta)\n    Mouse (heavy, kappa, lambda, alpha, beta)\n    Rat (heavy, kappa, lambda)\n    Rabbit (heavy, kappa, lambda)\n    Pig (heavy, kappa, lambda)\n    Rhesus Monkey (heavy, kappa)\n    \nOther species may still be numbered correctly and the chain type recognised but the species be incorrect. e.g. llama VHH.\n\n\n* IMGT     - has 128 possible positions for *all* antigen receptor types. These are supposed to be structurally equivalent.\n            In theory these are supposed to account for all possible positions. However, insertions are possible especially\n            at CDR3. ANARCI gives the insertion codes as letters. Insertions at CDR3 are placed symmetrically about imgt\n            positions 111 and 112. e.g. 111-ABCD DCBA-112. \n            \n* Kabat    - is defined for heavy and light chain antibody chains only (in ANARCI). Positions in the two chain types are not\n            equivalent. Insertions occur at specific positions and can occur in both the framework and the CDRs. They are\n            annotated from A->Z. e.g 100ABCDEFGH 101.       \n\n* Chothia  - is defined for heavy and light chain antibody chains only (in ANARCI). Numbering in the two chain types are not\n            equivalent. Insertions occur at specific positions and can occur in both the framework and the CDRs. They are\n            annotated from A->Z. e.g 100ABCDEFGH 101. It differs to the Kabat scheme by the position it places the insertions\n            at CDRH1.   \n\n* Martin   - is defined for heavy and light chain antibody chains only. Numbering in the two chain types are not equivalent. \n            Insertions occur at specific positions and can occur in both the framework and the CDRs. They are annotated from\n            A->Z. e.g 100ABCDEFGH 101. It differs to the Chothia scheme by the position it places the certain insertions in\n            the framework. It is also referred to as the enhanced Chothia scheme.\n\n* AHo      - has 149 possible for *all* antigen receptor types. These are supposed to be structurally equivalent. The AHo\n            scheme's large number of positions is supposed to account for all possible positions without the need for \n            specifying insertion positions. In ANARCI, extra residues in the framework may be represented by insertions\n            although these are unlikely to occur in natural sequences.\n\n* Wolfguy  - is defined for heavy and light antibody chains. Numbering in the two chain types are not equivalent. Different \n            regions of the domain are denoted by a range of numbers. Many possible positions in the CDRs mean that insertion\n            codes are not required. In ANARCI, extra residues in the framework may be represented by insertions\n            although these are unlikely to occur in natural sequences. The CDRs are numbered in an 'up' and 'down' direction.\n            The annotations of CDRL1 is defined according to the canonical structure. In ANARCI this is recognised by taking\n            a sequence similarity to hard coded sequence motifs for different lengths.\n\n"
  },
  {
    "path": "bin/ANARCI",
    "content": "#! /usr/bin/env python\n#    ANARCI - Antibody Numbering and Antigen Receptor ClassIfication\n#    Copyright (C) 2016 Oxford Protein Informatics Group (OPIG)\n#\n#    This program is free software: you can redistribute it and/or modify\n#    it under the terms of the BSD 3-Clause License.\n#\n#    You should have received a copy of the BSD 3-Clause Licence\n#    along with this program.  If not, see <https://opensource.org/license/bsd-3-clause/>.\n\ndescription='''\n\nANARCI                                                 \\\\\\    //\nAntibody Numbering and Antigen Receptor ClassIfication  \\\\\\  //\n                                                          ||\n(c) Oxford Protein Informatics Group (OPIG). 2015-17      ||\n\nUsage:\n\nANARCI -i <inputsequence or fasta file>\n\nRequirements:\n -  HMMER3 version 3.1b1 or higher - http://hmmer.janelia.org/ \n\ne.g. \n    ANARCI -i Example_sequence_files/12e8.fasta \n    This will number the files in 12e8.fasta with imgt numbering scheme and print to stdout.\n\n    ANARCI -i Example_sequence_files/sequences.fasta -o Numbered_sequences.anarci -ht hit_tables.txt -s chothia -r ig \n    This will number the files in sequences.fasta with chothia numbering scheme only if they are an antibody chain (ignore TCRs).\n    It will put the numbered sequences in Numbered_sequences.anarci and the alignment statistics in hit_tables.txt\n    \n    ANARCI -i Example_sequence_files/lysozyme.fasta\n    No antigen receptors should be found. The program will just list the names of the sequences. \n\n    ANARCI -i EVQLQQSGAEVVRSGASVKLSCTASGFNIKDYYIHWVKQRPEKGLEWIGWIDPEIGDTEYVPKFQGKATMTADTSSNTAYLQLSSLTSEDTAVYYCNAGHDYDRGRFPYWGQGTLVTVSA\n    Or just give a single sequence to be numbered. \n'''\n\nepilogue='''\nAuthor: James Dunbar (dunbar@stats.ox.ac.uk)\n        Charlotte Deane (deane@stats.ox.ac.uk)\n\nContact: opig@stats.ox.ac.uk\n\nCopyright (C) 2017 Oxford Protein Informatics Group (OPIG)\nFreely distributed under the BSD 3-Clause Licence.\n'''\nimport os\n\ndef which(name, flags=os.X_OK):\n    \"\"\"\n    Search PATH for executable files with the given name.\n   \n    On newer versions of MS-Windows, the PATHEXT environment variable will be\n    set to the list of file extensions for files considered executable. This\n    will normally include things like \".EXE\". This fuction will also find files\n    with the given name ending with any of these extensions.\n\n    On MS-Windows the only flag that has any meaning is os.F_OK. Any other\n    flags will be ignored.\n   \n    @type name: C{str}\n    @param name: The name for which to search.\n   \n    @type flags: C{int}\n    @param flags: Arguments to L{os.access}.\n   \n    @rtype: C{list}\n    @param: A list of the unique full paths to files found, in the\n    order in which they were found.\n    \"\"\"\n    result = []\n    exts = [_f for _f in os.environ.get('PATHEXT', '').split(os.pathsep) if _f]\n    path = os.environ.get('PATH', None)\n    if path is None:\n        return []\n    for p in os.environ.get('PATH', '').split(os.pathsep):\n        p = os.path.join(p, name)\n        if os.access(p, flags):\n            result.append(p)\n        for e in exts:\n            pext = p + e\n            if os.access(pext, flags):\n                result.append(pext)\n    return list(set(result))\n  \nif __name__ == \"__main__\":\n    import argparse, sys\n    try: # Import the anarci functions.\n        from anarci import scheme_names, wrap , all_species, run_anarci\n    except ImportError as e:\n        print(\"Fatal Error:\", e, file=sys.stderr)\n        sys.exit(1)\n\n    parser = argparse.ArgumentParser(prog=\"ANARCI\", description=description, epilog=epilogue,formatter_class=argparse.RawDescriptionHelpFormatter)\n    parser.add_argument( '--sequence','-i', type=str, help=\"A sequence or an input fasta file\", dest=\"inputsequence\")\n    parser.add_argument( '--outfile','-o', type=str, default=False, help=\"The output file to use. Default is stdout\", dest=\"outfile\")\n    parser.add_argument( '--scheme','-s', type=str, choices=scheme_names, default=\"imgt\", help=\"Which numbering scheme should be used. i, k, c, m, w and a are shorthand for IMGT, Kabat, Chothia, Martin (Extended Chothia), Wolfguy and Aho respectively. Default IMGT\", dest=\"scheme\")\n    parser.add_argument( '--restrict','-r', type=str, nargs=\"+\", choices=[\"ig\",\"tr\",\"heavy\", \"light\", \"H\", \"K\", \"L\", \"A\", \"B\"], default=False, help=\"Restrict ANARCI to only recognise certain types of receptor chains.\", dest=\"restrict\")    \n    parser.add_argument( '--csv', action='store_true', default=False, help=\"Write the output in csv format. Outfile must be specified. A csv file is written for each chain type <outfile>_<chain_type>.csv. Kappa and lambda are considered together.\", dest=\"csv\")\n    parser.add_argument( '--outfile_hits','-ht', type=str, default=False, help=\"Output file for domain hit tables for each sequence. Otherwise not output.\", dest=\"hitfile\")\n    parser.add_argument( '--hmmerpath','-hp', type=str, default=\"\", help=\"The path to the directory containing hmmer programs. (including hmmscan)\", dest=\"hmmerpath\")\n    parser.add_argument( '--ncpu','-p', type=int, default=1, help=\"Number of parallel processes to use. Default is 1.\", dest=\"ncpu\")\n    parser.add_argument( '--assign_germline', action = 'store_true', default=False, help=\"Assign the v and j germlines to the sequence. The most sequence identical germline is assigned.\", dest=\"assign_germline\")\n    parser.add_argument( '--use_species', type=str, help=\"Use a specific species in the germline assignment. If not specified, only human and mouse germlines will be considered.\", choices=all_species, dest=\"use_species\")\n    parser.add_argument( '--bit_score_threshold', type=int, default=80, help=\"Change the bit score threshold used to confirm an alignment should be used.\", dest=\"bit_score_threshold\")\n\n    args = parser.parse_args()\n\n    ######################\n    # Input housekeeping #\n    ######################\n    if len(sys.argv) <2:\n        parser.print_help()\n        sys.exit(0)\n        \n    outfile = False\n    if args.outfile:\n        path, fname = os.path.split(args.outfile)\n        if (not path) or os.path.exists(path):\n            outfile = args.outfile\n        else:\n            print(\"Error: Output file path does not exist\", file=sys.stderr)\n            sys.exit(1)\n\n    if args.csv and not args.outfile:\n        print(\"Error: When --csv option is used an ouput file name must be given.\", file=sys.stderr)\n        sys.exit(1)\n        \n\n    hitfile = False\n    if args.hitfile:\n        path, fname = os.path.split(args.hitfile)\n        if (not path) or os.path.exists(path):\n            hitfile = args.hitfile\n        else:\n            print(\"Error: Hit output file path does not exist\", file=sys.stderr)\n            sys.exit(1)\n    \n    # Check that hmmscan can be found in the path\n    if args.hmmerpath:\n        hmmerpath=args.hmmerpath\n        scan_path = os.path.join( hmmerpath, \"hmmscan\" )\n        if not ( os.path.exists( scan_path ) and os.access(scan_path, os.X_OK)):\n            print(\"Error: No hmmscan executable file found in directory: %s\"%(hmmerpath), file=sys.stderr)\n            sys.exit(1)\n    elif not which(\"hmmscan\"):\n        print(\"Error: hmmscan was not found in the path. Either install and add to path or provide path with commandline option.\", file=sys.stderr)\n        sys.exit(1)\n    \n    \n    # Check if there should be some restriction as to which chain types should be numbered.\n    # If it is not the imgt scheme they want then restrict to only igs (otherwise you'll hit assertion errors)\n    types_to_chains = {\"ig\":[\"H\",\"K\",\"L\"], \"tr\":[\"A\", \"B\",\"G\",\"D\"], \"heavy\":[\"H\"], \"light\":[\"K\",\"L\"] }\n    if args.restrict:\n        allow = []\n        for r in args.restrict:\n            try:\n                allow += types_to_chains[r]\n            except KeyError:\n                allow.append(r)\n        allow = set(allow)\n    else:\n        allow = set([\"H\",\"K\",\"L\",\"A\",\"B\",\"G\",\"D\"])\n    if args.scheme not in (\"imgt\",\"i\", \"aho\",\"a\") and allow - set([\"H\",\"K\",\"L\"]):\n        print(\"Warning: Non IG chains cannot be numbered with the %s scheme. These will be ignored.\"%args.scheme, file=sys.stderr)\n        allow = allow - set([\"A\",\"B\",\"G\",\"D\"])\n        \n    allowed_species = ['human', 'mouse']\n    \n    if args.use_species:\n        assert args.use_species in all_species, 'Unknown species'\n        allowed_species = [args.use_species]\n    \n    \n    ###########################\n    # Do numbering and output #\n    ###########################\n    try:\n        sequences, numbered, alignment_details, hit_tables =  run_anarci(args.inputsequence, scheme=args.scheme, output=True, \n                                                          outfile=outfile, csv=args.csv, allow=allow, ncpu=args.ncpu, \n                                                          assign_germline=args.assign_germline, allowed_species=allowed_species, \n                                                          bit_score_threshold=args.bit_score_threshold )\n\n        if hitfile:\n            with open( hitfile, \"w\") as outfile:\n                print(\"# Hit file for ANARCI\", file=outfile)\n                for i in range(len(sequences)):\n                    name, sequence = sequences[i]\n                    print(\"NAME    \", name, file=outfile)\n                    print(\"SEQUENCE \"+'\\n'.join(['\\nSEQUENCE '.join(wrap(block, width=71)) for block in sequence.splitlines()]), file=outfile)\n                    \n                    pad = max(list(map( len, hit_tables[i][0] )) )\n                    for line in hit_tables[i]:\n                        print(\" \".join( [ str(_).rjust(pad) for _ in line  ]), file=outfile)\n                    print(\"//\", file=outfile)\n    except Exception as e:\n        # An error occurred. Report to screen and die gracefully.            \n        print(\"Error: \", e, file=sys.stderr)\n        sys.exit(1)\n        \n    sys.exit(0)\n\n\n\n"
  },
  {
    "path": "build_pipeline/FastaIO.py",
    "content": "#!/usr/bin/env python\n\n\"\"\"\nCustom class to parse FASTA files.\n@author J. Leem\njinwoo.leem [~at~] gmail.com\n\"\"\"\n\ndef chunkify(fh):\n    \"\"\" Divides FASTA files into chunks. \"\"\"\n    chunk = \"\"\n    chunk_start = False\n    description, seq = \"\", \"\"\n\n    for line in fh:\n        line = line.strip()\n\n        # Skip over empty lines.\n        if not line:\n            continue\n\n        # FASTA records always start with \">\"\n        # Case 1: No chunk has ever been defined\n        #         so we start a new one.\n        if line[0] == \">\" and not chunk_start:\n            chunk_start = True\n            description = line[1:]\n            continue\n\n        # Case 2: We have found at least one chunk,\n        #         so let's yield a FASTARecord object when we see the next \">\"\n        elif line[0] == \">\" and chunk_start:\n            yield FASTARecord( description, chunk )\n\n            # Now it's a new record, so start a new description\n            # Wipe out the existing sequence.\n            description = line[1:]\n            chunk = \"\"\n\n        elif line[0] != \">\" and chunk_start:\n            chunk += line\n\n    yield FASTARecord( description, chunk )\n\nclass FASTARecord(object):\n    def __init__(self, description, seq):\n        self.description = description.strip(\">\")\n        self.seq = seq\n"
  },
  {
    "path": "build_pipeline/FormatAlignments.py",
    "content": "\"\"\"\nProgram to reformat the v and j alignments for each species into a single alignment\nwith combinations of the two genes.\n\nv genes will be trimmed to imgt position 107 ( three after the cysteine at 104 )\n\nj genes are a little bit more complicated as they are not aligned.\n\nWe therefore align them with muscle and *do not allow* gaps to open. Use a high gapopen\npenalty.\n\n-8 seems to be the first integer to work. Set it to -10.\nmuscle -in js.fasta -gapopen -10\n\nWe have a reference sequence in the alignment for which the numbering is known. Therefore\nmake the right hand most column imgt 128. Any further are trimmed.\n\nOnce aligned, all residue before imgt 116 are ignored (101 in Chothia heavy).\nAll before are changed to gaps. The rationale is the alignment in this region is\nnot structurally valid anyway. Want the columns because of the potential imgt states. \n\nHMMER needs a single alignment to build a HMM. We therefore make putative germline sequences\nby combining all the v sequences with all the j sequences. (Each v sequence appears n(j) times).\n\nThese are chucked into curated alignments and hmmbuild used to create the HMMs. \n   \n\"\"\"\n\nimport os, sys\nfrom subprocess import Popen, PIPE\nfrom FastaIO import chunkify\n\namino_acids = sorted(list(\"QWERTYIPASDFGHKLCVNM\"))\nacid_set = set( amino_acids+[\".\"])\n\nfile_path  = os.path.split(__file__)[0]\nfasta_path = os.path.join( file_path, \"IMGT_sequence_files\", \"fastafiles\" )\ncurated_path = os.path.join( file_path, \"curated_alignments\" )\n\nall_species = [\"Homo_sapiens\",\n           \"Mus\",\n           \"Rattus_norvegicus\",\n           \"Oryctolagus_cuniculus\",\n           \"Macaca_mulatta\",\n           \"Sus_scrofa\",\n           \"Vicugna_pacos\",\n           \"Bos_taurus\"]\n\nall_tr_species = [\"Homo_sapiens\",\n           \"Mus\",\n]\ntranslations = {\"Homo_sapiens\":\"human\",\n           \"Mus\":\"mouse\",\n           \"Rattus_norvegicus\":\"rat\",\n           \"Oryctolagus_cuniculus\":\"rabbit\",\n           \"Macaca_mulatta\":\"rhesus\",\n           \"Sus_scrofa\":\"pig\",\n           \"Vicugna_pacos\":\"alpaca\",\n           \"Bos_taurus\":\"cow\"}\n\n\ndef read_alignment(input_file, read_all=False, region_name=\"\"):\n    \"\"\"\n    \"\"\"\n    imgt_fields =  [\"accession_number\",\n    \"allele\",  \n    \"species\",  \n    \"functionality\",  \n    \"region\",  \n    \"start_and_end_positions_IMGT/LIGM-DB_accession_number\", \n    \"number_of_nucleotides\", \n    \"codon_start\", \n    \"number_nucleotides_added_in_5'_compared_IMGT/LIGM-DB\", \n    \"number_nucleotides_added_in_3'_compared_IMGT/LIGM-DB\", \n    \"number_nucleotides_to_correct_sequencing_errors\", \n    \"number_of_amino_acids\", \n    \"number_of_characters\", \n    \"partial\",  \n    \"reverse\"]\n\n    records = {}\n    try:\n        handle = open(input_file, \"r\")\n    except IOError:\n        print('Warning file', input_file, 'could not be found')\n        return records\n\n    region=\"\"\n    for record in chunkify(handle):\n\n        fields = dict(list(zip( imgt_fields, record.description.split(\"|\"))) )\n        sequence = record.seq \n        # These are the ones we care about and will be used\n        try:\n            if fields['accession_number'] == 'None':continue\n            if fields[\"functionality\"]==\"F\" and not fields[\"partial\"].strip() and not fields[\"reverse\"].strip():\n                if read_all:\n                    pass\n                elif fields[\"allele\"].split(\"*\")[-1].strip()!=\"01\": \n                    continue\n                if set(list(sequence))- acid_set:\n    #                print >> sys.stderr,\"Unexpected character in sequence\"\n    #                print >> sys.stderr,sequence\n                    continue\n\n                if fields[\"region\"] == region_name:\n                    records[ (fields[\"species\"], fields[ \"allele\" ] ) ] = sequence\n                elif region_name.startswith(\"C\"):\n                    if len(sequence) < 100: \n                        continue # Filter out partial sequences that IMGT have not....\n                elif region:\n                    assert fields[\"region\"]==region, \"The region for some the entries is different\"\n\n                region=fields[\"region\"]\n                records[ (fields[\"species\"], fields[ \"allele\" ] ) ] = sequence\n        except KeyError:\n            print(\"Something wrong with the file %s\"%input_file)\n            continue\n            \n    handle.close()\n    return records\n\ndef read_fasta(filename):\n    \"\"\"\n    Read a sequence file and parse as description, string \n    \"\"\"\n    handle = open(filename, \"r\")\n    records = [ [s.description, s.seq.replace(\" \",\"\")] for s in chunkify(handle) ]\n    handle.close()\n    return records\n\ndef write_fasta( sequences ):\n    \"\"\"\n    Write a fasta file containing all sequences\n    \"\"\"   \n    filename = os.path.join( file_path, \"muscle_alignments\", \"all_js.fasta\" )\n    with open( filename, \"w\" ) as outfile:\n        for al in sequences:\n            for s in sequences[al]:\n                print(\">%s|%s|%s|%s\"%tuple( list(al)+list(s) ), file=outfile)\n                print(sequences[al][s], file=outfile)\n    return filename\n\n\ndef format_c_genes(calignments, gene_name=\"\"):    \n    new_calignments = {} \n    for entry in calignments:\n        if len(calignments[entry]) == 0:\n            continue\n        new_calignments[entry] = {}\n        for seq in calignments[entry]:\n\n            cspecies, callele = seq\n            sequence = calignments[entry][seq]\n                        \n            # IMGT has a different alignment for C-genes than V and J genes.\n            # This condition filters out the two sequeces that are not in the consistent format for C gene.\n            #tttt = sequence[:132].ljust( 132 ).replace(\" \",\".\")\n            tttt = sequence[:149].ljust( 149 ).replace(\" \",\".\")\n            if tttt[104] != \"C\" or tttt[33] != \"C\": \n                print(\"Something wrong with \", entry, gene_name, sequence)\n                continue\n\n            max_length = 149\n            new_name = \"%s_%s_%s\" % (gene_name, cspecies, callele)\n            new_calignments[entry][ new_name ] = sequence[:max_length].ljust( max_length ).replace(\" \",\".\")\n\n    return new_calignments\n\ndef format_j_genes(jalignments):\n\n    reference = (\"WFAYWGQGTLVTVSA\", 4  , 19 )\n    #                 seq           start  end\n\n    ffile = write_fasta(jalignments)\n    al_filename = os.path.join( file_path, \"muscle_alignments\", \"all_js_aligned.fasta\" )\n    \n    if sys.platform == \"darwin\":\n        pr = Popen( [ \"muscle_macOS\", \"-in\", ffile, \"-gapopen\", \"-10\", \"-out\", al_filename, ], stdout=PIPE, stderr=PIPE )\n    else:\n        pr = Popen( [ \"muscle\", \"-in\", ffile, \"-gapopen\", \"-10\", \"-out\", al_filename, ], stdout=PIPE, stderr=PIPE )\n    o, e = pr.communicate()\n    aligned = read_fasta( al_filename )\n    new_jalignments = {} \n\n    # Find the reference sequence and what we need to do to map\n    for name, sequence in aligned:\n        if name == \"Mus|H|Mus musculus|IGHJ3*01\":\n            ref_aligned = sequence\n            break\n    start = ref_aligned.index( reference[0] )\n    if start > reference[1]:\n        START = start+1-reference[1]\n    else:\n        START = 0\n    END = start + 15\n\n\n    for name, sequence in aligned:\n        species, chain_type, id1, id2 =  name.strip(\">\").split(\"|\")\n\n        if (species, chain_type) not in new_jalignments:   \n            new_jalignments[(species, chain_type)] = {}\n        # We take the last 13 of the new alignment and pad into 20 long string \n        new_jalignments[(species, chain_type)][ (id1, id2) ] = sequence[START: END][-14:].rjust(20).replace(\" \", \".\")\n    return new_jalignments\n\ndef format_v_genes(valignments):\n    \"\"\"\n    Take upto and including imgt position 108 in the alignment. Pad with gaps on the right side\n    \"\"\"\n    \n    new_valignments = {} \n    for entry in valignments:\n        species, chain_type = entry \n        new_valignments[entry] = {}\n        for seq in valignments[entry]:\n            sequence = valignments[entry][seq]\n            if chain_type == \"L\" and translations[species] == \"rhesus\":\n                sequence = rhesus_lambda(sequence)\n            elif chain_type == \"A\" and translations[species] == \"mouse\":\n                sequence = mouse_alpha(sequence)\n            elif chain_type == \"D\" and translations[species] == \"mouse\":\n                sequence = mouse_delta(sequence)\n            new_valignments[entry][ seq ] = sequence[:108].ljust( 108 ).replace(\" \",\".\")\n            if new_valignments[entry][ seq ][103] != \"C\" or new_valignments[entry][ seq ][22] != \"C\": \n                sys.stderr.write(\"Warning - this alignment doesn't feature CYS at position 23 and/or position 104.\\n\")\n                sys.stderr.write(\"%s,%s,%s\\n\" % (new_valignments[entry][ seq ], entry, seq))\n\n    return new_valignments\n\ndef mouse_delta(sequence):\n    \"\"\"\n    Mouse delta chains have insertions. This screws up the alignment to everything else - not really IMGT gapped.\n\n    This is particularly bad because alignment is not even consistent within the chain and species!!!\n\n    Remove and return\n    \"\"\"\n    # Check in here because not all are bad...recheck again in the format v genes just to make sure.\n    if sequence[103] != \"C\" or sequence[22] != \"C\":\n        return sequence[ : 8 ] + sequence[ 9:85 ] + sequence[86:]\n    return sequence\n\ndef rhesus_lambda(sequence):\n    \"\"\"\n    Rhesus lambda chains have insertions. This screws up the alignment to everything else - not really IMGT gapped.\n    Remove and return\n    \"\"\"\n    return sequence[:20]+sequence[21:51]+ sequence[53:] \n\ndef mouse_alpha(sequence):\n    \"\"\"\n    Mouse alpha chains have insertions. This screws up the alignment to everything else - not really IMGT gapped.\n    Remove and return\n    \"\"\"\n    return sequence[:8]+sequence[9:85]+sequence[86:]\n\ndef combine_sequences(vsequences, jsequences):\n    \"\"\"\n    Do a pairwise combination of the v and j sequences to get putative germline sequences for the species.\n    \n    \"\"\"\n    combined_sequences = {}\n    for v in vsequences:\n        vspecies, vallele = v\n        for j in jsequences:\n            _, jallele= j\n            combined_sequences[(\"%s_%s_%s\"%(vspecies, vallele,jallele)).replace(\" \", \"_\")] = vsequences[v] + jsequences[j]\n    return combined_sequences       \n\ndef make_putative_alignments( vsequences, jsequences, calignments = None ):\n    all_sequences = {}\n    for species, chain_type in vsequences:\n        if (species, chain_type) not in jsequences or (species, chain_type) not in vsequences: continue\n        combined_sequences = combine_sequences( vsequences[ (species, chain_type) ], jsequences[ (species, chain_type) ] )\n        all_sequences[ (species, chain_type) ] = combined_sequences\n        output_stockholm( combined_sequences, \"%s_%s\"%(translations[species], chain_type) )\n\n    # Write just the V and J combinations\n    output_stockholm_all( all_sequences )\n     \n    # Write the V and J combinations and the c-domains\n    if calignments:\n        output_stockholm_all_and_C(all_sequences, calignments )\n\n\ndef write_germlines(vsequences, jsequences):\n    \"\"\"\n    Compile a dictionary containing all the v and j germline sequences.\n    \"\"\"\n\n    all_gene_alignments = {\"J\":{},\"V\":{}}\n\n    for species, chain_type in vsequences:\n        for ((_,gene), seq) in vsequences[ (species, chain_type) ].items():\n            assert len(seq)==108, species+_+gene+chain_type+_+seq+str(len(seq))\n            try:\n                all_gene_alignments[\"V\"][ chain_type ][ translations[species] ][ gene ] = seq.replace(\".\",\"-\") + \"-\"*20\n            except KeyError:        \n                try:\n                    all_gene_alignments[\"V\"][ chain_type ][ translations[species] ]= { gene : seq.replace(\".\",\"-\") + \"-\"*20 }\n                except KeyError:\n                    try:\n                        all_gene_alignments[\"V\"][ chain_type ] = { translations[species] : { gene : seq.replace(\".\",\"-\") + \"-\"*20 } } \n                    except KeyError:\n                        all_gene_alignments[\"V\"] = { chain_type : { translations[species] : { gene : seq.replace(\".\",\"-\") + \"-\"*20 } } }\n\n        for ((_,gene), seq) in jsequences.get((species, chain_type),{} ).items():\n            assert len(seq)==20\n            try:\n                all_gene_alignments[\"J\"][ chain_type ][ translations[species] ][ gene ] = \"-\"*108 + seq.replace(\".\",\"-\")\n            except KeyError:        \n                try:\n                    all_gene_alignments[\"J\"][ chain_type ][ translations[species] ]= { gene : \"-\"*108 + seq.replace(\".\",\"-\") }\n                except KeyError:\n                    try:\n                        all_gene_alignments[\"J\"][ chain_type ] = { translations[species] : { gene : \"-\"*108 + seq.replace(\".\",\"-\")} } \n                    except KeyError:\n                        all_gene_alignments[\"J\"] = { chain_type : { translations[species] : { gene : \"-\"*108 + seq.replace(\".\",\"-\") } } }\n        output_python_lookup(all_gene_alignments)\n\n\ndef output_python_lookup(all_gene_alignments, path=None):\n    \"\"\"\n    Format a lookup table for the germline sequences. This can then be used by the final program.\n    \"\"\"\n\n    if path is None:\n        path = curated_path\n    filename = os.path.join( path, \"germlines.py\")\n    with open(filename,'w') as outfile:\n        print(\"all_germlines = \"+repr(all_gene_alignments), file=outfile)\n\ndef write_stockholm( sequences, ID, outfile):\n        print(\"# STOCKHOLM 1.0\", file=outfile)\n        print(\"#=GF ID %s\"%ID, file=outfile)\n        \n        pad_length = max(list(map(len, list(sequences.keys()))))+1\n        for s in sequences:\n            print(s.replace(\" \", \"_\").ljust(pad_length), sequences[s].replace(\".\",\"-\"), file=outfile)\n        print(\"#=GC RF\".ljust(pad_length), \"x\"*len(sequences[s]), file=outfile)\n        print(\"//\", file=outfile)\n\n\ndef output_C_alignments(alignments, c_name):\n    \"\"\"\n    Write a stockholm for all C domains. \n    \"\"\"\n    for species, chain_type in alignments:\n        output_stockholm( alignments[(species, chain_type) ], \"%s_%s_%s\"%(c_name, translations[species], chain_type) )\n\ndef output_stockholm_all_and_C(all_sequences, all_C_alignments, path=None):\n    \"\"\"\n    Output a minimal stockholm alignment file for all sequences. \n    \"\"\"\n    if path is None:\n        path = curated_path\n\n    filename = os.path.join( path, \"ALL_AND_C.stockholm\")\n    with open( filename, \"w\") as outfile:\n        for species, chain_type in all_sequences:\n            sequences = all_sequences[(species, chain_type)]\n            l = len(list(sequences.values())[0])\n            assert all( [1 if l == len(sequences[s]) else 0 for s in sequences]), \"Not all sequences in alignment are the same length\"\n            write_stockholm( sequences, \"%s_%s\"%(translations[species], chain_type), outfile)\n\n        for c_name in all_C_alignments:\n            for species, chain_type in all_C_alignments[c_name] :\n                write_stockholm( all_C_alignments[c_name][(species, chain_type) ], \"%s_%s_%s\"%(translations[species], chain_type,c_name), outfile)\n    return filename      \n\n\ndef output_stockholm_all(all_sequences, path=None):\n    \"\"\"\n    Output a minimal stockholm alignment file for all sequences. \n    \"\"\"\n    if path is None:\n        path = curated_path\n\n    filename = os.path.join( path, \"ALL.stockholm\")\n    with open( filename, \"w\") as outfile:\n        for species, chain_type in all_sequences:\n            sequences = all_sequences[(species, chain_type)]\n            l = len(list(sequences.values())[0])\n            assert all( [1 if l == len(sequences[s]) else 0 for s in sequences]), \"Not all sequences in alignment are the same length\"\n            write_stockholm( sequences, \"%s_%s\"%(translations[species], chain_type), outfile)\n\n    return filename      \n\ndef output_stockholm(sequences, name, path=None):\n    \"\"\"\n    Output a minimal stockholm alignment file. \n    \"\"\"\n    if path is None:\n        path = curated_path\n\n    filename = os.path.join( path, \"%s.stockholm\"%name)\n    l = len(list(sequences.values())[0])\n    \n    assert all( [1 if l == len(sequences[s]) else 0 for s in sequences]), \"Not all sequences in alignment are the same length\"\n    \n    with open( filename, \"w\") as outfile:\n        write_stockholm( sequences, name, outfile)\n\n    \n    return filename      \n\ndef main():\n    \"\"\"\n    Read in the raw v and j alignments\n    Format them and combine the sequences\n    \"\"\"\n    print(\"\\nFormatting alignments\\n\")\n    valignments, jalignments = {},{}\n    all_valignments, all_jalignments = {},{}\n    #ccalignments, c1alignments, c2alignments, c3alignments = {}, {}, {}, {}\n\n    print(\"IGs\")\n    for species in all_species:\n        for chain_type in \"HKL\":\n            if not os.path.isfile( os.path.join( fasta_path, \"%s_%sV.fasta\" % (species,chain_type)) ):\n                continue\n\n            print(species, chain_type)\n            valignments[ (species, chain_type) ]  = read_alignment( os.path.join( fasta_path , \"%s_%sV.fasta\"%(species, chain_type) ), region_name= \"V-REGION\" )\n            jalignments[ (species, chain_type) ]  = read_alignment( os.path.join( fasta_path , \"%s_%sJ.fasta\"%(species, chain_type) ), region_name= \"J-REGION\") \n\n            ### Comment out if you want constant regions?\n            #if chain_type == \"H\":\n            #    c1alignments[ (species, chain_type) ]   = read_alignment( os.path.join( fasta_path , \"%s_%sC.fasta\"%(species, chain_type) ), region_name=\"CH1\") \n            #    c2alignments[ (species, chain_type) ]   = read_alignment( os.path.join( fasta_path , \"%s_%sC.fasta\"%(species, chain_type) ), region_name=\"CH2\") \n            #    c3alignments[ (species, chain_type) ]   = read_alignment( os.path.join( fasta_path , \"%s_%sC.fasta\"%(species, chain_type) ), region_name=\"CH3\") \n            #else:\n            #    ccalignments[ (species, chain_type) ]   = read_alignment( os.path.join( fasta_path , \"%s_%sC.fasta\"%(species, chain_type) ), region_name=\"C-REGION\") \n\n            all_valignments[ (species, chain_type) ]  = read_alignment( os.path.join( fasta_path , \"%s_%sV.fasta\"%(species, chain_type) ), region_name= \"V-REGION\", read_all=True)\n            all_jalignments[ (species, chain_type) ]  = read_alignment( os.path.join( fasta_path , \"%s_%sJ.fasta\"%(species, chain_type) ), region_name= \"J-REGION\", read_all=True) \n\n    print(\"\\nTRs\")\n    for species in all_tr_species:\n        for chain_type in \"ABGD\":\n            if not os.path.isfile( os.path.join( fasta_path, \"%s_%sV.fasta\" % (species,chain_type)) ):\n                continue\n\n            print(species, chain_type)\n            valignments[ (species, chain_type) ]   = read_alignment( os.path.join( fasta_path , \"%s_%sV.fasta\"%(species, chain_type) ))\n            jalignments[ (species, chain_type) ]   = read_alignment( os.path.join( fasta_path , \"%s_%sJ.fasta\"%(species, chain_type) )) \n            all_valignments[ (species, chain_type) ]  = read_alignment( os.path.join( fasta_path , \"%s_%sV.fasta\"%(species, chain_type) ), read_all=True)\n            all_jalignments[ (species, chain_type) ]  = read_alignment( os.path.join( fasta_path , \"%s_%sJ.fasta\"%(species, chain_type) ), read_all=True) \n            \n\n    valignments = format_v_genes(valignments)\n    jalignments = format_j_genes(jalignments)\n\n    #ccalignments = format_c_genes(ccalignments, 'CC')\n    #c1alignments = format_c_genes(c1alignments, 'C1')\n    #c2alignments = format_c_genes(c2alignments, 'C2')\n    #c3alignments = format_c_genes(c3alignments, 'C3')\n\n\n    all_valignments = format_v_genes(all_valignments)\n    all_jalignments = format_j_genes(all_jalignments)\n\n    #all_C_alignments = { \"CC\":ccalignments,\"C1\":c1alignments,\"C2\":c2alignments,\"C2\":c2alignments}\n    \n    write_germlines( all_valignments, all_jalignments )\n\n    # Combine the alignments to make putative germline alignments (obviously no d gene in there for Hs)\n    # Write them to a stockholm alignment file.    \n    combined_sequences  = make_putative_alignments( valignments, jalignments )\n\n    # Write the constant domains each to file.\n    #output_C_alignments(ccalignments, 'CC')\n    #output_C_alignments(c1alignments, 'C1')\n    #output_C_alignments(c2alignments, 'C2')\n    #output_C_alignments(c3alignments, 'C3')\n\n\nmain()\n\n\n\n"
  },
  {
    "path": "build_pipeline/RUN_pipeline.sh",
    "content": "# Run the pipeline to get the sequences, format them and build the databases\n\nDIR=\".\"\n\n# Rip the sequences from the imgt website. HTML may change in the future. \nmkdir -p $DIR/IMGT_sequence_files/htmlfiles\nmkdir -p $DIR/IMGT_sequence_files/fastafiles\npython $DIR/RipIMGT.py\n\n# Format the alignments and handle imgt oddities to put into a consistent alignment format\nmkdir -p $DIR/curated_alignments\nmkdir -p $DIR/muscle_alignments\npython $DIR/FormatAlignments.py\n\n# Build the hmms for each species and chain.\n# --hand option required otherwise it will delete columns that are mainly gaps. We want 128 columns otherwise ARNACI will fall over.\nmkdir -p $DIR/HMMs\nhmmbuild --hand $DIR/HMMs/ALL.hmm $DIR/curated_alignments/ALL.stockholm\n#hmmbuild --hand $DIR/HMMs/ALL_AND_C.hmm $DIR/curated_alignments/ALL_AND_C.stockholm\n\n# Turn the output HMMs file into a binary form. This is required for hmmscan that is used in ARNACI.\nhmmpress -f $DIR/HMMs/ALL.hmm \n#hmmpress -f $DIR/HMMs/ALL_AND_C.hmm\n\n"
  },
  {
    "path": "build_pipeline/RipIMGT.py",
    "content": "\"\"\"\nA program to rip the sequences from genedb and parse them into fasta files\n\nRipped from here:\n\nhttps://www.imgt.org/vquest/refseqh.html     \n\"\"\"\n\nfrom html.parser import HTMLParser\nfrom html.entities import name2codepoint\nimport urllib.request, urllib.parse, urllib.error, os, sys\n\n\n# Set globals\nfile_path  = os.path.split(__file__)[0]\nhtml_outpath =  os.path.join( file_path, \"IMGT_sequence_files\", \"htmlfiles\" )\nfasta_outpath = os.path.join( file_path, \"IMGT_sequence_files\", \"fastafiles\" )\n\n# Define where to point the urls to.\n# We have heavy, kappa, lambda, alpha, beta, gamma and delta chains.\n# Both the v genes (imgt gapped amino acids) and the j genes (amino acids, are not gapped) \n\n# Urls as of 04-12-14\nurls = { \"HV\": \"https://www.imgt.org/genedb/GENElect?query=7.3+IGHV&species=%s\",\n         \"HJ\": \"https://www.imgt.org/genedb/GENElect?query=7.6+IGHJ&species=%s\",\n         \"KV\": \"https://www.imgt.org/genedb/GENElect?query=7.3+IGKV&species=%s\",\n         \"KJ\": \"https://www.imgt.org/genedb/GENElect?query=7.6+IGKJ&species=%s\",\n         \"LV\": \"https://www.imgt.org/genedb/GENElect?query=7.3+IGLV&species=%s\",\n         \"LJ\": \"https://www.imgt.org/genedb/GENElect?query=7.6+IGLJ&species=%s\",\n         \"AV\": \"https://www.imgt.org/genedb/GENElect?query=7.3+TRAV&species=%s\",\n         \"AJ\": \"https://www.imgt.org/genedb/GENElect?query=7.6+TRAJ&species=%s\",\n         \"BV\": \"https://www.imgt.org/genedb/GENElect?query=7.3+TRBV&species=%s\",\n         \"BJ\": \"https://www.imgt.org/genedb/GENElect?query=7.6+TRBJ&species=%s\",\n         \"GV\": \"https://www.imgt.org/genedb/GENElect?query=7.3+TRGV&species=%s\",\n         \"GJ\": \"https://www.imgt.org/genedb/GENElect?query=7.6+TRGJ&species=%s\",\n         \"DV\": \"https://www.imgt.org/genedb/GENElect?query=7.3+TRDV&species=%s\",\n         \"DJ\": \"https://www.imgt.org/genedb/GENElect?query=7.6+TRDJ&species=%s\"\n         \n         #\"HC\": \"https://www.imgt.org/genedb/GENElect?query=7.3+IGHC&species=%s\",\n         #\"KC\": \"https://www.imgt.org/genedb/GENElect?query=7.3+IGKC&species=%s\",\n         #\"LC\": \"https://www.imgt.org/genedb/GENElect?query=7.3+IGLC&species=%s\",\n       }\n\n\n\n# Species as of 04-12-14\n# Species as of 02-06-16 - alpaca added\n# These are retrieved for all the antibodies\nall_species = [\"Homo+sapiens\",\n           \"Mus\",\n           \"Rattus+norvegicus\",\n           \"Oryctolagus+cuniculus\",\n           \"Macaca+mulatta\",\n           \"Sus+scrofa\",\n           \"Vicugna+pacos\",\n           \"Bos+taurus\"]\n\n\n# These are retrieved for the tcr chains. There are a few more for gamma and delta chains but\n# they are rare (structurally anyway) that it does not seem worth it.   \nall_tr_species = [\"Homo+sapiens\",\n           \"Mus\",\n]\n\n\n# These do not have light chain sequences so we ignore (they're fish)\n#           \"Oncorhynchus+mykiss\",\n#           \"Danio+rerio\" ]\n\n# Html parser class.\nclass GENEDBParser(HTMLParser):\n    currenttag = None\n    currentnamedent = None\n    _data = []\n    def handle_starttag(self, tag, attrs):\n        self.currenttag=tag\n    def handle_endtag(self, tag):\n        self.currenttag=None\n    def handle_data(self, data):\n        split = data.split(\"\\n\")\n        start = sum([ 1 if l[0]==\">\" else 0 for l in split if len(l)])\n        if self.currenttag==\"pre\" and (self.currentnamedent ==\">\" or start):\n            # Two different ways of parsing the html based on how IMGT have formatted the pages.\n            # For some reason they format gene db differently sometimes (legacy?) \n            if start > 1: # If you encounter more than one line in the data with a fasta \">\" symbol, all sequences will be in the same packet\n                name, sequence = None, \"\"\n                for l in split:\n                    if not l: continue\n                    if l[0]==\">\":\n                        if sequence:\n                            self._data.append( (name, sequence) )\n                            name, sequence = None, \"\"\n                        name = l\n                    else:\n                        sequence += l.replace(\" \", \"\")\n                if name and sequence:\n                    self._data.append( (name, sequence) )\n            else: # Otherwise it will be done entry by entry\n                print(\"1\")\n                try:\n                    name = split[0]\n                except IndexError:\n                    return\n                sequence = (\"\".join( split[1:])).replace(\" \", \"\")\n                self._data.append( (name, sequence) )\n\n    def handle_entityref(self, name):\n        self.currentnamedent = chr(name2codepoint[name])\n    def handle_charref(self, name):\n        if name.startswith('x'):\n            self.currentnamedent = chr(int(name[1:], 16))\n        else:\n            self.currentnamedent = chr(int(name))\n\n    def rip_sequences(self,htmlstring):\n        \"\"\"\n        Method for this subclass that automates the return of data\n        \"\"\"\n        self.reset()\n        self._data = []\n        self.currenttag = None\n        self.currentnamedent = None\n        self.feed(htmlstring)\n        self._data\n        return self._data\n        \nparser = GENEDBParser()\n\n\ndef get_html(species, gene_type, force = True):\n    \"\"\"\n    Get the html from IMGT\n    \"\"\"\n    filename = os.path.join(html_outpath,\"%s_%s.html\"%(species.replace(\"+\", \"_\"), gene_type) )\n    # If html file exists already\n    if os.path.isfile(filename):\n        return filename\n    if urllib.request.urlretrieve( urls[gene_type]%species,  filename ):\n        return filename\n    else:\n        return False\n\ndef write_fasta( sequences, species, gene_type ):\n    \"\"\"\n    Write a fasta file containing all sequences\n    \"\"\"\n    filename = os.path.join(fasta_outpath,\"%s_%s.fasta\"%(species.replace(\"+\", \"_\"), gene_type) )\n    with open(filename, \"w\") as outfile:\n        for name, sequence in sequences:\n            print(\">%s\"%name, file=outfile)\n            print(sequence, file=outfile)\n\ndef ripfasta(species, gene_type, force = True):\n    \"\"\" \n    Rip the fasta sequences for a species and gene type from IMGT\n    \"\"\"\n    htmlfile = get_html(species, gene_type, force)\n    if htmlfile:\n        with open(htmlfile) as infile:\n            sequences = parser.rip_sequences(infile.read())\n        if sequences:\n            write_fasta(sequences, species, gene_type )\n        else:\n            print(\"Bad parse\", end=' ', file=sys.stderr)\n            return 1\n    else:\n        print(\"Bad Url\", end=' ', file=sys.stderr)\n        return 1\n\ndef main():\n    \"\"\"\n    For all V and J gene types (H,K,L,A,B,G,D) parse IMGT database and extract fasta files\n    \"\"\"\n    for gene_type in urls:\n        for species in all_species:\n            if gene_type[0] in \"ABGD\" and species not in all_tr_species: continue # we don't want TCRs for all organisms\n            if gene_type[0] in \"KL\" and species == \"Vicugna+pacos\": continue # alpacas don't have light chains\n            if ripfasta(species, gene_type, force = False):\n                print(\"Failed to retrieve %s %s\"%(species, gene_type), file=sys.stderr)\n            else:\n                print(\"Parsed and saved %s %s\"%(species, gene_type))\n         \nmain()\n"
  },
  {
    "path": "build_pipeline/__init__.py",
    "content": ""
  },
  {
    "path": "build_pipeline/test.csv_H.csv",
    "content": "Id,domain_no,hmm_species,chain_type,e-value,score,seqstart_index,seqend_index,identity_species,v_gene,v_identity,j_gene,j_identity,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112A,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128\nInput sequence,0,human,H,2.2e-56,180.6,0,120,,,0.00,,0.00,Q,V,Q,L,V,E,S,G,G,-,G,V,V,Q,P,G,R,S,L,R,L,S,C,A,A,S,G,F,T,F,-,-,-,-,S,S,Y,G,M,H,W,V,R,Q,A,P,G,K,G,L,A,G,-,G,G,V,K,W,D,E,-,G,S,N,K,Y,D,A,D,S,V,K,-,G,R,F,T,I,S,R,D,N,S,K,N,T,L,Y,L,Q,M,N,S,L,R,A,E,D,T,A,V,Y,Y,C,A,R,A,G,A,W,G,G,S,Y,L,F,D,Y,W,G,Q,G,T,L,V,T,V,S,S\n"
  },
  {
    "path": "lib/python/anarci/__init__.py",
    "content": "__version__ = \"1.b\"\n__all__ = [\"anarci\", \"schemes\"]\nfrom .anarci import *\n"
  },
  {
    "path": "lib/python/anarci/anarci.py",
    "content": "#    ANARCI - Antibody Numbering and Antigen Receptor ClassIfication\n#    Copyright (C) 2016 Oxford Protein Informatics Group (OPIG)\n#\n#    This program is free software: you can redistribute it and/or modify\n#    it under the terms of the BSD 3-Clause License.\n#\n#    You should have received a copy of the BSD 3-Clause Licence\n#    along with this program.  If not, see <https://opensource.org/license/bsd-3-clause/>.\n\n'''\nANARCI - Antigen Receptor Numbering And ClassIfication\n\nOxford Protein Informatics Group (OPIG). 2015-17\n\nANARCI performs alignments of sequences to databases of Hidden Markov Models (HMMs).\nThose that align with a significant score are classified by species and chain type.\nThey are then numbered with a scheme of the user's choosing. \n\nCurrently implemented schemes: \n    IMGT\n    Chothia (IGs only)\n    Kabat (IGs only)\n    Martin / Enhanced Chothia (IGs only)\n    AHo \n    Wolfguy (IGs only)\n\nCurrently recognisable species (chains):\n    Human (heavy, kappa, lambda, alpha, beta)\n    Mouse (heavy, kappa, lambda, alpha, beta)\n    Rat (heavy, kappa, lambda)\n    Rabbit (heavy, kappa, lambda)\n    Pig (heavy, kappa, lambda)\n    Rhesus Monkey (heavy, kappa)\n    \nNotes:\n o Use assign_germline to get a better species assignment\n o Each scheme has been implemented to follow the published specification as closely as possible. However, in places some schemes\n   do not specifiy where insertions should be placed (e.g. imgt FW3). In these cases the HMM alignment is used. This can give rise\n   to inserted positions that were not described by the respective paper. \n o AHo is implemented heuristically based on chain type. If one grafted a foreign CDR1 loop onto, say, a VH domain, it will be \n   numbered as if it is a CDRH1 loop. \n    \n\n'''\n\nimport os\nimport sys\nimport tempfile\nimport gzip\nimport math\nfrom functools import partial\nfrom textwrap import wrap\nfrom subprocess import Popen, PIPE\nfrom itertools import groupby, islice\nfrom multiprocessing import Pool\n\nfrom Bio.SearchIO.HmmerIO import Hmmer3TextParser as HMMERParser\n\n# Import from the schemes submodule\nfrom .schemes import *\nfrom .germlines import all_germlines\n    \nall_species = list(all_germlines['V']['H'].keys())\n\namino_acids = sorted(list(\"QWERTYIPASDFGHKLCVNM\"))\nset_amino_acids = set(amino_acids)\nanarci_path  = os.path.split(__file__)[0]\n\nscheme_short_to_long = { \"m\":\"martin\", \"c\":\"chothia\", \"k\":\"kabat\",\"imgt\":\"imgt\", \"kabat\":\"kabat\", \"chothia\":\"chothia\", \"martin\":\"martin\", \"i\":\"imgt\", \"a\":\"aho\",\"aho\":\"aho\",\"wolfguy\":\"wolfguy\", \"w\":\"wolfguy\"}\n\nscheme_names = list(scheme_short_to_long.keys()) \nchain_type_to_class = {\"H\":\"H\", \"K\":\"L\", \"L\":\"L\", \"A\":\"A\", \"B\":\"B\", \"G\":\"G\", \"D\":\"D\"}\n\nHMM_path =  os.path.join( anarci_path, \"dat\", \"HMMs\" )\n\nall_reference_states = list(range( 1, 129)) # These are the IMGT reference states (matches)\n\nclass HMMscanError(Exception):\n    def __init__(self, message):\n        # Call the base class constructor with the parameters it needs\n        super(HMMscanError, self).__init__(message)\n\n## Utility functions ##\ndef read_fasta(filename):\n    \"\"\"\n    Read a sequence file and parse as description, string \n    \"\"\"\n    # return [ r for r in fasta_iter(filename) ]\n    try:\n        return [r for r in fasta_iter(filename)]\n    except StopIteration:\n        pass  # Do nothing when the generator stops\n\ndef fasta_iter(fasta_name):\n    \"\"\"\n    Given a fasta file, yield tuples of header, sequence\n    https://www.biostars.org/p/710/\n    \"\"\"\n    if fasta_name.endswith('.gz'):\n        fh = gzip.open(fasta_name, 'rt')  # 'rt' for text mode, required for Python 3\n    else:\n        fh = open(fasta_name, 'r')\n    \n    faiter = (x[1] for x in groupby(fh, lambda line: line[0] == \">\"))\n    \n    for header in faiter:\n        try:\n            header = next(header)[1:].strip()\n            seq = \"\".join(s.strip() for s in next(faiter))\n            yield header, seq\n        except StopIteration:\n            break\n\ndef write_fasta(sequences, f):\n    \"\"\"\n    Write a list of sequences to file. \n    \n    should be a list of name, sequence tuples\n    \n    f should be an open file\n    \"\"\"\n    for name, sequence in sequences:\n        print(\">%s\"%name, file=f)\n        print('\\n'.join(['\\n'.join(wrap(block, width=80)) for block in sequence.splitlines()]), file=f)\n    \n    \ndef validate_sequence(sequence):\n    \"\"\"\n    Check whether a sequence is a protein sequence or if someone has submitted something nasty.\n    \"\"\"\n    assert len(sequence) < 10000, \"Sequence too long.\"\n    assert not (set( sequence.upper() ) - set_amino_acids ), \"Unknown amino acid letter found in sequence: %s\"% \", \".join(list((set( sequence.upper() ) - set_amino_acids )))    \n    return True\n\ndef validate_numbering(xxx_todo_changeme, name_seq=[]):\n    \"\"\"\n    Wrapper to do some basic validation of the numbering.\n    \n    Further validation could be done but at the moment we just check that the numbering indices are incremental (they should be)\n    \"\"\"\n    (numbering, start, end) = xxx_todo_changeme\n    name, seq = name_seq\n    last = -1\n    nseq=\"\"\n\n    for (index, _), a in numbering:\n        assert index >= last, \"Numbering was found to decrease along the sequence %s. Please report.\"%name\n        last = index\n        nseq += a.replace(\"-\",\"\")\n\n    assert nseq in seq.replace(\"-\",\"\"), \"The algorithm did not number a contiguous segment for sequence %s. Please report\"%name\n\n    return numbering, start, end\n\ndef grouper(n, iterable):\n    '''\n    Group entries of an iterable by n\n    '''\n    it = iter(iterable)\n    def take():\n        while 1:\n            yield list( islice(it,n) )\n    return iter(take().__next__, [] )\n\ndef anarci_output(numbered, sequences, alignment_details, outfile, sequence_id=None, domain_id=None):\n    \"\"\"\n    Outputs to open file\n\n    If sequence_id is specified as an integer then only this sequence will be printed. \n    Otherwise all sequences will be printed.\n\n    If domain_id is specified as an integer then only this domain will be printed. \n    Otherwise all domains will be printed.\n\n    If domain_id is specified then sequence_id must also be specified. \n    \"\"\"       \n    assert (sequence_id is not None) or (sequence_id is None and domain_id is None), \"If domain_id is specified, sequence_id must also be specified.\"\n    for i in range(len(numbered)):\n        if sequence_id is None:\n            print(\"# %s\"%sequences[i][0], file=outfile) # print the name\n        if numbered[i] is not None:\n            if sequence_id is not None:\n                if i != sequence_id: continue\n            print(\"# ANARCI numbered\", file=outfile)\n            for j in range( len(numbered[i])): # Iterate over domains\n                if domain_id is not None:\n                    if j != domain_id: continue\n                print(\"# Domain %d of %d\"%(j+1, len(numbered[i]) ), file=outfile)\n                print(\"# Most significant HMM hit\", file=outfile)\n                print(\"#|species|chain_type|e-value|score|seqstart_index|seqend_index|\", file=outfile)\n                alignment_details[i][j][\"evalue\"] = str( alignment_details[i][j][\"evalue\"] )\n                print(\"#|%s|%s|%s|%.1f|%d|%d|\"%tuple( [alignment_details[i][j][field] for field in \n                                                                     [\"species\",\"chain_type\",\"evalue\",\"bitscore\"]] \n                                                                   +[ numbered[i][j][1], numbered[i][j][2]] ), file=outfile)\n                \n                if 'germlines' in alignment_details[i][j]:\n                    print('# Most sequence-identical germlines', file=outfile)\n                    print('#|species|v_gene|v_identity|j_gene|j_identity|', file=outfile)\n                    (species, vgene), vid =alignment_details[i][j]['germlines'].get('v_gene', [['','unknown'],0])\n                    if vgene is None:\n                        vgene, vid = 'unknown', 0\n                    (_,jgene), jid =alignment_details[i][j]['germlines'].get('j_gene', [['','unknown'],0])\n                    if jgene is None:\n                        jgene, jid = 'unknown', 0\n                    print('#|%s|%s|%.2f|%s|%.2f|'%(species, vgene, vid, jgene, jid ), file=outfile)\t\n                chain_type = chain_type_to_class[  alignment_details[i][j][\"chain_type\"] ]\n                print(\"# Scheme = %s\"%alignment_details[i][j][\"scheme\"], file=outfile)\n                if len( numbered[i][j][0] ) == 0:\n                    print(\"# Warning: %s scheme could not be applied to this sequence.\"%alignment_details[i][j][\"scheme\"], file=outfile)            \n                for (index, insertion), aa in numbered[i][j][0]:\n                    print(chain_type, (\"%d\"%index).ljust(5), insertion, aa, file=outfile)\n        print(\"//\", file=outfile)\n\ndef csv_output(sequences, numbered, details, outfileroot):\n    '''\n    Write numbered sequences to csv files. A csv file is written for each chain type.\n\n    Kappa and Lambda chains are written to the same file\n\n    The sequences will written aligned to the numbering scheme. Gaps in the sequences with respect to the alignment are written\n    as a '-'\n\n    @param sequences: List of name, sequence tuples    \n    @param numbered: Numbered sequences in the same order as the sequences list. \n    @param details: List of alignment details in the same order as the sequences list.\n    @param outfileroot: The file path for csv files to write. _<chain_type>.csv will be appended to this.\n    '''\n    \n    chain_types = {}        \n    pos_ranks = {}\n    all_pos = {}\n    _lc = {'K':'KL','L':'KL'}\n\n\n    # Divide the set into chain types and find how to order the numbering for each type.\n    for i in range( len(sequences) ): # Iterate over entries\n        if numbered[i] is None: continue\n\n        for j in range(len(numbered[i])): # Iterate over domains.\n            # Record the chain type index\n            c = details[i][j]['chain_type']\n            c = _lc.get(c, c) # Consider lambda and kappa together.\n            chain_types.setdefault( c, [] ).append( (i,j) ) \n            if c not in pos_ranks:\n                pos_ranks[c] = {}\n                all_pos[c] = set()\n\n            # Update the insertion order for the scheme. i.e. is it A B C or C B A (e.g. imgt 111 and 112 repectively)\n            l = -1 \n            r = 0 \n            for p, _ in numbered[i][j][0]:\n                if p[0] != l:\n                    l = p[0]\n                    r = 0\n                else:\n                    r +=1\n                pos_ranks[c][p] = max( r, pos_ranks[c].get( p, r ) )\n                all_pos[c].add( p )\n\n    # Write a new file for each chain type. Kappa and lambda are written together as light chains. \n    for cts in ['H','KL','A','B','G','D']:\n        if cts in chain_types:\n            with open( outfileroot + '_%s.csv'%cts, 'w' ) as out:\n\n                # Sort the positions by index and insertion order\n                positions = sorted( all_pos[cts], key = lambda p: (p[0], pos_ranks[cts][p]) )\n\n                # Header line\n                fields = ['Id','domain_no','hmm_species','chain_type','e-value','score','seqstart_index','seqend_index',\n                          'identity_species','v_gene','v_identity','j_gene','j_identity']\n                fields += [ ('%d%s'%(p)).strip() for p in positions ]\n                print(','.join( fields ), file=out)\n\n                # Iterate over the domains identified\n                for i,j in chain_types[cts]:\n                    line = [ sequences[i][0].replace(',',' '),      \n                             str(j),\n                             details[i][j].get('species',''),\n                             details[i][j].get('chain_type',''),\n                             str(details[i][j].get('evalue','')),\n                             str(details[i][j].get('bitscore','')),\n                             str(numbered[i][j][1]),\n                             str(numbered[i][j][2]),\n                             details[i][j].get('germlines',{}).get( 'v_gene',[['',''],0] )[0][0],\n                             details[i][j].get('germlines',{}).get( 'v_gene',[['',''],0] )[0][1],\n                             '%.2f'%details[i][j].get('germlines',{}).get( 'v_gene',[['',''],0] )[1],\n                             details[i][j].get('germlines',{}).get( 'j_gene',[['',''],0] )[0][1],\n                             '%.2f'%details[i][j].get('germlines',{}).get( 'j_gene',[['',''],0] )[1] ]\n\n                    # Hash the numbering. Insertion order has been preserved in the positions sort.\n                    d = dict( numbered[i][j][0] )\n                    line += [ d.get(p,'-') for p in positions ]\n\n                    assert len( line ) == len( fields )\n                    print(','.join( line ), file=out)\n\n\n\n## Parsing and recognising domain hits from hmmscan ##\ndef _domains_are_same(dom1, dom2):\n    \"\"\"\n    Check to see if the domains are overlapping.\n    @param dom1: \n    @param dom2: \n\n    @return: True or False  \n    \"\"\"\n    dom1, dom2 = sorted( [dom1, dom2], key=lambda x: x.query_start  )\n    if dom2.query_start >= dom1.query_end:\n        return False\n    return True\n\n\ndef _parse_hmmer_query(query, bit_score_threshold=80, hmmer_species=None):\n    \"\"\"\n    \n    @param query: hmmer query object from Biopython\n    @param bit_score_threshold: the threshold for which to consider a hit a hit. \n    \n    The function will identify multiple domains if they have been found and provide the details for the best alignment for each domain.\n    This allows the ability to identify single chain fvs and engineered antibody sequences as well as the capability in the future for identifying constant domains. \n\n    \"\"\"\n    hit_table = [ ['id', 'description', 'evalue', 'bitscore', 'bias', \n                    'query_start', 'query_end' ] ]\n\n    # Find the best hit for each domain in the sequence.\n\n    top_descriptions, domains,state_vectors = [], [], []\n    \n    if query.hsps: # We have some hits\n        # If we have specified a species, check to see we have hits for that species\n        # Otherwise revert back to using any species\n        if hmmer_species:\n            #hit_correct_species = [hsp for hsp in query.hsps if hsp.hit_id.startswith(hmmer_species) and hsp.bitscore >= bit_score_threshold]\n            hit_correct_species = []\n            for hsp in query.hsps:\n                if hsp.bitscore >= bit_score_threshold:\n                    for species in hmmer_species:\n                        if hsp.hit_id.startswith(species):\n                            hit_correct_species.append(hsp)\n\n            if hit_correct_species:\n                hsp_list = hit_correct_species\n            else:\n                print(\"Limiting hmmer search to species %s was requested but hits did not achieve a high enough bitscore. Reverting to using any species\" %(hmmer_species))\n                hsp_list = query.hsps\n        else:\n            hsp_list = query.hsps\n\n        for hsp in sorted(hsp_list, key=lambda x: x.evalue): # Iterate over the matches of the domains in order of their e-value (most significant first)\n            new=True\n            if hsp.bitscore >= bit_score_threshold: # Only look at those with hits that are over the threshold bit-score.\n                for i in range( len(domains) ): # Check to see if we already have seen the domain\n                    if _domains_are_same( domains[i], hsp ):\n                        new = False\n                        break      \n                hit_table.append( [ hsp.hit_id, hsp.hit_description, hsp.evalue, hsp.bitscore, hsp.bias, hsp.query_start, hsp.query_end] )\n                if new: # It is a new domain and this is the best hit. Add it for further processing.\n                    domains.append( hsp )\n                    top_descriptions.append(  dict( list(zip(hit_table[0], hit_table[-1])) ) ) # Add the last added to the descriptions list. \n\n        # Reorder the domains according to the order they appear in the sequence.         \n        ordering = sorted( list(range(len(domains))), key=lambda x: domains[x].query_start)\n        domains = [ domains[_] for _ in ordering ]\n        top_descriptions = [ top_descriptions[_] for _ in ordering ]         \n   \n    ndomains = len( domains )\n    for i in range(ndomains): # If any significant hits were identified parse and align them to the reference state.\n        domains[i].order = i\n        species, chain = top_descriptions[i][\"id\"].split(\"_\")\n        state_vectors.append( _hmm_alignment_to_states(domains[i], ndomains, query.seq_len) ) # Alignment to the reference states.\n        top_descriptions[i][ \"species\"] = species # Reparse\n        top_descriptions[i][ \"chain_type\"] = chain\n        top_descriptions[i][ \"query_start\"] = state_vectors[-1][0][-1] # Make sure the query_start agree if it was changed\n\n    return hit_table, state_vectors, top_descriptions\n\n\ndef _hmm_alignment_to_states(hsp, n, seq_length):\n    \"\"\"\n    Take a hit hsp and turn the alignment into a state vector with sequence indices\n    \"\"\"\n\n    # Extract the strings for the reference states and the posterior probability strings     \n    reference_string = hsp.aln_annotation[\"RF\"]\n    state_string = hsp.aln_annotation[\"PP\"]\n\n    assert len(reference_string) == len(state_string), \"Aligned reference and state strings had different lengths. Don't know how to handle\"\n\n    # Extract the start an end points of the hmm states and the sequence\n    # These are python indices i.e list[ start:end ] and therefore start will be one less than in the text file\n    _hmm_start = hsp.hit_start\n    _hmm_end = hsp.hit_end\n     \n    _seq_start = hsp.query_start\n    _seq_end = hsp.query_end\n\n    # Extact the full length of the HMM hit\n    species, ctype = hsp.hit_id.split('_')\n    _hmm_length = get_hmm_length( species, ctype )\n\n    # Handle cases where there are n terminal modifications.\n    # In most cases the user is going to want these included in the numbered domain even though they are not 'antibody like' and \n    # not matched to the germline. Only allow up to a maximum of 5 unmatched states at the start of the domain\n    # Adds a bug here if there is a very short linker between a scfv domains with a modified n-term second domain\n    # Thus this is only done for the first identified domain ( hence order attribute on hsp )\n    if hsp.order == 0 and _hmm_start and _hmm_start < 5: \n        n_extend = _hmm_start \n        if _hmm_start > _seq_start:\n            n_extend = min( _seq_start , _hmm_start - _seq_start )\n        state_string = '8'*n_extend + state_string  \n        reference_string = 'x'*n_extend + reference_string\n        _seq_start = _seq_start - n_extend\n        _hmm_start = _hmm_start - n_extend\n\n    # Handle cases where the alignment should be extended to the end of the j-element\n    # This occurs when there a c-terminal modifications of the variable domain that are significantly different to germline\n    # Extension is only made when half of framework 4 has been recognised and there is only one domain recognised.\n    if n==1 and _seq_end < seq_length and (123 < _hmm_end < _hmm_length): # Extend forwards\n        n_extend = min( _hmm_length - _hmm_end, seq_length - _seq_end )\n        state_string = state_string + '8'*n_extend\n        reference_string = reference_string + 'x'*n_extend\n        _seq_end = _seq_end + n_extend\n        _hmm_end = _hmm_end + n_extend\n                    \n\n\n    # Generate lists for the states and the sequence indices that are included in this alignment\n    hmm_states = all_reference_states[ _hmm_start : _hmm_end ] \n    sequence_indices = list(range(_seq_start,  _seq_end))\n    h, s = 0, 0 # initialise the current index in the hmm and the sequence\n    \n    state_vector = []\n    # iterate over the state string (or the reference string)\n    for i in range( len(state_string) ):\n        if reference_string[i] == \"x\": # match state\n            state_type = \"m\"\n        else: # insert state\n            state_type = \"i\"\n        \n        if state_string[i] == \".\": # overloading if deleted relative to reference. delete_state\n            state_type = \"d\"\n            sequence_index = None\n        else:\n            sequence_index = sequence_indices[s]    \n        # Store the alignment as the state identifier (uncorrected IMGT annotation) and the index of the sequence\n        \n        state_vector.append(  ((hmm_states[h], state_type),  sequence_index )  )        \n\n        # Updates to the indices         \n        if state_type == \"m\":\n            h+=1\n            s+=1\n        elif state_type == \"i\":\n            s+=1\n        else: # delete state\n            h+=1\n        \n    return state_vector\n\n\ndef parse_hmmer_output(filedescriptor=\"\", bit_score_threshold=80, hmmer_species=None):\n    \"\"\"\n    Parse the output of HMMscan and return top alignment and the score table for each input sequence.\n    \"\"\"\n    results  = []\n    if type(filedescriptor) is str:\n        openfile = open\n    elif type(filedescriptor) is int:\n        openfile = os.fdopen\n    \n    with openfile(filedescriptor) as inputfile:\n        p = HMMERParser( inputfile )\n        for query in p:\n            results.append(_parse_hmmer_query(query,bit_score_threshold=bit_score_threshold,hmmer_species=hmmer_species ))\n\n    return results\n\n\ndef run_hmmer(sequence_list,hmm_database=\"ALL\",hmmerpath=\"\", ncpu=None, bit_score_threshold=80, hmmer_species=None):\n    \"\"\"\n    Run the sequences in sequence list against a precompiled hmm_database.\n\n    Those sequence that have a significant hit with a bit score over a threshold will\n    be recognised and an alignment given. The alignment will be used to number the \n    sequence.\n\n    @param sequence_list: a list of (name, sequence) tuples. Both are strings\n    @param hmm_database: The hmm database to use. Currently, all hmms are in the ALL database.\n                         The code to develop new models is in build_pipeline in the git repo.\n    @param hmmerpath: The path to hmmer binaries if not in the path\n    @param ncpu: The number of cpu's to allow hmmer to use.\n    \"\"\"\n\n    # Check that hmm_database is available\n    \n    assert hmm_database in [\"ALL\"], \"Unknown HMM database %s\"%hmm_database    \n    HMM = os.path.join( HMM_path, \"%s.hmm\"%hmm_database )\n\n\n    # Create a fasta file for all the sequences. Label them with their sequence index\n    # This will go to a temp file\n    fasta_filehandle, fasta_filename =  tempfile.mkstemp( \".fasta\", text=True )\n    with os.fdopen(fasta_filehandle,'w') as outfile:\n        write_fasta(sequence_list, outfile)\n\n    output_filehandle, output_filename =  tempfile.mkstemp( \".txt\", text=True )\n\n    # Run hmmer as a subprocess\n    if hmmerpath:\n        hmmscan = os.path.join(hmmerpath,\"hmmscan\")\n    else:\n        hmmscan = \"hmmscan\"\n    try:\n        if ncpu is None:\n            command = [ hmmscan, \"-o\", output_filename, HMM,  fasta_filename]\n        else:\n            command = [ hmmscan, \"-o\", output_filename, \"--cpu\", str(ncpu), HMM,  fasta_filename]\n        process = Popen( command, stdout=PIPE, stderr=PIPE  )\n        _, pr_stderr = process.communicate()\n\n        if pr_stderr:\n            _f = os.fdopen(output_filehandle) # This is to remove the filedescriptor from the os. I have had problems with it before.\n            _f.close()\n            raise HMMscanError(pr_stderr)\n        results = parse_hmmer_output(output_filehandle, bit_score_threshold=bit_score_threshold, hmmer_species=hmmer_species)\n        \n    finally:\n        # clear up\n        os.remove(fasta_filename)\n        os.remove(output_filename)\n        \n    return results\n\ndef get_hmm_length( species, ctype ):\n    '''\n    Get the length of an hmm given a species and chain type. \n    This tells us how many non-insertion positions there could possibly be in a domain (127 or 128 positions under imgt)\n    '''\n    try:\n        return len(list(all_germlines['J'][ctype][species].values())[0].rstrip('-'))\n    except KeyError:\n        return 128\n\n\ndef number_sequence_from_alignment(state_vector, sequence, scheme=\"imgt\", chain_type=None):\n    \"\"\"\n    Given you have an alignment. Give back the numbering\n    \n    @param state_vector: List of states from the hmm. Effectively these are imgt columns but CDR3 has not been redone. \n    @param sequence: The original sequence string or list.\n    @param scheme: The numbering scheme to apply\n    @param chain_type: The type of chain to apply numbering for. Some schemes do not require this (IMGT). Others (e.g. Chothia/Wolfguy) do.\n    \n    @return: A list of numbering identifier / amino acids tuples over the domain that has been numbered. The indices of the start (inclusive) and end point (exclusive) in the sequence for the numbering \n    \"\"\"\n    scheme=scheme.lower()\n    if scheme == \"imgt\":\n        return number_imgt(state_vector, sequence)\n    elif scheme == \"chothia\":\n        if chain_type == \"H\":\n            return number_chothia_heavy(state_vector, sequence)\n        elif chain_type in \"KL\":\n            return number_chothia_light(state_vector, sequence)\n        else:\n            raise AssertionError(\"Unimplemented numbering scheme %s for chain %s\"%( scheme, chain_type))\n    elif scheme == \"kabat\":\n        if chain_type == \"H\":\n            return number_kabat_heavy(state_vector, sequence)\n        elif chain_type in \"KL\":\n            return number_kabat_light(state_vector, sequence)\n        else:\n            raise AssertionError(\"Unimplemented numbering scheme %s for chain %s\"%( scheme, chain_type))\n    elif scheme == \"martin\":\n        if chain_type == \"H\":\n            return number_martin_heavy(state_vector, sequence)\n        elif chain_type in \"KL\":\n            return number_martin_light(state_vector, sequence)\n        else:\n            raise AssertionError(\"Unimplemented numbering scheme %s for chain %s\"%( scheme, chain_type))\n    elif scheme == \"aho\":\n        return number_aho(state_vector, sequence, chain_type) # requires the chain type to heuristically put the CDR1 gap in position.\n    elif scheme == \"wolfguy\":\n        if chain_type == \"H\":\n            return number_wolfguy_heavy( state_vector, sequence )     \n        elif chain_type in \"KL\":\n            return number_wolfguy_light( state_vector, sequence )  \n        else:\n            raise AssertionError(\"Unimplemented numbering scheme %s for chain %s\"%( scheme, chain_type))      \n    else:\n        raise AssertionError(\"Unimplemented numbering scheme %s for chain %s\"%( scheme, chain_type))\n\ndef number_sequences_from_alignment(sequences, alignments, scheme=\"imgt\", allow=set([\"H\",\"K\",\"L\",\"A\",\"B\",\"G\",\"D\"]), \n                                    assign_germline=False, allowed_species=None):\n    '''\n    Given a list of sequences and a corresponding list of alignments from run_hmmer apply a numbering scheme.\n    '''\n\n    # Iteration over the sequence alignments performing the desired numbering \n    numbered = []\n    alignment_details = []\n    hit_tables = []\n    for i in range(len(sequences)):\n\n        # Unpack\n        hit_table, state_vectors, detailss = alignments[i] # We may have multiple domains per sequence (e.g. single chain fvs). \n\n        # Iterate over all the domains in the sequence that have been recognised (typcially only 1 with the current hmms available)\n        hit_numbered, hit_details = [], []\n        for di in range( len( state_vectors ) ):\n            state_vector = state_vectors[di]\n            details      = detailss[di]\n            details[\"scheme\"]=scheme\n            details[\"query_name\"]=sequences[i][0]            \n\n            # Only number things that are allowed. We still keep the alignment details and hit_table\n            if state_vector and details[\"chain_type\"] in allow: \n                try:\n                    # Do the numbering and validate (for development purposes)\n                    hit_numbered.append( validate_numbering(number_sequence_from_alignment(state_vector, sequences[i][1], \n                                                            scheme=scheme, chain_type=details[\"chain_type\"]), sequences[i] ) )\n                    if assign_germline:\n                        details[\"germlines\"] = run_germline_assignment( state_vector, sequences[i][1], \n                                                                        details[\"chain_type\"], allowed_species=allowed_species)\n                    hit_details.append( details )\n                except AssertionError as e: # Handle errors. Those I have implemented should be assertion.\n                    print(str(e), file=sys.stderr)\n                    raise e # Validation went wrong. Error message will go to stderr. Want this to be fatal during development.\n                except Exception as e:\n                    print(\"Error: Something really went wrong that has not been handled\", file=sys.stderr)\n                    print(str(e), file=sys.stderr)\n                    raise e\n                \n        if hit_numbered: \n            numbered.append( hit_numbered )\n            alignment_details.append( hit_details )\n        else: \n            numbered.append( None )\n            alignment_details.append( None )\n        hit_tables.append(hit_table)\n\n    return numbered, alignment_details, hit_tables\n\ndef get_identity( state_sequence, germline_sequence ):\n    \"\"\"\n    Get the partially matched sequence identity between two aligned sequences. \n    Partial in the sense that gaps can be in the state_sequence.\n    \"\"\"\n    # Ensure that the sequences are the expected length\n    assert len( state_sequence) == len(germline_sequence ) == 128\n    n, m = 0, 0\n    for i in range( 128 ):\n        if germline_sequence[i] == \"-\":continue\n        if state_sequence[i].upper() == germline_sequence[i]: m+=1\n        n+=1\n\n    if not n:\n        return 0    \n    return float(m)/n\n    \n\ndef run_germline_assignment(state_vector, sequence, chain_type, allowed_species=None ):\n    \"\"\"\n    Find the closest sequence identity match.\n    \"\"\"\n    genes={'v_gene': [None,None],\n           'j_gene': [None,None],\n         }\n\n\n    # Extract the positions that correspond to match (germline) states. \n    state_dict = dict( ((i, 'm'),None) for i in range(1,129))\n    state_dict.update(dict(state_vector))\n    state_sequence = \"\".join([ sequence[state_dict[(i, 'm')]] if state_dict[(i,'m')] is not None else \"-\" for i in range(1,129) ])\n\n    # Iterate over the v-germline sequences of the chain type of interest.\n    # The maximum sequence identity is used to assign the germline \n    if chain_type in all_germlines[\"V\"]:\n        if allowed_species is not None:\n            if not all( [ sp in all_germlines['V'][chain_type] for sp in allowed_species ] ): # Made non-fatal\n                return {}\n        else:\n            allowed_species = all_species\n        seq_ids = {}\n        for species in allowed_species:\n            if species not in all_germlines[\"V\"][ chain_type ]: continue # Previously bug.\n            for gene, germline_sequence in all_germlines[\"V\"][ chain_type ][ species ].items():\n                seq_ids[ (species, gene) ] = get_identity( state_sequence , germline_sequence )\n        genes['v_gene' ][0] = max( seq_ids, key=lambda x: seq_ids[x] )\n        genes['v_gene' ][1] = seq_ids[ genes['v_gene' ][0] ]\n        \n        # Use the assigned species for the v-gene for the j-gene. \n        # This assumption may affect exotically engineered abs but in general is fair.\n        species = genes['v_gene' ][0][0]       \n        if chain_type in all_germlines[\"J\"]:\n            if species in all_germlines[\"J\"][chain_type]:\n                seq_ids = {}\n                for gene, germline_sequence in all_germlines[\"J\"][ chain_type ][ species ].items():\n                    seq_ids[ (species, gene) ] = get_identity( state_sequence , germline_sequence )\n                genes['j_gene' ][0] = max( seq_ids, key=lambda x: seq_ids[x] )\n                genes['j_gene' ][1] = seq_ids[ genes['j_gene' ][0] ]\n     \n    return genes\n\ndef check_for_j( sequences, alignments, scheme ):\n    '''\n    As the length of CDR3 gets long (over 30ish) an alignment that does not include the J region becomes more favourable.\n    This leads to really long CDR3s not being numberable. \n\n    To overcome this problem, when no J region is detected we try without the v region.\n    '''\n    for i in range( len( sequences ) ):\n        # Check the alignment for J region\n        if len(alignments[i][1]) ==1: # Only do for single domain chains. \n\n            # Check whether a J region has been identified. If not check whether there is still a considerable amount of sequence   \n            # remaining. \n            ali = alignments[i][1][0]\n\n            # Find the last match position. \n            last_state  = ali[-1][0][0]\n            last_si     = ali[-1][1]\n            if last_state < 120: # No or very little J region\n                if last_si + 30 < len( sequences[i][1] ): # Considerable amount of sequence left...suspicious of a long CDR3\n                    # Find the position of the conserved cysteine (imgt 104). \n                    cys_si = dict( ali ).get( (104,'m'), None )\n                    if cys_si is not None: # 104 found.\n\n                        # Find the corresponding index in the alignment.\n                        cys_ai = ali.index( ((104, 'm'), cys_si) )\n                \n                        # Try to identify a J region in the remaining sequence after the 104. A low bit score threshold is used.\n                        _, re_states, re_details  = run_hmmer( [(sequences[i][0], sequences[i][1][cys_si+1:])], \n                                                               bit_score_threshold=10 )[0] \n\n                        # Check if a J region was detected in the remaining sequence.\n                        if re_states and re_states[0][-1][0][0] >= 126 and re_states[0][0][0][0] <= 117: \n\n                            # Sandwich the presumed CDR3 region between the V and J regions.\n\n                            vRegion   = ali[:cys_ai+1]\n                            # jRegion   = [ (state, index+cys_si+1) for state, index in re_states[0] if state[0] >= 117 ]\n                            jRegion = [(state, index+cys_si+1) for state, index in re_states[0] if (state[0] >= 117) and (index is not None)]\n                            cdrRegion = []\n                            next = 105\n                            for si in range( cys_si+1, jRegion[0][1] ):\n                                if next >= 116:\n                                    cdrRegion.append( ( (116, 'i'), si ) )\n                                else:\n                                    cdrRegion.append( ( (next, 'm'), si ) )\n                                    next +=1 \n\n                            # Update the alignment entry.\n                            alignments[i][1][0] = vRegion + cdrRegion + jRegion \n                            alignments[i][2][0]['query_end'] = jRegion[-1][1] + 1 \n\n\n\n##################################\n# High level numbering functions #\n##################################\n\n# Main function for ANARCI \n# Name conflict with function, module and package is kept for legacy unless issues are reported in future. \ndef anarci(sequences, scheme=\"imgt\", database=\"ALL\", output=False, outfile=None, csv=False, allow=set([\"H\",\"K\",\"L\",\"A\",\"B\",\"G\",\"D\"]), \n           hmmerpath=\"\", ncpu=None, assign_germline=False, allowed_species=['human','mouse'], bit_score_threshold=80):\n    \"\"\"\n    The main function for anarci. Identify antibody and TCR domains, number them and annotate their germline and species. \n\n    It is advised to use one of the wrapper functions:\n        o run_anarci   - fasta file or sequence list in. Automated multiprocessing for large jobs. Sequences, numbering, details \n                         and hit tables out. \n        o number       - single sequence in, numbering out\n\n    \n    @param sequences: A list or tuple of (Id, Sequence) pairs\n                              e.g. [ (\"seq1\",\"EVQLQQSGAEVVRSG ...\"),\n                                     (\"seq2\",\"DIVMTQSQKFMSTSV ...\") ]\n    @param scheme:    The numbering scheme that should be applied. Choose from imgt, chothia, kabat or martin\n    @param output:    Boolean flag to say whether the result should be output.\n    @param outfile:   The name of the file to output to. If output is True and outfile is None then output is printed\n                      to stdout.\n    @param csv:       Boolean flag to say whether the csv output alignment format or the vertical anarci format should be used.\n    @param allow:     A set containing the chain types that should be recognised. If chothia, kabat or martin is used\n                      as the scheme, anarci will ignore tcr chains. Choose a subset of [\"H\",\"K\",\"L\",\"A\",\"B\",\"G\",\"D\"]\n    @param assign_germline: Using highest sequence identity assign the germline to the chain. Can be more accurate at identifying\n                      species than the best HMM hit alone. (Bool)\n    @param allowed_species: If assign_germline is true, limit the species that can be assigned to a limited set. Useful when the \n                      animal species is known or when performing closest germline experiments. Choose a subset of ['human',\n                      'mouse','rat','rabbit','rhesus','pig','alpaca'].\n\n\n    @param bit_score_threshold: The threshold score from HMMER at which an alignment should be numbered. Lowering the threshold \n                      means domain recognition is more permissive and can be useful for numbering heavily engineered molecules. \n                      However, too low and false positive recognition of other ig-like molecules will occur.\n    @param hmmerpath: The path to hmmscan. If left unspecified then the PATH will be searched. \n    @param ncpu:      The number of cpu's that hmmer should be allowed to use. If not specified then the hmmscan \n                      default is used. N.B. hmmscan must be compiled with multithreading enabled for this option to have effect. \n                      Please consider using the run_anarci function for native multiprocessing with anarci.\n    @param database:  The HMMER database that should be used. Normally not changed unless a custom db is created.\n\n\n    @return: Three lists. Numbered, Alignment_details and Hit_tables.\n             Each list is in the same order as the input sequences list.\n             A description of each entry in the three lists is as followed.\n               o Numbered: will be None if no domain was found for that sequence or a list of domains with their \n                           numbering, start and finish indices.\n               o Alignment_details: will be None if no domain was found for that sequence or a dictionary for each\n                           domain identified containing the details of the alignment (chain type, e-value, species etc).\n               o Hit_tables: None if no domain was found for that sequence or a nested list for each domain containing\n                           the hit table from hmmscan.\n    \n    \"\"\"\n    \n    # Validate the input scheme\n    try:\n        scheme = scheme_short_to_long[scheme.lower()]\n    except KeyError:\n        raise AssertionError(\"Unrecognised or unimplemented scheme: %s\"%scheme)        \n\n    # Check we have arguments for output before doing work.\n    if csv:\n        assert outfile, 'If csv output is True then an outfile must be specified'\n        _path, _ = os.path.split(outfile)\n        assert (not _path) or os.path.exists(_path), 'Output directory %s does not exist'%_path\n\n\n    # Perform the alignments of the sequences to the hmm database\n    alignments = run_hmmer(sequences,hmm_database=database,hmmerpath=hmmerpath,ncpu=ncpu,bit_score_threshold=bit_score_threshold,hmmer_species=allowed_species )   \n     \n    # Check the numbering for likely very long CDR3s that will have been missed by the first pass.\n    # Modify alignments in-place\n    check_for_j( sequences, alignments, scheme )\n\n    # Apply the desired numbering scheme to all sequences\n    numbered, alignment_details, hit_tables = number_sequences_from_alignment(sequences, alignments, scheme=scheme, allow=allow, \n                                                                              assign_germline=assign_germline, \n                                                                              allowed_species=allowed_species)\n\n    # Output if necessary\n    if output: \n        if csv:\n            csv_output(sequences, numbered, details, outfile)             \n        else:\n            outto, close=sys.stdout, False\n            if outfile:\n                outto, close = open(outfile,'w'), True\n            anarci_output(numbered, sequences, alignment_details, outto)\n            if close:\n                outto.close()\n\n\n    return numbered, alignment_details, hit_tables\n\n# Wrapper to run anarci using multiple processes and automate fasta file reading.\ndef run_anarci( seq, ncpu=1, **kwargs):\n    '''\n    Run the anarci numbering protocol for single or multiple sequences.\n    \n    @param sequences: A list or tuple of (Id, Sequence) pairs\n                              e.g. [ (\"seq1\",\"EVQLQQSGAEVVRSG ...\"),\n                                     (\"seq2\",\"DIVMTQSQKFMSTSV ...\") ]\n    @param scheme:    The numbering scheme that should be applied. Choose from imgt, chothia, kabat or martin\n    @param output:    Boolean flag to say whether the result should be output.\n    @param outfile:   The name of the file to output to. If output is True and outfile is None then output is printed\n                      to stdout.\n    @param allow:     A set containing the chain types that should be recognised. If chothia, kabat or martin is used\n                      as the scheme, anarci will ignore tcr chains. Choose a subset of [\"H\",\"K\",\"L\",\"A\",\"B\",\"G\",\"D\"]\n    @param assign_germline: Using highest sequence identity assign the germline to the chain. Can be more accurate at identifying\n                      species than the best HMM hit alone. (Bool)\n    @param allowed_species: If assign_germline is true, limit the species that can be assigned to a limited set. Useful when the \n                      animal species is known or when performing closest germline experiments. Choose a subset of ['human',\n                      'mouse','rat','rabbit','rhesus','pig','alpaca'].\n\n    @param bit_score_threshold: The threshold score from HMMER at which an alignment should be numbered. Lowering the threshold \n                      means domain recognition is more permissive and can be useful for numbering heavily engineered molecules. \n                      However, too low and false positive recognition of other ig-like molecules will occur.\n    @param hmmerpath: The path to hmmscan. If left unspecified then the PATH will be searched. \n    @param ncpu:      The number of cpu's that hmmer should be allowed to use. If not specified then the hmmscan \n                      default is used. N.B. hmmscan must be compiled with multithreading enabled for this option to have effect. \n                      Please consider using the run_anarci function for native multiprocessing with anarci.\n    @param database:  The HMMER database that should be used. Normally not changed unless a custom db is created.\n\n    @return: Four lists. Sequences, Numbered, Alignment_details and Hit_tables.\n             Each list is in the same order. \n             A description of each entry in the four lists is as followed.\n               o Sequences: The list of sequences formatted as [(Id,sequence), ...]. \n               o Numbered: will be None if no domain was found for that sequence or a list of domains with their \n                           numbering, start and finish indices.\n               o Alignment_details: will be None if no domain was found for that sequence or a dictionary for each\n                           domain identified containing the details of the alignment (chain type, e-value, species etc).\n               o Hit_tables: None if no domain was found for that sequence or a nested list for each domain containing\n                           the hit table from hmmscan.\n\n    '''\n    # Parse the input sequence or fasta file.\n    if isinstance(seq, list) or isinstance(seq,tuple): # A list (or tuple) of (name,sequence) sequences\n        assert all( len(_) == 2 for _ in seq ), \"If list or tuple supplied as input format must be [ ('ID1','seq1'), ('ID2', 'seq2'), ... ]\"\n        sequences = seq\n    elif os.path.isfile( seq ): # Fasta file.\n        # Read the sequences. All are read into memory currently...\n        sequences = read_fasta( seq ) \n        ncpu = int(max(1, ncpu )) \n    elif isinstance(seq, str): # Single sequence\n        validate_sequence( seq )\n        ncpu=1\n        sequences = [ [\"Input sequence\", seq ]]\n\n    # Handle the arguments to anarci.\n    output  = kwargs.get('output', False )\n    outfile = kwargs.get('outfile', False )\n    csv = kwargs.get( 'csv', False )\n    if csv: # Check output arguments before doing work.\n        assert outfile, 'If csv output is True then an outfile must be specified'\n        _path, _ = os.path.split(outfile)\n        assert (not _path) or os.path.exists(_path), 'Output directory %s does not exist'%_path\n        \n    kwargs['ncpu'] = 1 # Set hmmscan ncpu to 1. HMMER has to be compiled appropriately for this to have an effect. \n    kwargs['output'] = False # Overide and write the compiled results here. \n\n    anarci_partial = partial( anarci, **kwargs )        \n    chunksize = math.ceil( float( len(sequences) )/ncpu )\n\n    # Run the anarci function using a pool of workers. Using the map_async to get over the KeyboardInterrupt bug in python2.7\n    if ncpu > 1:\n        pool = Pool( ncpu )\n        results = pool.map_async( anarci_partial, grouper( chunksize, sequences ) ).get()\n        pool.close()\n    else:\n        results = list(map( anarci_partial, grouper( chunksize, sequences ) ))\n\n    # Reformat the results to flat lists.\n    numbered = sum( (_[0] for _ in results), [] )\n    alignment_details = sum( (_[1] for _ in results ), [] )\n    hit_tables = sum( (_[2] for _ in results), [] )\n\n    # Output if necessary\n    if output: \n        if csv:\n            csv_output(sequences, numbered, alignment_details, outfile)             \n        else:\n            outto, close=sys.stdout, False\n            if outfile:\n                outto, close = open(outfile,'w'), True\n            anarci_output(numbered, sequences, alignment_details, outto)\n            if close:\n                outto.close()\n\n    # Return the results\n    return sequences, numbered, alignment_details, hit_tables\n                \n\n\n# Wrapper function for simple sequence in numbering and chain type out behaviour. \ndef number(sequence, scheme=\"imgt\", database=\"ALL\", allow=set([\"H\",\"K\",\"L\",\"A\",\"B\",\"G\",\"D\"]), allowed_species=['human','mouse']):\n    \"\"\"\n    Given a sequence string, use anarci to number it using the scheme of choice.\n    Only the first domain will be recognised and numbered\n\n    For multiple sequences it is advised to use run_anarci instead of iterative use of this function.\n\n    @param sequence: An amino acid sequence string\n    @param scheme: The numbering scheme that should be applied. Choose from imgt, chothia, kabat or martin\n    @param database: The HMMER database that should be used. Normally not changed unless a custom db is created.\n    @param allow: A set containing the chain types that should be recognised. If chothia, kabat or martin is used\n                  as the scheme, anarci will ignore tcr chains.\n\n    @return: If the sequence can be numbered, a list containing the numbering and sequence; and the chain type. \n             Otherwise both are False.\n\n    \"\"\"\n    \n    try:\n        validate_sequence( sequence )  \n        scheme = scheme_short_to_long[scheme.lower()]\n    except KeyError:\n        raise AssertionError(\"Unrecognised to unimplemented scheme: %s\"%scheme)\n    \n    if len(sequence) < 70: # Length check. ANARCI can number fragments of chains well. Encourage full domain numbering. \n        return False, False\n   \n    try:\n        if not allowed_species:\n            numbered, alignment_details, _ = anarci( [(\"sequence_0\", sequence)], scheme=scheme, database=database, output=False, allow=allow )\n        else:\n            numbered, alignment_details, _ = anarci( [(\"sequence_0\", sequence)], scheme=scheme, database=database, output=False, allow=allow, allowed_species = allowed_species )\n    except AssertionError: # Catch where the user has tried to number a TCR with an antibody scheme\n        return False, False\n    \n\n    # We return the numbering list and the chain type where kappa and lambda chains are both \"L\" for light\n    if numbered[0]:\n        return numbered[0][0][0], chain_type_to_class[alignment_details[0][0][\"chain_type\"]]\n    else:\n        return False, False\n\nif __name__ == \"__main__\":\n    # Test and example useage of the anarci function. \n    sequences = [ (\"12e8:H\",\"EVQLQQSGAEVVRSGASVKLSCTASGFNIKDYYIHWVKQRPEKGLEWIGWIDPEIGDTEYVPKFQGKATMTADTSSNTAYLQLSSLTSEDTAVYYCNAGHDYDRGRFPYWGQGTLVTVSAAKTTPPSVYPLAP\"),\n                  (\"12e8:L\",\"DIVMTQSQKFMSTSVGDRVSITCKASQNVGTAVAWYQQKPGQSPKLMIYSASNRYTGVPDRFTGSGSGTDFTLTISNMQSEDLADYFCQQYSSYPLTFGAGTKLELKRADAAPTVSIFPPSSEQLTSGGASV\"),\n                  (\"scfv:A\",\"DIQMTQSPSSLSASVGDRVTITCRTSGNIHNYLTWYQQKPGKAPQLLIYNAKTLADGVPSRFSGSGSGTQFTLTISSLQPEDFANYYCQHFWSLPFTFGQGTKVEIKRTGGGGSGGGGSGGGGSGGGGSEVQLVESGGGLVQPGGSLRLSCAASGFDFSRYDMSWVRQAPGKRLEWVAYISSGGGSTYFPDTVKGRFTISRDNAKNTLYLQMNSLRAEDTAVYYCARQNKKLTWFDYWGQGTLVTVSSHHHHHH\"),\n                  (\"lysozyme:A\",\"KVFGRCELAAAMKRHGLDNYRGYSLGNWVCAAKFESNFNTQATNRNTDGSTDYGILQINSRWWCNDGRTPGSRNLCNIPCSALLSSDITASVNCAKKIVSDGNGMNAWVAWRNRCKGTDVQAWIRGCRL\")]\n\n    results = anarci(sequences, scheme=\"imgt\", output=True)\n    numbering, alignment_details, hit_tables = results\n\n    expect_one_VH_domain_numbering, expect_one_VL_domain_numbering, expect_VH_then_VL_numbering, expect_None = numbering\n    assert  len(expect_one_VH_domain_numbering) == 1\n    assert  len(expect_one_VL_domain_numbering) == 1\n    assert  len(expect_VH_then_VL_numbering)    == 2\n    assert  expect_None                         == None\n\n\n\n\n"
  },
  {
    "path": "lib/python/anarci/schemes.py",
    "content": "#    ANARCI - Antibody Numbering and Antigen Receptor ClassIfication\n#    Copyright (C) 2016 Oxford Protein Informatics Group (OPIG)\n#\n#    This program is free software: you can redistribute it and/or modify\n#    it under the terms of the BSD 3-Clause License.\n#\n#    You should have received a copy of the BSD 3-Clause Licence\n#    along with this program.  If not, see <https://opensource.org/license/bsd-3-clause/>.\n\n'''\nModule containing functions to convert hmm alignment to a numbering scheme. \n\nCurrently implemented\n\nFor IG's\nIMGT\nChothia\nKabat\nMartin (Extended Chothia)\nAho \nWolfguy\n\nFor TR's\nIMGT\n(Aho)\n\n---------------------------------------------------------------------------------------------------------------------\nFunctions are written to a template:\n\nThere are 128 match states in the HMMs (these are the IMGT states). The alignment to these states must be converted to\ncorrespond to the scheme of choice. \n\nWe define:\n  - a state string consisting of 'X' and 'I' where:\n    X  means that for the state there is an equivalent position in the numbering scheme.\n    I  means that for the state there is not an equivalent position in the numbering scheme. It should therefore be \n       considered as an insertion in the scheme.\n       \n  - a region string consisting of characters (integers in the currently implemented schemes). Each character \ncorresponds to a contiguous region. Therefore each state can be assigned a region according to the scheme. \n\n  - a mapping between region characters and region indices as a dictionary. e.g. the first region character maps\nto 0, second to 1 ...\n\n  - a dictionary containing the difference between state number (imgt) and scheme number at the *beginning* of \neach region using the region indices as keys and the difference as values.\n\n  - the number of regions defined\n\n  - a list for which delete states should not be included in the numbering (typically those for the cdrs). This\nwill allow the length of the region to be the number of residues found instead of the number of possible states plus\ninsertions.\n\n \nThis all goes into the _number_regions function along with the sequence and the state_vector (the alignment from the\nHMM).\n\n_number regions will then divide the aligned part of the sequence into as many regions as defined above. Within each \nregion it will give a numbering according to the input parameters. A list of lists will be returned containing the \nnumbered sequence for each region.\n\nSome of the regions will not be numbered correctly according to the scheme. For example the insertions for the CDRs\nwill not necessarily be on the correct residue. For each different scheme these regions are then modified (see code\nfor implementation) \n\nFinally the full numbered sequence is compiled and returned to the calling function.\n---------------------------------------------------------------------------------------------------------------------\n\nOther schemes can be implemented following the template above. \n\n\n'''\n\n# Alphabet used for insertion (last (-1th) is a blank space for no insertion)\nalphabet = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"AA\", \"BB\", \"CC\", \"DD\", \"EE\", \"FF\", \"GG\", \"HH\", \"II\", \"JJ\", \"KK\", \"LL\", \"MM\", \"NN\", \"OO\", \"PP\", \"QQ\", \"RR\", \"SS\", \"TT\", \"UU\", \"VV\", \"WW\", \"XX\", \"YY\", \"ZZ\", \" \"]\n\n# Blosum62 matrix. Used in some annotation methods to recognise pre-defined motifs\nblosum62 = {('B', 'N'): 3, ('W', 'L'): -2, ('G', 'G'): 6, ('X', 'S'): 0, ('X', 'D'): -1, ('K', 'G'): -2, ('S', 'E'): 0, ('X', 'M'): -1, ('Y', 'E'): -2, ('W', 'R'): -3, ('I', 'R'): -3, ('X', 'Z'): -1, ('H', 'E'): 0, ('V', 'M'): 1, ('N', 'R'): 0, ('I', 'D'): -3, ('F', 'D'): -3, ('W', 'C'): -2, ('N', 'A'): -2, ('W', 'Q'): -2, ('L', 'Q'): -2, ('S', 'N'): 1, ('Z', 'K'): 1, ('V', 'N'): -3, ('Q', 'N'): 0, ('M', 'K'): -1, ('V', 'H'): -3, ('G', 'E'): -2, ('S', 'L'): -2, ('P', 'R'): -2, ('D', 'A'): -2, ('S', 'C'): -1, ('E', 'D'): 2, ('Y', 'G'): -3, ('W', 'P'): -4, ('X', 'X'): -1, ('Z', 'L'): -3, ('Q', 'A'): -1, ('V', 'Y'): -1, ('W', 'A'): -3, ('G', 'D'): -1, ('X', 'P'): -2, ('K', 'D'): -1, ('T', 'N'): 0, ('Y', 'F'): 3, ('W', 'W'): 11, ('Z', 'M'): -1, ('L', 'D'): -4, ('M', 'R'): -1, ('Y', 'K'): -2, ('F', 'E'): -3, ('M', 'E'): -2, ('S', 'S'): 4, ('X', 'C'): -2, ('Y', 'L'): -1, ('H', 'R'): 0, ('P', 'P'): 7, ('K', 'C'): -3, ('S', 'A'): 1, ('P', 'I'): -3, ('Q', 'Q'): 5, ('L', 'I'): 2, ('P', 'F'): -4, ('B', 'A'): -2, ('Z', 'N'): 0, ('M', 'Q'): 0, ('V', 'I'): 3, ('Q', 'C'): -3, ('I', 'H'): -3, ('Z', 'D'): 1, ('Z', 'P'): -1, ('Y', 'W'): 2, ('T', 'G'): -2, ('B', 'P'): -2, ('P', 'A'): -1, ('C', 'D'): -3, ('Y', 'H'): 2, ('X', 'V'): -1, ('B', 'B'): 4, ('Z', 'F'): -3, ('M', 'L'): 2, ('F', 'G'): -3, ('S', 'M'): -1, ('M', 'G'): -3, ('Z', 'Q'): 3, ('S', 'Q'): 0, ('X', 'A'): 0, ('V', 'T'): 0, ('W', 'F'): 1, ('S', 'H'): -1, ('X', 'N'): -1, ('B', 'Q'): 0, ('K', 'A'): -1, ('I', 'Q'): -3, ('X', 'W'): -2, ('N', 'N'): 6, ('W', 'T'): -2, ('P', 'D'): -1, ('B', 'C'): -3, ('I', 'C'): -1, ('V', 'K'): -2, ('X', 'Y'): -1, ('K', 'R'): 2, ('Z', 'R'): 0, ('W', 'E'): -3, ('T', 'E'): -1, ('B', 'R'): -1, ('L', 'R'): -2, ('Q', 'R'): 1, ('X', 'F'): -1, ('T', 'S'): 1, ('B', 'D'): 4, ('Z', 'A'): -1, ('M', 'N'): -2, ('V', 'D'): -3, ('F', 'A'): -2, ('X', 'E'): -1, ('F', 'H'): -1, ('M', 'A'): -1, ('K', 'Q'): 1, ('Z', 'S'): 0, ('X', 'G'): -1, ('V', 'V'): 4, ('W', 'D'): -4, ('X', 'H'): -1, ('S', 'F'): -2, ('X', 'L'): -1, ('B', 'S'): 0, ('S', 'G'): 0, ('P', 'M'): -2, ('Y', 'M'): -1, ('H', 'D'): -1, ('B', 'E'): 1, ('Z', 'B'): 1, ('I', 'E'): -3, ('V', 'E'): -2, ('X', 'T'): 0, ('X', 'R'): -1, ('R', 'R'): 5, ('Z', 'T'): -1, ('Y', 'D'): -3, ('V', 'W'): -3, ('F', 'L'): 0, ('T', 'C'): -1, ('X', 'Q'): -1, ('B', 'T'): -1, ('K', 'N'): 0, ('T', 'H'): -2, ('Y', 'I'): -1, ('F', 'Q'): -3, ('T', 'I'): -1, ('T', 'Q'): -1, ('P', 'L'): -3, ('R', 'A'): -1, ('B', 'F'): -3, ('Z', 'C'): -3, ('M', 'H'): -2, ('V', 'F'): -1, ('F', 'C'): -2, ('L', 'L'): 4, ('M', 'C'): -1, ('C', 'R'): -3, ('D', 'D'): 6, ('E', 'R'): 0, ('V', 'P'): -2, ('S', 'D'): 0, ('E', 'E'): 5, ('W', 'G'): -2, ('P', 'C'): -3, ('F', 'R'): -3, ('B', 'G'): -1, ('C', 'C'): 9, ('I', 'G'): -4, ('V', 'G'): -3, ('W', 'K'): -3, ('G', 'N'): 0, ('I', 'N'): -3, ('Z', 'V'): -2, ('A', 'A'): 4, ('V', 'Q'): -2, ('F', 'K'): -3, ('T', 'A'): 0, ('B', 'V'): -3, ('K', 'L'): -2, ('L', 'N'): -3, ('Y', 'N'): -2, ('F', 'F'): 6, ('L', 'G'): -4, ('B', 'H'): 0, ('Z', 'E'): 4, ('Q', 'D'): 0, ('X', 'B'): -1, ('Z', 'W'): -3, ('S', 'K'): 0, ('X', 'K'): -1, ('V', 'R'): -3, ('K', 'E'): 1, ('I', 'A'): -1, ('P', 'H'): -2, ('B', 'W'): -4, ('K', 'K'): 5, ('H', 'C'): -3, ('E', 'N'): 0, ('Y', 'Q'): -1, ('H', 'H'): 8, ('B', 'I'): -3, ('C', 'A'): 0, ('I', 'I'): 4, ('V', 'A'): 0, ('W', 'I'): -3, ('T', 'F'): -2, ('V', 'S'): -2, ('T', 'T'): 5, ('F', 'M'): 0, ('L', 'E'): -3, ('M', 'M'): 5, ('Z', 'G'): -2, ('D', 'R'): -2, ('M', 'D'): -3, ('W', 'H'): -2, ('G', 'C'): -3, ('S', 'R'): -1, ('S', 'I'): -2, ('P', 'Q'): -1, ('Y', 'A'): -2, ('X', 'I'): -1, ('E', 'A'): -1, ('B', 'Y'): -3, ('K', 'I'): -3, ('H', 'A'): -2, ('P', 'G'): -2, ('F', 'N'): -3, ('H', 'N'): 1, ('B', 'K'): 0, ('V', 'C'): -1, ('T', 'L'): -1, ('P', 'K'): -1, ('W', 'S'): -3, ('T', 'D'): -1, ('T', 'M'): -1, ('P', 'N'): -2, ('K', 'H'): -1, ('T', 'R'): -1, ('Y', 'R'): -2, ('L', 'C'): -1, ('B', 'L'): -4, ('Z', 'Y'): -2, ('W', 'N'): -4, ('G', 'A'): 0, ('S', 'P'): -1, ('E', 'Q'): 2, ('C', 'N'): -3, ('H', 'Q'): 0, ('D', 'N'): 1, ('Y', 'C'): -2, ('L', 'H'): -3, ('E', 'C'): -4, ('Z', 'H'): 0, ('H', 'G'): -2, ('P', 'E'): -1, ('Y', 'S'): -2, ('G', 'R'): -2, ('B', 'M'): -3, ('Z', 'Z'): 4, ('W', 'M'): -1, ('Y', 'T'): -2, ('Y', 'P'): -3, ('Y', 'Y'): 7, ('T', 'K'): -1, ('Z', 'I'): -3, ('T', 'P'): -1, ('V', 'L'): 1, ('F', 'I'): 0, ('G', 'Q'): -2, ('L', 'A'): -1, ('M', 'I'): 1}\n\n\ndef smooth_insertions(state_vector):\n    '''\n    The function aims to correct to the expected imgt alignment. Renumbering functions then translate from the imgt scheme to the\n    appropriate scheme.        \n\n    Handle insertions made by HMMER that we suspect may be in the wrong position.\n    Edge cases include:\n        - Insertions at the C terminal of fw1, fw3 and fw3 regions. Can occur when 'conserved' residues have been mutated and the \n          same amino acid appears in the the following CDR (e.g. mutate cysteine at 104 but the CDR3 has one or more cysteines)\n        - Same as above possible (but not observed in structure seqs) for N terminal of fw2, fw3 and fw4... TODO\n        - Heavily mutated N terminal regions that are partially recognised (e.g. 3gk8 chain H). Insertions should not be allowed \n          before N terminal deletions have been used. Preserve deletion locations that are not N terminal (e.g. 10 in IMGT H) if \n          the gap has been placed by the alignment.\n\n    '''\n    # Small overhead doing these corrections but worth it for reducing edge cases.\n    \n    # Enforce insertion patterns as below. The CDRs are renumbered in each case so that insertions are placed accoring to the scheme    \n#  '11111111111111111111111111222222222222333333333333333334444444444555555555555555555555555555555555555555666666666666677777777777'\n#  '                        mmmi                         mmmi                                             mmmi                      '\n#  '                        mmmi        immm             mmmi      immm                                   mmmi         immm         '\n\n    # Enforce any insertions at the end and beginning of framework regions to be moved into the CDR region for renumbering. \n    enforced_patterns = [ [(25,'m'),(26,'m'),( 27,'m'),( 28,'i')],\n                          [(38,'i'),(38,'m'),(39,'m'),(40,'m')],\n                          [(54,'m'),(55,'m'),(56,'m'),(57,'i')],\n                          [(65,'i'),(65,'m'),(66,'m'),(67,'m')],\n                          [(103,'m'),(104,'m'),(105,'m'),(106,'i')],\n                          [(117,'i'),(117,'m'),(118,'m'),(119,'m')] ]\n\n    # Insertions in FW1 are only allowed if there are a fewer number of n-terminal deletions made. \n\n    state_buffer = [] \n    sv = []\n    for (state_id, state_type ), si in state_vector:\n        if state_id < 23: # Everything before the cysteine at 23.\n            state_buffer.append( ((state_id, state_type ), si) )\n            reg = -1   \n        elif 25 <= state_id < 28: # Add to the buffer \n            state_buffer.append( ((state_id, state_type ), si) )\n            reg = 0\n        elif 37 < state_id <= 40: # Add to the buffer \n            state_buffer.append( ((state_id, state_type ), si) )\n            reg = 1\n        elif 54 <= state_id < 57: # Add to the buffer\n            state_buffer.append( ((state_id, state_type ), si) )\n            reg = 2\n        elif 64 < state_id <= 67: # Add to the buffer\n            state_buffer.append( ((state_id, state_type ), si) )\n            reg = 3\n        elif 103 <= state_id < 106: # Add to the buffer\n            state_buffer.append( ((state_id, state_type ), si) )\n            reg = 4\n        elif 116 < state_id <= 119: # Add to the buffer\n            state_buffer.append( ((state_id, state_type ), si) )\n            reg = 5\n        elif len(state_buffer) != 0: # Add the buffer and reset\n\n            # Find the number of insertions in the buffer\n            nins = sum( 1 for s in state_buffer if s[0][1] == 'i' ) \n\n            # If there are insertions, adjust the alignment\n            if nins > 0: # We have insertions\n\n                if reg == -1: # FW1, only adjust if there are the same or more N terminal deletions than insertions\n                    nt_dels = state_buffer[0][0][0] - 1 # Missing states\n                    for (_id, _type ), _si in state_buffer: # Explicit deletion states.\n                        if _type == 'd' or _si == None:\n                            nt_dels +=1 \n                        else: # First residue found\n                            break\n                    if nt_dels >= nins: # More n terminal deletions than insertions found. Likely misalignment.\n                        \n                        # Preserve the deleted states structure by using the same match annotations\n                        new_states = [ s for s, _ in state_buffer if s[1] == 'm'] \n                        _first = new_states[0][0]\n\n                        # Remove the deletions so that only residue positions are included\n                        state_buffer = [ s for s in state_buffer if s[0][1] != 'd' ]\n\n                        # Extend N terminal states backwards from the first match states\n                        _add = len( state_buffer ) - len( new_states ) \n                        assert _add >= 0, 'Implementation logic error' # Should be adding a positive number of positions\n                        new_states = [ (_,'m') for _ in range( _first - _add, _first ) ] + new_states\n                        assert len(new_states)==len(state_buffer), 'Implementation logic error' # Should have the same length\n\n                        # Assign them preserving the order of the sequence. \n                        for i in range( len(state_buffer ) ):\n                            sv.append( ( new_states[i], state_buffer[i][1]) )\n                    else:\n                        sv += state_buffer # The insertions may be incorrect but unknown what to do. Let the alignment place.\n                else:\n                    # Remove any deletions in the buffer. Unlikely to happen but do anyway\n                    state_buffer = [ s for s in state_buffer if s[0][1] != 'd' ]\n        \n                    # Define the new states defined by the enforced pattern and the length of the buffer\n                    if reg % 2: # nterm fw\n                        new_states = [enforced_patterns[reg][0]]*max( 0, len(state_buffer)-3) + enforced_patterns[reg][ max( 4-len(state_buffer), 1):]\n                    else: # cterm fw\n                        new_states = enforced_patterns[reg][:3] + [enforced_patterns[reg][2]]*max( 0, len(state_buffer)-3)\n                    # Assign them preserving the order of the sequence. \n                    for i in range( len(state_buffer ) ):\n                        sv.append( ( new_states[i], state_buffer[i][1]) )\n                                \n            else: # Nothing to do - either all match or deletion states.\n                sv += state_buffer\n\n            # Add the current state\n            sv.append( ((state_id, state_type ), si) )\n\n            # Reset state buffer\n            state_buffer = [] \n            \n        else: # Simply append \n            sv.append( ((state_id, state_type ), si) )\n    \n\n    return sv\n\n\n# General function to give annotations for regions that have direct mappings onto the hmm alignment (imgt states)\ndef _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions):\n    \"\"\"\n    General function to number a sequence and divide it into different regions  \n    \n    @param sequence: The sequence string\n    @param state_vector: The list of states from the aligned hmm\n    @param state_string: A string of states for the scheme relative to IMGT (this is X for a direct equivalence, I if needs to be treated as insertion)\n    @param region_string: A string of characters that indicate which hmm states are in each regions for this scheme (i.e. how should the sequence be divided up)\n    @param region_index_dict: A dictionary converting the characters in region string to an index of the regions. \n    @param rels: The difference of the numbering integer at the *start* of each region\n    @param n_regions: The number of regions\n    @param exclude_deletions: A list of region indices for which deletion states should not be included. Typically the CDRs. \n                              These will be reannotated in the scheme function. Also allows the reset of insertions. \n    \n    @return: A list of lists where each region has been numbered according to the scheme. Some regions will need renumbering. This should be taken care of after the function called.\n    \n    \"\"\"\n\n    state_vector = smooth_insertions( state_vector )\n    \n    _regions = [ [] for _ in range(n_regions) ]\n    \n    # Initialise the insertion index (-1 is a blank space) and the previous state.\n    insertion = -1\n    previous_state_id = 1\n    previous_state_type = 'd'\n    start_index, end_index  = None, None\n    \n    region = None\n\n    # Iterate over the aligned state vector\n    for (state_id, state_type ), si in state_vector:\n       \n        # Retrieve the region index\n        if state_type != \"i\" or region is None: # BUG_FIX - JD 9/4/15 - do not allow a new region to start as an insertion.\n            region = region_index_dict[region_string[state_id-1]] \n\n       \n        # Check the state_types\n        if state_type == \"m\": # It is a match\n            \n            # Check whether this position is in the scheme as an independent state\n            if state_string[state_id-1]==\"I\": # No, it should be treated as an insertion\n                if previous_state_type != 'd': # Unless there was a deletion beforehand in which case this should be a real pos.\n                    insertion +=1 # Increment the insertion annotation index\n                rels[region] -= 1 # Update the relative numbering from the imgt states\n            else: # Yes \n                insertion = -1 # Reset the insertions \n            \n            # Add the numbering annotation to the appropriate region list            \n            _regions[region].append( ( (state_id + rels[region], alphabet[insertion] ), sequence[si]  ) )\n            previous_state_id = state_id # Record the previous state ID\n            if start_index is None:\n                start_index = si\n            end_index = si\n\n            previous_state_type = state_type\n            \n        elif state_type == \"i\": # It is an insertion\n            insertion +=1 # Increment the insertion annotation index\n            \n            # Add the numbering annotation to the appropriate region list\n            _regions[region].append( ( (previous_state_id + rels[region], alphabet[insertion]), sequence[si]  ) )\n            if start_index is None:\n                start_index = si\n            end_index = si\n\n            previous_state_type = state_type\n\n        else: # It is a deletion\n            previous_state_type = state_type\n            \n            # Check whether this position is in the scheme as an independent state\n            if state_string[state_id-1]==\"I\": # No, therefore irrelevant to the scheme.\n                rels[region] -= 1 # Update the relative numbering from the imgt states\n                continue \n            \n            insertion = -1 # Reset the insertions\n            previous_state_id = state_id # Record the previous state ID, should not be needed (no delete to insert state transition)\n\n\n        # Reset the inssertion index if necessary and allowed. (Means the insertion code is meaningless and will be reannotated)\n        if insertion >= 25 and region in exclude_deletions:\n            insertion = 0 \n        \n        assert insertion < 25, \"Too many insertions for numbering scheme to handle\" # We ran out of letters.\n            \n    return _regions, start_index, end_index\n\n\n# Functions to perform the numbering and the corrections for each of the implemented schemes.\n# These have been written fairly verbosely so that the template of how to generate a function for a new scheme is more clear.\n# They have two stages: Perform the mapping between imgt and the scheme; Renumber those regions that do not map nicely onto imgt (e.g. CDR insertions)\n    \n\n    \n########\n# IMGT # \n########\n# - Renumbering of the CDR 1 and 2 regions in IMGT has now been implemented to ensure consistency with the gapping rules of the \n# scheme. Previously gaps were defined using the HMM alignment as the underlying model was already based on the IMGT scheme. This \n# worked well in original test cases but appears to give inaccurate annotations in a significant number of cases in NGS size \n# sequence sets. We therefore now explicitly renumber the CDR 1 and 2 as with all the other schemes. \n\ndef number_imgt(state_vector, sequence):\n    \"\"\"    \n    Apply the IMGT numbering scheme for heavy or light chains\n    \n    Rules should be implemented using two strings - the state string and the region string. \n\n    There are 128 states in the HMMs. Treat X as a direct match in IMGT scheme, I is an insertion. (All X's for IMGT)\n    XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXX\n    11111111111111111111111111 222222222222 33333333333333333 4444444444 555555555555555555555555555555555555555 6666666666666 77777777777\n\n    Regions - (N.B These do not match up with any particular definition of CDR)\n    1. All positions before CDR1\n    2. CDR1 positions\n    3. Positions between CDR1/2\n    4. CDR2 positions\n    5. Positions between CDR2/3\n    6. CDR positions 105 (inc) to 118 (exc)\n    7. Positions after CDR3    \n    \n    \"\"\"\n    \n    # Set up the numbering \n \n    # State string - 'X' means the imgt position exists in the scheme. 'I' means that it should be treated as an insertion of the previous number\n    state_string =  'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n                    \n    # Region string - regions that should be treated separately in putting the numbering together \n    region_string = '11111111111111111111111111222222222222333333333333333334444444444555555555555555555555555555555555555555666666666666677777777777'\n\n    region_index_dict = {\n                         \"1\":0,\n                         \"2\":1,\n                         \"3\":2,\n                         \"4\":3,\n                         \"5\":4,\n                         \"6\":5,\n                         \"7\":6\n                         }\n    \n    # Define how the scheme's numbering differs from IMGT at the start of each region. \n    # This is updated in the loop below\n    rels              =  {0:0, \n                          1:0,\n                          2:0,\n                          3:0,\n                          4:0,\n                          5:0,\n                          6:0,\n                          7:0\n                          }\n    \n    n_regions = 7\n\n    exclude_deletions = [1,3,5]    \n    \n    _regions, startindex, endindex = _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions)\n    \n    ###############\n    # Renumbering #\n    ###############\n\n    _numbering = [ _regions[0], # Fw1\n                   [],          # CDR1\n                   _regions[2], # Fw2\n                   [],          # CDR2\n                   _regions[4], # Fw3\n                   [],          # CDR3\n                   _regions[6], # Fw4\n\n                 ]\n\n    # The alignment from HMMER should be correct for CDRs 1 and 2. Testing has shown not always the case and 'manual' renumbering \n    # is required as with the other schemes.\n    \n    # CDR1\n    # CDR1 has a range from 27 (inc.) to 39 (exc.) and has a theoretical maximum length of 12.\n    cdr1seq    = \"\".join([ x[1] for x in _regions[1] if x[1] != \"-\" ])\n    cdr1length = len(cdr1seq) \n    si = 0\n    prev_state = 26\n    for ann in get_imgt_cdr(cdr1length, 12, 27, 39):\n        if not ann:\n            _numbering[1].append( ((prev_state+1, ' '), '-') )\n            prev_state += 1\n        else:\n            _numbering[1].append( (ann, cdr1seq[si]) )\n            prev_state = ann[0]\n            si += 1\n\n    # CDR2 \n    # CDR2 has a range from 56 (inc.) to 66 (exc.) and has a theoretical length of 10.\n    cdr2seq    = \"\".join([ x[1] for x in _regions[3] if x[1] != \"-\" ])\n    cdr2length = len(cdr2seq)\n    si = 0\n    prev_state = 55\n    for ann in get_imgt_cdr(cdr2length, 10, 56, 66):\n        if not ann:\n            _numbering[3].append( ((prev_state+1, ' '), '-') )\n            prev_state += 1\n        else:\n            _numbering[3].append( (ann, cdr2seq[si]) )\n            prev_state = ann[0]\n            si += 1\n\n    # FW3. We allow the HMM to place insertions. Technically all insertion points are taken care of but in reality insertions can\n    # and do occur. No specification of where the insertions should be placed.\n\n\n    # CDR3 \n    # CDR3 has a range from 105 (inc.) to 118 (exc.). Insertions are placed on 112 and 111 symetrically. IMGT has a technical \n    # maximum length of 65 (13 positions, 26*2 insertions) . In practice ANARCI will not recognise CDR3s of this length.\n    cdr3seq    = \"\".join([ x[1] for x in _regions[5] if x[1] != \"-\" ])\n    cdr3length = len(cdr3seq)\n    if cdr3length > 117: return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    si = 0\n    previous_state_id = 104\n    for ann in get_imgt_cdr(cdr3length, 13, 105, 118):\n        if ann is None:\n            _numbering[5].append( ((previous_state_id+1, \" \"), \"-\"   ) )\n            previous_state_id+=1\n        else:\n            _numbering[5].append( (ann, cdr3seq[si] ) )\n            previous_state_id = ann[0]\n            si+=1\n  \n    # Return the full vector and the start and end indices of the numbered region of the sequence\n    return gap_missing( _numbering ), startindex, endindex\n  \ndef get_imgt_cdr(length, maxlength, start, end):\n    \"\"\"\n    Symmetrically number a CDR loop (e.g. CDRL1/CDRH2 for IMGT)\n    @param length:      Define the length of target CDR\n    @param maxlength:   Define the theoretical limit (e.g. L1 = 12 for the IMGT scheme)\n    @param start, end:  Start and end position numbers\n    \"\"\"\n    annotations = [ None for _ in range(max(length, maxlength)) ]\n    if length == 0:\n        return annotations\n    elif length == 1:\n        annotations[0] = (start, ' ')\n        return annotations\n\n    front, back = 0, -1\n    #az = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" \n    #za = \"ZYXWVUTSRQPONMLKJIHGFEDCBA\"\n\n    az = alphabet[:-1]\n    za = az[::-1]\n\n    for i in range(min(length, maxlength)):\n        if i % 2:\n            annotations[back] = (end + back, \" \")\n            back -= 1\n        else:\n            annotations[front] = (start + front, \" \")\n            front += 1\n\n    # Add insertions around the centre point\n    centrepoint = [ i for i,v in enumerate(annotations) if v == None ]\n    if not centrepoint:\n        return annotations\n\n    centre_left  = annotations[min(centrepoint)-1][0] # Get the index right before the first None\n    centre_right = annotations[max(centrepoint)+1][0] # Get the index right after  the first None\n\n    # For cases with an even max length\n    if not maxlength % 2:\n        frontfactor, backfactor = maxlength//2, maxlength//2\n    # For cases with an odd max length\n    else:\n        frontfactor, backfactor = (maxlength//2)+1, maxlength//2\n\n    for i in range(max(0, length-maxlength)):\n        if not i % 2:\n            annotations[back] = (centre_right, za[back + backfactor])\n            back -= 1\n        else:\n            annotations[front] = (centre_left, az[front - frontfactor])\n            front += 1\n    \n    return annotations\n\n\n#######\n# Aho # \n#######\n# Heuristic regapping based on the AHo specification as detailed on AAAAA website. Gap order depends on the chain type\ndef number_aho(state_vector, sequence, chain_type):\n    \"\"\"    \n    Apply the Aho numbering scheme\n    \n    Rules should be implemented using two strings - the state string and the region string. \n\n    There are 128 states in the HMMs. Treat X as a direct match in IMGT scheme, I is an insertion. (All X's for IMGT)\n\n    XXXXXXX XXX XXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXX\n    AAAAAAA BBB CCCCCCCCCCCCCC DDDDDDDDDDDDDDDD EEEEEEEEEEEEEEE FFFFFFFFFFFFFFFFFFFF HHHHHHHHHHHHHHHH IIIIIIIIIIIII JJJJJJJJJJJJJ KKKKKKKKKKK\n\n\n    Regions - (N.B These do not match up with any particular definition of CDR)\n    A. EMPTY (now included in B)\n    B. 1-10 inclusive. Indel occurs at 8\n    C. 11-24 inclusive.\n    D. 25-42 inclusive (deletion surround 28) 32-42 inclusive (deletions surround 36)\n    E. 43-57 inclusive \n    F. 58-77 inclusive (deletions surround 63). Alpha chains have deletions at 74,75\n    G. EMPTY (now included in H)\n    H. 78-93 inclusive  gaps on 86 then 85, insertions on 85 linearly\n    I. 94-106 inclusive\n    J. 107-138 inclusive gaps on 123 symetrically.\n    K. 139-149 inclusive.\n    \n    \"\"\"\n    \n    # Set up the numbering \n \n    # State string - 'X' means the imgt position exists in the scheme. 'I' means that it should be treated as an insertion of the previous number\n    state_string =  'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n                    \n    # Region string - regions that should be treated separately in putting the numbering together \n    region_string =  'BBBBBBBBBBCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFHHHHHHHHHHHHHHHHIIIIIIIIIIIIIJJJJJJJJJJJJJKKKKKKKKKKK'\n#                     1         2             3               4              5                   7               8            9            10\n\n\n    region_index_dict = dict( list(zip( \"ABCDEFGHIJK\", list(range(11)) )) )\n    \n    # Define how the scheme's numbering differs from IMGT at the start of each region. \n    # This is updated in the loop below\n    rels              =  {0:0, \n                         1:0,\n                         2:0,\n                         3:0,\n                         4:2,\n                         5:2,\n                         6:2,\n                         7:2,\n                         8:2,\n                         9:2,\n                         10:21}\n\n    n_regions = 11\n    \n    exclude_deletions = [1,3,4,5,7,9]    \n    \n    _regions, startindex, endindex = _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions)\n    \n    ###############\n    # Renumbering #\n    ###############\n\n    _numbering = [ _regions[0], _regions[1], _regions[2],[], _regions[4], [], _regions[6], [], _regions[8],_regions[9],_regions[10] ]\n\n    ##################################\n    # Move the indel in fw 1 onto 8  #\n    ##################################\n\n    # Place indels on 8 \n    # Find the first recognised residue and change the expected length of the stretch given the starting point. \n    # This prevents n terminal deletions being placed at 8 incorrectly.\n    length = len( _regions[1] )\n    if length > 0:\n        start = _regions[1][0][0][0] \n        stretch_len = 10 - (start -1)\n        if length > stretch_len: # Insertions are present. Place on 8\n            annotations = [ (_,\" \") for _ in range(start,9) ] + [ (8,alphabet[_]) for _ in range( length - stretch_len ) ] + [(9,\" \"),(10,\" \")]\n        else:\n            ordered_deletions = [(8,\" \")] + [(_,\" \") for _ in range(start, 11) if _ != 8]\n            annotations = sorted( ordered_deletions[max(stretch_len-length, 0):] )\n        _numbering[1] = [ (annotations[i], _regions[1][i][1]) for i in range(length) ]\n\n    #########\n    # CDR 1 # - divided in two parts in the Aho scheme.\n    ######### - gaps at 28 depending on the chain type.\n\n    # \"VH domains, as well as the majority of the VA domains, have a one-residue gap in position 28, VK and VB domains a two-residue\n    # gap in position 27 and 28.\"\n\n    # We use the link below as the reference for the scheme.\n    # https://www.bioc.uzh.ch/plueckthun/antibody/Numbering/Alignment.html\n\n    # Some of the header lines in these images are offset by one (VH)! The gaps really are centered at 28 and 36\n    # https://www.bioc.uzh.ch/plueckthun/antibody/Sequences/Rearranged/PDB_VK.html\n    # https://www.bioc.uzh.ch/plueckthun/antibody/Sequences/Rearranged/PDB_VL.html\n    # https://www.bioc.uzh.ch/plueckthun/antibody/Sequences/Rearranged/PDB_VH.html\n    # https://www.bioc.uzh.ch/plueckthun/antibody/Sequences/Rearranged/PDB_VA.html\n    # https://www.bioc.uzh.ch/plueckthun/antibody/Sequences/Rearranged/PDB_VB.html\n    # https://www.bioc.uzh.ch/plueckthun/antibody/Sequences/Rearranged/PDB_VG.html\n    # https://www.bioc.uzh.ch/plueckthun/antibody/Sequences/Rearranged/PDB_VD.html\n\n    # We gap the CDR1 in a heuristic way using the gaps. \n    # This means that CDR1 gapping will not always be correct. For example if one grafts a Kappa CDR1 loop onto a Lambda framework\n    # the gapping patter might now be incorrect. \n    # Not a fan of being so prescriptive.\n\n    # The CDR1 region included here ranges from AHo 25 to AHo 42 inclusive\n    \n    # The order in which the two loops are gapped is dependent on the chain type (see alignments in URLs above).\n    # Not all lengths are defined as not all lengths were crystallised in 2001 (or today). Where no example of the length was \n    # available the rule followed is to continue gapping the C terminal 'loop', then the N terminal 'loop', then 31 then the fw. \n    # In all cases I have commented where the gapping is undefined. Note that for alpha chains the gapping rules are inconsistent.\n\n    _L = 28,36,35,37,34,38,27,29,33,39,32,40,26,30,25,31,41,42\n    #                           |-> undefined by AHo. Gapping C terminal loop then N terminal then 31, then fw.                              \n    _K = 28,27,36,35,37,34,38,33,39,32,40,29,26,30,25,31,41,42\n    #                                 |-> undefined by AHo. Gapping C terminal loop then N terminal then fw.                              \n    _H = 28,36,35,37,34,38,27,33,39,32,40,29,26,30,25,31,41,42 \n    #                        |-> undefined by AHo. Gapping C terminal loop then N terminal then fw.                              \n    #                            N.B. The header on the alignment image for PDB_VH is offset by 1!\n    _A = 28,36,35,37,34,38,33,39,27,32,40,29,26,30,25,31,41,42    \n    #                              |-> undefined by AHo. Gapping C terminal loop then N terminal then fw.     \n    #                            N.B The gapping is inconsistent for alpha chains. I follow the paper's statement that most VA have\n    #                                one gap at 28 and remove 28 and 27 before removing 40. \n    _B = 28,36,35,37,34,38,33,39,27,32,40,29,26,30,25,31,41,42\n    #                              |-> undefined by AHo. Gapping C terminal loop then N terminal then 31, then fw.\n    _D = 28,36,35,37,34,38,27,33,39,32,40,29,26,30,25,31,41,42\n    #                         |-> undefined by AHo. Gapping C terminal loop then N terminal then 31, then fw.\n    #                         N.B only two sequence patterns available.                                \n    _G = 28,36,35,37,34,38,27,33,39,32,40,29,26,30,25,31,41,42\n    #                         |-> undefined by AHo. Gapping C terminal loop then N terminal then 31, then fw.\n    #                         N.B only one sequence patterns available. Delta copied.\n    \n    ordered_deletions = { 'L':_L,'K':_K, 'H':_H, 'A':_A, 'B':_B, 'D':_D, 'G':_G } \n\n    length = len( _regions[3] )\n\n    annotations = [ (i, ' ') for i in sorted( ordered_deletions[chain_type][ max(18-length, 0): ] ) ]\n\n    # Insertions are not described in the AHo scheme but must be included as there is a significant number of CDRH1s that are \n    # longer than the number of positions.\n    insertions = max( length-18 , 0 ) \n    if insertions > 26: \n        return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    elif insertions > 0:\n        # They are placed on residue 36 alphabetically.\n        insertat = annotations.index( (36, ' ') )+1 # Always 12 \n        assert insertat == 12, 'AHo numbering failed'  \n        annotations = annotations[:insertat] + [ (36, alphabet[a]) for a in range( insertions ) ] + annotations[insertat:]\n\n    _numbering[3] = [ (annotations[i], _regions[3][i][1]) for i in range(length) ]\n\n    #########\n    # CDR 2 #\n    #########\n    # Gaps are placed symetically at 63.\n    # For VA a second gap is placed at 74 and 75 according to the text in the paper. However, all the reference sequences show a\n    # gap at 73 and 74 see:\n    #      https://www.bioc.uzh.ch/plueckthun/antibody/Sequences/Rearranged/PDB_VA.html \n    # and \n    #      https://www.bioc.uzh.ch/plueckthun/antibody/Numbering/Alignment.html\n    # Either I am mis-interpreting the text in the paper or there is something a little inconsistent here...\n    # Given that *all* the numbered examples show the VA gap at 73 and 74 on the AAAAA website I have decided to implement this. \n    #\n    \n    # This region describes 58 to 77 inclusive\n    \n    if chain_type == 'A':\n        ordered_deletions = [74,73,63,62,64,61,65,60,66,59,67,58,68,69,70,71,72,75,76,77]\n    else:\n        ordered_deletions = [63,62,64,61,65,60,66,59,67,58,68,69,70,71,72,73,74,75,76,77]\n\n    length = len(_regions[5])\n\n    annotations = [ (i, ' ') for i in sorted( ordered_deletions[ max(20-length, 0): ] ) ]\n\n    # Insertions are not described in the AHo scheme but must be included.\n    insertions = max( length-20 , 0 ) \n    if insertions > 26: \n        return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    elif insertions > 0:\n        # They are placed on residue 63 alphabetically.\n        insertat = annotations.index( (63, ' ') )+1 # Always 6\n        assert insertat == 6, 'AHo numbering failed'  \n        annotations = annotations[:insertat] + [ (63, alphabet[a]) for a in range( insertions ) ] + annotations[insertat:]\n\n    _numbering[5] = [ (annotations[i], _regions[5][i][1]) for i in range(length) ]\n\n    #########\n    # FW3   ############################################\n    # Move deletions onto 86 then 85. Insertions on 85 #\n    ####################################################\n    ordered_deletions = [86,85,87,84,88,83,89,82,90,81,91,80,92,79,93,78]\n    length=len( _regions[7] )\n\n    annotations = [ (i, ' ') for i in sorted( ordered_deletions[ max(16-length, 0): ] ) ]\n\n    # Insertions are not described in the AHo scheme but must be included.\n    insertions = max( length-16 , 0 ) \n    if insertions > 26: \n        return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    elif insertions > 0:\n        # They are placed on residue 85 alphabetically.\n        insertat = annotations.index( (85, ' ') )+1 # Always 8\n        assert insertat == 8, 'AHo numbering failed'  \n        annotations = annotations[:insertat] + [ (85, alphabet[a]) for a in range( insertions ) ] + annotations[insertat:]\n\n    _numbering[7] = [ (annotations[i], _regions[7][i][1]) for i in range(length) ]\n\n\n    #########\n    # CDR 3 #\n    #########\n    # Deletions on 123. \n    # Point of the Aho scheme is that they have accounted for all possible positions.\n    # Assumption is that no more insertions will occur.... \n    # We'll put insertions on 123 linearly.(i.e.ABCDEF...) if they ever do.\n\n    ordered_deletions = [123,124,122,125,121,126,120,127,119,128,118,129,117,130,116,131,115,132,114,133,113,134,112,135,111,\n                         136,110,137,109,138,108,107]\n    \n    length=len( _regions[9] )\n\n    annotations = [ (i, ' ') for i in sorted( ordered_deletions[ max(32-length, 0): ] ) ]\n\n    # Insertions are not described in the AHo scheme but must be included.\n    insertions = max( length-32 , 0 ) \n    if insertions > 26: \n        return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    elif insertions > 0:\n        # They are placed on residue 123 alphabetically.\n        insertat = annotations.index( (123, ' ') )+1 # Always 17\n        assert insertat == 17, 'AHo numbering failed'  \n        annotations = annotations[:insertat] + [ (123, alphabet[a]) for a in range( insertions ) ] + annotations[insertat:]\n\n    _numbering[9] = [ (annotations[i], _regions[9][i][1]) for i in range(length) ]\n\n    # AHo includes one extra position than IMGT in what it considers the variable domain for light chains. \n    #If the last state is 148 and there is at least one more residue left, then add the residue to the numbering. \n    numbering = gap_missing( _numbering )\n    if len(numbering) > 0:\n        if numbering[-1][0] == (148, ' ') and numbering[-1][1] != '-' and endindex+1 < len(sequence):\n            numbering.append( ( (149, ' '), sequence[endindex+1]) )\n            endindex +=1\n\n    return numbering, startindex, endindex\n\n\n###########\n# Chothia #\n###########\n\n# Heavy chains\ndef number_chothia_heavy(state_vector, sequence):\n    \"\"\"\n    Apply the Chothia numbering scheme for heavy chains\n    \n    Rules should be implemented using two strings - the state string and the region string. \n\n    There are 128 states in the HMMs. Treat X as a direct match in Chothia scheme, I is an insertion.\n\n    XXXXXXXXXI XXXXXXXXXXXXX XXXXXXXIIIIXX XXXXXXXXXXXXXXXXXX XXXIXIIXXXX XXXXXXXIXXXXXXXXXXXXXXXXXXIIIXXXXXXXXXX XXXXXXXXIIIXX XXXXXXXXXXX'\n    1111111111 2222222222222 3333333333333 444444444444444444 55555555555 666666666666666666666666666666666666666 7777777777777 88888888888'     \n    \n    Regions - (N.B These do not match up with any particular definition of CDR)\n     1  -  Put the insertions at Chothia position 6\n     2  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     3  -  CDRH1 - 30 (inc) to 34 (exc) put insertions on 31\n     4  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     5  -  CDRH2 - 52 (inc) 58 (exc) put insertions on 52 \n     6  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     7  -  CDRH3 93 (inc) to 103 (exc) put insertion on 100\n     8  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n\n\n    Regions 1,3,5 and 7 are renumbered\n    \n    \"\"\"\n\n    # State string - 'X' means the imgt position exists in the scheme. 'I' means that it should be treated as an insertion of the previous number\n    state_string =  'XXXXXXXXXIXXXXXXXXXXXXXXXXXXXXIIIIXXXXXXXXXXXXXXXXXXXXXXXIXIIXXXXXXXXXXXIXXXXXXXXXXXXXXXXXXIIIXXXXXXXXXXXXXXXXXXIIIXXXXXXXXXXXXX'\n                    \n    # Region string - regions that should be treated separately in putting the numbering together \n    region_string = '11111111112222222222222333333333333333444444444444444455555555555666666666666666666666666666666666666666777777777777788888888888'\n\n    region_index_dict = {\"1\":0,\"2\":1,\"3\":2,\"4\":3,\"5\":4,\"6\":5,\"7\":6,\"8\":7}\n    \n    # Define how the scheme's numbering differs from IMGT at the start of each region. \n    # This is updated in the loop below\n    rels              =  {0:0, \n                         1:-1,\n                         2:-1,\n                         3:-5,\n                         4:-5,\n                         5:-8,\n                         6:-12,\n                         7:-15}    \n    \n    n_regions = 8\n    \n    exclude_deletions = [0,2,4,6] # Don't put deletions in these regions\n\n    _regions, startindex, endindex = _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions)\n    \n    \n    ###############\n    # Renumbering #\n    ###############\n\n    _numbering = [ [], _regions[1] , [], _regions[3] , [], _regions[5], [], _regions[7] ]\n    \n    # Chothia H region 1 (index 0)\n    # Insertions are placed at Chothia position 6.\n    # Count how many we recognised as insertion by the hmm\n    insertions = len( [ 1 for _ in _regions[0] if _[0][1] != \" \" ] ) \n    # We will place all insertion in this region at Chothia position 6.\n    if insertions:\n        start = _regions[0][0][0][0] # The starting Chothia number as found by the HMM (could easily start from 2 for example)\n        # I have a feeling this may be a source of a bug in very unusual cases. Can't break for now. Will catch mistakes in a validate function. \n        length = len( _regions[0] )\n        annotations = [ (_, \" \") for _ in range(start, 7) ] + [ (6, alphabet[_]) for _ in range(insertions) ] + [(7,\" \"),(8,\" \"),(9,\" \")]\n        _numbering[0] =  [ (annotations[i], _regions[0][i][1]) for i in range(length) ]\n    else:\n        _numbering[0] = _regions[0]\n\n    \n    # CDR1 \n    # Chothia H region 3 (index 2)\n    # put insertions onto 31\n    length = len( _regions[2] )\n    insertions = max(length - 11, 0) # Pulled back to the cysteine as heavily engineered cdr1's are not playing nicely\n\n    if insertions:\n        annotations = [(_, \" \") for _ in range(23,32)] + [(31, alphabet[i]) for i in range(insertions) ] + [(32,\" \"),(33,\" \")]\n    else:\n        annotations = [(_, \" \") for _ in range(23,32)][:length-2] + [(32,\" \"),(33,\" \")][:length]\n\n    _numbering[2] = [ (annotations[i], _regions[2][i][1]) for i in range(length) ]\n \n    # CDR2\n    # Chothia H region 5 (index 4) \n    # put insertions onto 52\n    length = len( _regions[4] )\n    # 50 to 57 inclusive\n    insertions = max(length - 8, 0) # Eight positions can be accounted for, the remainder are insertions\n    # Delete in the order, 52, 51, 50,53, 54 ,55, 56, 57\n    annotations  =  [(50, \" \"),(51, \" \"), (52, \" \")][:max(0,length-5)]\n    annotations += [(52, alphabet[i]) for i in range(insertions) ]\n    annotations += [(53, \" \"),(54, \" \"),(55, \" \"),(56, \" \"),(57, \" \")][ abs( min(0,length-5) ):]\n    _numbering[4] = [ (annotations[i], _regions[4][i][1]) for i in range(length) ]\n\n    # FW3 - insertions are annotated on 82. The first three are normal positions and annotated automatically. \n    # Additional insertions do not occur with the kabat or the chothia numbering scheme.\n    # It does not make sense to place more than A, B, C on 82 as Martin and AHo work show that this is not a place that accepts \n    # additional insertions. \n    # The decision here is to allow the alignment to place additional insertions. This is in contrast to Martin where the region\n    # is renumbered to place insertions on 72. \n     \n    # CDR3\n    # Chothia H region 7 (index 6) \n    # put insertions onto 100\n    length = len( _regions[6] )    \n    if length > 36: return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    annotations = get_cdr3_annotations(length, scheme=\"chothia\", chain_type=\"heavy\")\n    _numbering[6]  = [ (annotations[i], _regions[6][i][1]) for i in range(length)  ]\n\n    # Return the full vector and the start and end indices of the numbered region of the sequence\n    return gap_missing( _numbering ), startindex, endindex                                     \n\n# Light chains\ndef number_chothia_light(state_vector, sequence):\n    \"\"\"\n    Apply the Chothia numbering scheme for light chains\n    \n    Rules should be implemented using two strings - the state string and the region string. \n\n    There are 128 states in the HMMs. Treat X as a direct match in Chothia scheme, I is an insertion.\n    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX IIIIIIX XXXXXXXXXXXXXXXXXXXX XIIIIIIIXXX XXXXXIXXXXXXXIIXXXXXXXXXXXXXXXXXXXXXX XXXXXIIIIXX XXXXXXXXXXXXX\n    11111111111111111111111111111 2222222 33333333333333333333 44444444444 5555555555555555555555555555555555555 66666666666 7777777777777\n     \n    \n    Regions - (N.B These do not match up with any particular definition of CDR)\n     1  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     2  -  CDRL1 - 24 (inc) to 35 (exc) put insertions on 30\n     3  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     4  -  CDRL2 - 51 (inc) 55 (exc) put insertions on 52\n     5  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     6  -  CDRL3 89 (inc) to 98 (exc) put insertion on 95\n     7  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n    \n    Region 2, 3 and 5 are renumbered\n    \n    \"\"\"\n    \n    # Set up the numbering \n \n    # State string - 'X' means the imgt position exists in the scheme. 'I' means that it should be treated as an insertion of the previous number\n    state_string =  'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXIIIIIIXXXXXXXXXXXXXXXXXXXXXXIIIIIIIXXXXXXXXIXXXXXXXIIXXXXXXXXXXXXXXXXXXXXXXXXXXXIIIIXXXXXXXXXXXXXXX'\n                    \n    # Region string - regions that should be treated separately in putting the numbering together \n    region_string = '11111111111111111111111222222222222222223333333333333333444444444445555555555555555555555555555555555555666666666666677777777777'\n\n    region_index_dict = {\"1\":0,\"2\":1,\"3\":2,\"4\":3,\"5\":4,\"6\":5,\"7\":6}\n    \n    # Define how the scheme's numbering differs from IMGT at the start of each region. \n    # This is updated in the loop below\n    rels              =  {0:0, \n                         1: 0,\n                         2:-6,\n                         3:-6,\n                         4:-13,\n                         5:-16,\n                         6:-20,\n                         }    \n\n    \n    n_regions = 7\n    \n    exclude_deletions = [1,3,4,5]\n\n    _regions, startindex, endindex = _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions)\n    \n    _numbering = [ _regions[0], [], _regions[2], [], _regions[4], [], _regions[6] ]\n    \n    \n    ###############\n    # Renumbering #\n    ###############\n\n    # CDR1 \n    # Chothia L region 2 (index 1)\n    # put insertions onto 30\n    length = len( _regions[1] )\n    insertions = max(length - 11, 0) # Eleven positions can be accounted for, the remainder are insertions\n    # Delete forward from 31 \n    annotations  =  [(24, \" \"),(25, \" \"), (26, \" \"), (27, \" \"), (28, \" \"),(29, \" \"),(30, \" \")][:max(0,length)] \n    annotations += [(30, alphabet[i]) for i in range(insertions) ]\n    annotations += [(31, \" \"),(32, \" \"),(33, \" \"),(34, \" \")][ abs( min(0,length-11) ):] \n    _numbering[1] = [ (annotations[i], _regions[1][i][1]) for i in range(length) ]\n\n\n    # CDR2\n    # Chothia L region 4 (index 3) \n    # put insertions onto 52. \n    length = len( _regions[3] )\n    insertions = max( length - 4, 0 )\n    if insertions > 0:\n        annotations  = [(51, \" \"),(52, \" \")] + [(52, alphabet[i]) for i in range(insertions) ] + [(53, \" \"),(54, \" \")]\n        _numbering[3] = [ (annotations[i], _regions[3][i][1]) for i in range(length) ]\n    else: # How to gap L2 in Chothia/Kabat/Martin is unclear so we let the alignment do it.\n        _numbering[3] = _regions[3]\n    \n    # FW3\n    # Insertions on 68. First deletion 68. Otherwise default to alignment\n    length = len( _regions[4] )\n    insertions = max(length - 34, 0)\n    if insertions > 0: # Insertions on 68\n        annotations = [(i,\" \") for i in range(55,69)]+[(68, alphabet[i]) for i in range(insertions) ]+[(i,\" \") for i in range(69,89)]\n        _numbering[4] = [ (annotations[i], _regions[4][i][1]) for i in range(length) ]\n    elif length == 33: # First deletion on 68\n        annotations = [(i,\" \") for i in range(55,68)]+[(i,\" \") for i in range(69,89)]            \n        _numbering[4] = [ (annotations[i], _regions[4][i][1]) for i in range(length) ]\n    else: # More deletions - allow alignment to place them \n        _numbering[4] = _regions[4]\n\n\n    # CDR3\n    # Chothia L region 6 (index 5) \n    # put insertions onto 95\n    length = len( _regions[5] )    \n\n    if length > 35: return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    annotations = get_cdr3_annotations(length, scheme=\"chothia\", chain_type=\"light\")\n    _numbering[5]  = [ (annotations[i], _regions[5][i][1]) for i in range(length)  ]\n\n    # Return the full vector and the start and end indices of the numbered region of the sequence\n\n    return gap_missing( _numbering ), startindex, endindex    \n\n\n#########\n# Kabat #\n#########\n\n# Heavy chains\ndef number_kabat_heavy(state_vector, sequence):\n    \"\"\"\n    Apply the Kabat numbering scheme for heavy chains\n    \n    Rules should be implemented using two strings - the state string and the region string. \n\n    There are 128 states in the HMMs. Treat X as a direct match in Kabat scheme, I is an insertion.\n    XXXXXXXXXI XXXXXXXXXXXXXXXXXXXX IIIIXXXXXX XXXXXXXXXXXXXXXX XIXII XXXXXXXXXXXIXXXXXXXXXXXXXXXXXXIIIXXXXXXXXXXXX XXXXXXIII XXXXXXXXXXXXX\n    1111111111 22222222222222222222 3333333333 4444444444444444 55555 666666666666666666666666666666666666666666666 777777777 8888888888888\n     \n    \n    Regions - (N.B These do not match up with any particular definition of CDR)\n     1  -  Put the insertions at Chothia position 6\n     2  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     3  -  CDRH1 - 30 (inc) to 36 (exc) put insertions on 35\n     4  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     5  -  CDRH2 - 52 (inc) 58 (exc) put insertions on 52 \n     6  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     7  -  CDRH3 93 (inc) to 103 (exc) put insertion on 100\n     8  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n\n    \"\"\"\n \n    # Set up the numbering \n \n    # State string - 'X' means the imgt position exists in the scheme. 'I' means that it should be treated as an insertion of the previous number\n    state_string =  'XXXXXXXXXIXXXXXXXXXXXXXXXXXXXXIIIIXXXXXXXXXXXXXXXXXXXXXXXIXIIXXXXXXXXXXXIXXXXXXXXXXXXXXXXXXIIIXXXXXXXXXXXXXXXXXXIIIXXXXXXXXXXXXX'\n                    \n    # Region string - regions that should be treated separately in putting the numbering together \n    region_string = '11111111112222222222222333333333333333334444444444444455555555555666666666666666666666666666666666666666777777777777788888888888'\n\n    region_index_dict = {\"1\":0,\"2\":1,\"3\":2,\"4\":3,\"5\":4,\"6\":5,\"7\":6,\"8\":7}\n    \n    # Define how the scheme's numbering differs from IMGT at the start of each region. \n    # This is updated in the loop below\n    rels              =  {0:0, \n                         1:-1,\n                         2:-1,\n                         3:-5,\n                         4:-5,\n                         5:-8,\n                         6:-12,\n                         7:-15}    \n    \n    n_regions = 8\n    \n    exclude_deletions = [2,4,6]\n\n    _regions, startindex, endindex = _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions)\n    \n\n    ###############\n    # Renumbering #\n    ###############\n        \n    # Renumbering required for 0, 2, 4, 6 regions in Chothia heavy\n    \n    _numbering = [ [], _regions[1] , [], _regions[3] , [], _regions[5], [], _regions[7] ]\n\n\n    # Kabat H region 1 (index 0)\n    # Insertions are placed at Kabat position 6.\n    # Count how many we recognised as insertion by the hmm\n    insertions = len( [ 1 for _ in _regions[0] if _[0][1] != \" \" ] ) \n    # We will place all insertion in this region at Kabat position 6.\n    if insertions:\n        start = _regions[0][0][0][0] # The starting Kabat number as found by the HMM (could easily start from 2 for example)\n        # I have a feeling this may be a source of a bug in very unusual cases. Can't break for now. Will catch mistakes in a validate function. \n        length = len( _regions[0] )\n        annotations = [ (_, \" \") for _ in range(start, 7) ] + [ (6, alphabet[_]) for _ in range(insertions) ] + [(7,\" \"),(8,\" \"),(9,\" \")]\n        _numbering[0] =  [ (annotations[i], _regions[0][i][1]) for i in range(length) ]\n    else:\n        _numbering[0] = _regions[0]\n    \n    \n    # CDR1 \n    # Kabat H region 3 (index 2)\n    # Put insertions onto 35. Delete from 35 backwards\n    length = len( _regions[2] )\n    insertions = max(0,length - 13)\n    annotations = [(_,' ') for _ in range(23, 36)][:length] \n    annotations += [(35, alphabet[i]) for i in range(insertions) ]\n    _numbering[2] = [ (annotations[i], _regions[2][i][1]) for i in range(length) ]\n \n    # CDR2\n    # Chothia H region 5 (index 4) \n    # put insertions onto 52\n    length = len( _regions[4] )\n    # 50 to 57 inclusive\n    insertions = max(length - 8, 0) # Eight positions can be accounted for, the remainder are insertions\n    # Delete in the order, 52, 51, 50,53, 54 ,55, 56, 57\n    annotations  =  [(50, \" \"),(51, \" \"), (52, \" \")][:max(0,length-5)]\n    annotations += [(52, alphabet[i]) for i in range(insertions) ]\n    annotations += [(53, \" \"),(54, \" \"),(55, \" \"),(56, \" \"),(57, \" \")][ abs( min(0,length-5) ):]\n    _numbering[4] = [ (annotations[i], _regions[4][i][1]) for i in range(length) ]\n\n    # FW3 - insertions are annotated on 82. The first three are normal positions and annotated automatically. \n    # Additional insertions do not occur with the kabat or the chothia numbering scheme.\n    # It does not make sense to place more than A, B, C on 82 as Martin and AHo work show that this is not a place that accepts \n    # additional insertions. \n    # The decision here is to allow the alignment to place additional insertions. This is in contrast to Martin where the region\n    # is renumbered to place insertions on 72. \n     \n    # CDR3\n    # Chothia H region 7 (index 6) \n    # put insertions onto 100\n    length = len( _regions[6] )    \n    if length > 36: return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    annotations = get_cdr3_annotations(length, scheme=\"kabat\", chain_type=\"heavy\") #  Chothia and Kabat the same here\n    _numbering[6]  = [ (annotations[i], _regions[6][i][1]) for i in range(length)  ]\n\n    # Return the full vector and the start and end indices of the numbered region of the sequence\n    return gap_missing( _numbering ), startindex, endindex            \n           \n# Light chains    \ndef number_kabat_light(state_vector, sequence):\n    \"\"\"\n    Apply the Kabat numbering scheme for light chains\n    \n    Rules should be implemented using two strings - the state string and the region string. \n\n    There are 128 states in the HMMs. Treat X as a direct match in Kabat scheme, I is an insertion.\n    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX IIIIIIX XXXXXXXXXXXXXXXXXXXX XIIIIIIIXXX XXXXXIXXXXXXXIIXXXXXXXXXXXXXXXXXXXXXX XXXXXIIIIXX XXXXXXXXXXXXX\n    11111111111111111111111111111 2222222 33333333333333333333 44444444444 5555555555555555555555555555555555555 66666666666 7777777777777\n     \n    \n    Regions - (N.B These do not match up with any particular definition of CDR)\n     1  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     2  -  CDRL1 - 24 (inc) to 35 (exc) put insertions on 27\n     3  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     4  -  CDRL2 - 51 (inc) 55 (exc) put insertions on 52\n     5  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     6  -  CDRL3 89 (inc) to 96 (exc) put insertion on 95\n     7  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n    \n    \"\"\"\n    \n    # Set up the numbering \n \n \n    # State string - 'X' means the imgt position exists in the scheme. 'I' means that it should be treated as an insertion of the previous number\n    state_string =  'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXIIIIIIXXXXXXXXXXXXXXXXXXXXXXIIIIIIIXXXXXXXXIXXXXXXXIIXXXXXXXXXXXXXXXXXXXXXXXXXXXIIIIXXXXXXXXXXXXXXX'\n                    \n    # Region string - regions that should be treated separately in putting the numbering together \n    region_string = '11111111111111111111111222222222222222223333333333333333444444444445555555555555555555555555555555555555666666666666677777777777'\n    \n    region_index_dict = {\"1\":0,\"2\":1,\"3\":2,\"4\":3,\"5\":4,\"6\":5,\"7\":6}\n    \n    # Define how the scheme's numbering differs from IMGT at the start of each region. \n    # This is updated in the loop below\n    rels              =  {0:0, \n                         1: 0,\n                         2:-6,\n                         3:-6,\n                         4:-13,\n                         5:-16,\n                         6:-20,\n                         }    \n    \n    n_regions = 7\n    \n    exclude_deletions = [1,3,5]\n\n    _regions, startindex, endindex = _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions)\n    \n    _numbering = [ _regions[0], [], _regions[2], [], _regions[4], [], _regions[6] ]\n    \n    \n    ###############\n    # Renumbering #\n    ###############\n    \n    # CDR1 \n    # Kabat L region 2 (index 1)\n    # put insertions onto 27\n    length = len( _regions[1] )\n    insertions = max(length - 11, 0) # Eleven positions can be accounted for, the remainder are insertions\n    # Delete forward from 28 \n    annotations  =  [(24, \" \"),(25, \" \"), (26, \" \"), (27, \" \")][:max(0,length)] \n    annotations += [(27, alphabet[i]) for i in range(insertions) ]\n    annotations += [(28, \" \"),(29, \" \"),(30, \" \"),(31, \" \"),(32, \" \"),(33, \" \"),(34, \" \")][ abs( min(0,length-11) ):] \n    _numbering[1] = [ (annotations[i], _regions[1][i][1]) for i in range(length) ]\n  \n    # CDR2\n    # Chothia L region 4 (index 3) \n    # put insertions onto 52. \n    length = len( _regions[3] )\n    insertions = max( length - 4, 0 )\n    if insertions > 0:\n        annotations  = [(51, \" \"),(52, \" \")] + [(52, alphabet[i]) for i in range(insertions) ] + [(53, \" \"),(54, \" \")]\n        _numbering[3] = [ (annotations[i], _regions[3][i][1]) for i in range(length) ]\n    else: # How to gap L2 in Chothia/Kabat/Martin is unclear so we let the alignment do it.\n        _numbering[3] = _regions[3]\n\n\n    # FW3\n    # All insertions are placed by alignment. This is in contrast to Martin (and Chothia) where they are placed on 68. \n    # The kabat scheme was defined using a sequence alignment alone. In keeping with this, insertions in FW3 are also only placed\n    # with respect to the sequence alignment (the HMM).\n\n    # CDR3\n    # Chothia L region 6 (index 5) \n    # put insertions onto 95\n    length = len( _regions[5] )    \n\n    if length > 35: return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    annotations = get_cdr3_annotations(length, scheme=\"kabat\", chain_type=\"light\")\n    _numbering[5]  = [ (annotations[i], _regions[5][i][1]) for i in range(length)  ]\n\n    return gap_missing( _numbering ), startindex, endindex    \n\n\n\n\n#############################\n# Martin (extended Chothia) #\n#############################\n\n# Heavy chains\ndef number_martin_heavy(state_vector, sequence):\n    \"\"\"\n    Apply the Martin (extended Chothia) numbering scheme for heavy chains\n    \n    Rules should be implemented using two strings - the state string and the region string. \n\n    There are 128 states in the HMMs. Treat X as a direct match in Martin scheme, I is an insertion.\n    XXXXXXXXXI XXXXXXXXXXXXXXXXXXXX IIIIXX XXXXXXXXXXXXXXXXXXXX XIXII XXXXXXXXXXXIXXXXXXXXIIIXXXXXXXXXXXXXXXXXXXXXX XXXXXXIII XXXXXXXXXXXXX\n    1111111111 22222222222222222222 333333 44444444444444444444 55555 666666666666666666666666666666666666666666666 777777777 8888888888888\n     \n    \n    Regions - (N.B These do not match up with any particular definition of CDR)\n     1  -  Put the insertions at Chothia position 8\n     2  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     3  -  CDRH1 - 30 (inc) to 34 (exc) put insertions on 31\n     4  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     5  -  CDRH2 - 52 (inc) 58 (exc) put insertions on 52 \n     6  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     7  -  CDRH3 93 (inc) to 103 (exc) put insertion on 100\n     8  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n\n\n    Regions 1,3,5 and 7 are renumbered\n    \n    \"\"\"\n \n    # Set up the numbering \n \n \n    # State string - 'X' means the imgt position exists in the scheme. 'I' means that it should be treated as an insertion of the previous number\n    state_string =  'XXXXXXXXXIXXXXXXXXXXXXXXXXXXXXIIIIXXXXXXXXXXXXXXXXXXXXXXXIXIIXXXXXXXXXXXIXXXXXXXXIIIXXXXXXXXXXXXXXXXXXXXXXXXXXXXIIIXXXXXXXXXXXXX'\n                    \n    # Region string - regions that should be treated separately in putting the numbering together \n    region_string = '11111111112222222222222333333333333333444444444444444455555555555666666666666666666666666666666666666666777777777777788888888888'\n    \n    region_index_dict = {\"1\":0,\"2\":1,\"3\":2,\"4\":3,\"5\":4,\"6\":5,\"7\":6,\"8\":7}\n    \n    # Define how the scheme's numbering differs from IMGT at the start of each region. \n    # This is updated in the loop below\n    rels              =  {0:0, \n                         1:-1,\n                         2:-1,\n                         3:-5,\n                         4:-5,\n                         5:-8,\n                         6:-12,\n                         7:-15}    \n    \n    n_regions = 8\n    \n    exclude_deletions = [2,4,5,6]\n\n    _regions, startindex, endindex = _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions)\n    \n\n    ###############\n    # Renumbering #\n    ###############\n        \n    # Renumbering required for 0, 2, 4, 6 regions in Chothia heavy\n    \n    _numbering = [ [], _regions[1] , [], _regions[3] , [], _regions[5], [], _regions[7] ]\n    \n    # Chothia H region 1 (index 0)\n    # Insertions are placed at Chothia position 8.\n    # Count how many we recognised as insertion by the hmm\n    insertions = len( [ 1 for _ in _regions[0] if _[0][1] != \" \" ] ) \n    # We will place all insertion in this region at Chothia position 8.\n    if insertions:\n        start = _regions[0][0][0][0] # The starting Chothia number as found by the HMM (could easily start from 2 for example)\n        # I have a feeling this may be a source of a bug in very unusual cases. Can't break for now. Will catch mistakes in a validate function. \n        length = len( _regions[0] )\n        annotations = [ (_, \" \") for _ in range(start, 9) ] + [ (8, alphabet[_]) for _ in range(insertions) ] + [(9,\" \")]\n        _numbering[0] =  [ (annotations[i], _regions[0][i][1]) for i in range(length) ]\n    else:\n        _numbering[0] = _regions[0]\n\n    \n    # CDR1 \n    # Chothia H region 3 (index 2)\n    # put insertions onto 31\n    length = len( _regions[2] )\n    insertions = max(length - 11, 0) # Pulled back to the cysteine as heavily engineered cdr1's are not playing nicely\n    if insertions:\n        annotations = [(_, \" \") for _ in range(23,32)] + [(31, alphabet[i]) for i in range(insertions) ] + [(32,\" \"),(33,\" \")]\n    else:\n        annotations = [(_, \" \") for _ in range(23,32)][:length-2] + [(32,\" \"),(33,\" \")][:length]\n    _numbering[2] = [ (annotations[i], _regions[2][i][1]) for i in range(length) ]\n \n    # CDR2\n    # Chothia H region 5 (index 4) \n    # put insertions onto 52\n    length = len( _regions[4] )\n    # 50 to 57 inclusive\n    insertions = max(length - 8, 0) # Eight positions can be accounted for, the remainder are insertions\n    # Delete in the order, 52, 51, 50,53, 54 ,55, 56, 57\n    annotations  =  [(50, \" \"),(51, \" \"), (52, \" \")][:max(0,length-5)]\n    annotations += [(52, alphabet[i]) for i in range(insertions) ]\n    annotations += [(53, \" \"),(54, \" \"),(55, \" \"),(56, \" \"),(57, \" \")][ abs( min(0,length-5) ):]\n    _numbering[4] = [ (annotations[i], _regions[4][i][1]) for i in range(length) ]\n\n    # FW3 \n    # Place all insertions on 72 explicitly.\n    # This is in contrast to Chothia implementation where 3 insertions are on 82 and then further insertions are placed by the \n    # alignment\n    # Gaps are placed according to the alignment. \n    length = len( _regions[5] )\n    insertions = max(length - 35, 0)\n    if insertions > 0: # Insertions on 72\n        annotations = [(i,' ') for i in range(58,73)]+[(72, alphabet[i]) for i in range(insertions) ]+[(i,' ') for i in range(73,93)]\n        _numbering[5] = [ (annotations[i], _regions[5][i][1]) for i in range(length) ]\n    else: # Deletions - all alignment to place them. \n        _numbering[4] = _regions[4]\n\n     \n    # CDR3\n    # Chothia H region 7 (index 6) \n    # put insertions onto 100\n    length = len( _regions[6] )    \n    if length > 36: return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    annotations = get_cdr3_annotations(length, scheme=\"chothia\", chain_type=\"heavy\")\n    _numbering[6]  = [ (annotations[i], _regions[6][i][1]) for i in range(length)  ]\n\n    # Return the full vector and the start and end indices of the numbered region of the sequence\n    return gap_missing( _numbering ), startindex, endindex                                    \n\n# Light chains\ndef number_martin_light(state_vector, sequence):\n    \"\"\"\n    Apply the Martin numbering scheme for light chains\n    \n    Rules should be implemented using two strings - the state string and the region string. \n\n    There are 128 states in the HMMs. Treat X as a direct match in Martin scheme, I is an insertion.\n    XXXXXXXXXXXXXXXXXXXXXXXXXXXXX IIIIIIX XXXXXXXXXXXXXXXXXXXX XIIIIIIIXXX XXXXXIXXXXXXXIIXXXXXXXXXXXXXXXXXXXXXX XXXXXIIIIXX XXXXXXXXXXXXX\n    11111111111111111111111111111 2222222 33333333333333333333 44444444444 5555555555555555555555555555555555555 66666666666 7777777777777\n     \n    \n    Regions - (N.B These do not match up with any particular definition of CDR)\n     1  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     2  -  CDRL1 - 30 (inc) to 31 (exc) put insertions on 30\n     3  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     4  -  CDRL2 - 51 (inc) 55 (exc) put insertions on 52 \n     5  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     6  -  CDRL3 89 (inc) to 96 (exc) put insertion on 95\n     7  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n    \n    Region 2, 3 and 5 are renumbered\n    \n    \"\"\"\n    \n    # The Martin and Chothia specification for light chains are very similar. Martin is more explicit in the location of indels \n    # but unlike the heavy chain these are additional instead of changes to the Chothia scheme. Thus, Chothia light is implemented\n    # as martin light.\n    return number_chothia_light(state_vector,sequence)\n\n\n###########\n# Wolfguy #\n###########\n# The Wolfguy numbering scheme is an in-house scheme used at Roche. It has been described publicly in the paper:\n# Prediction of VH-VL domain orientation for antibody variable domain modeling. Bujotzek A. et al. Protein 2015 83(4) 681-95\n#\n# It is similar in gapping as IMGT and is defined only for heavy and light antibody chains. \n# Unlike other schemes the numbering denotes both the chain (heavy 101-499, light 501-799) and the region (less than -50 framework\n# greater than -50 CDR). All CDRs of length less than 50 can be handled without the need for insertion codes. Numbering of the \n# framework behaves similarly to IMGT in that all positions are assumed to be accounted for. Framework insertions are placed by \n# the alignment. \n#\n# Numbering of all CDRs is performed symmetrically with the exception of CDRL1. In this case the CDR is numbered according to a \n# pattern specific to the canonical class. This is recognised by length and by sequence similarity to a consensus sequence. If a \n# length has not been observed it is numbered symmetrically. \n\n\ndef number_wolfguy_heavy(state_vector, sequence):\n    \"\"\"\n    Apply the wolfguy numbering scheme for heavy chains \n\n    The scheme numbers the sequence using different segments so that the numbering tells you\n    where in the antibody the sequence is describing. \n\n    XXXXXXXXXIXXXXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXIX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXX\n    11111111111111111111111111 22222222222222 33333333333333 44444444444444444444 555555555555555555555555555555 6666666666666 77777777777'\n    \n    Regions - (N.B These do not match up with any particular definition of CDR)\n     1  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     2  -  CDRH1 - 155-199 (inc). Gap symmetrically about 175-176.\n     3  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     4  -  CDRH2 - 251-299 (inc). Gap symmetrically about 271-272, then gap back from 294.\n     5  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     6  -  CDRH3 331,332 and 351-399 (inc). Gap according to the  \n     7  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n    \n     Start gaps on rhs each time.\n    \"\"\"\n    # Set up the numbering \n \n    # State string - 'X' means the imgt position exists in the scheme. 'I' means that it should be treated as an insertion of the previous number\n    state_string =  'XXXXXXXXXIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n\n    # Region string - regions that should be treated separately in putting the numbering together \n    region_string = '11111111111111111111111111222222222222223333333333333344444444444444444444555555555555555555555555555555666666666666677777777777'\n\n    region_index_dict = {\"1\":0,\"2\":1,\"3\":2,\"4\":3,\"5\":4,\"6\":5,\"7\":6}\n    \n    # Define how the scheme's numbering differs from IMGT at the start of each region. \n    # This is updated in the loop below\n    rels              =  {0:100, \n                         1:124,\n                         2:160,\n                         3:196,\n                         4:226,\n                         5:244,\n                         6:283}    \n    \n    n_regions = 7\n    \n    exclude_deletions = [1,3,5]\n\n    _regions, startindex, endindex = _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions)\n    \n    ###############\n    # Renumbering #\n    ###############\n        \n    # Renumbering required for 1, 3, 5 regions in wolfguy heavy    \n    _numbering = [ _regions[0], [] , _regions[2], [], _regions[4] , [], _regions[6] ]\n\n    # CDRH1\n    # Delete symmetrically about 177. Delete right first.\n    # May have to change this to reflect where the point of symmetry is\n    ordered_deletions = [151]\n    for p1,p2 in zip( list(range(152,176)), list(range(199, 175,-1))): ordered_deletions += [ p1,p2 ]\n    length = len( _regions[1] )\n    annotations = sorted(ordered_deletions[:length])\n    _numbering[1]  = [ ((annotations[i],\" \"), _regions[1][i][1]) for i in range(length)  ]\n    \n    # CDRH2\n    # Delete symmetrically about 271. Delete right first.\n    # Then delete right from 288\n    ordered_deletions = [251]\n    for p1,p2 in zip( list(range(252,271)), list(range(290, 271,-1))): ordered_deletions += [ p1,p2 ]\n    ordered_deletions.append( 271 )\n    ordered_deletions = list(range( 299, 290, -1)) + ordered_deletions\n    length = len( _regions[3] )\n    annotations = sorted(ordered_deletions[:length])\n    _numbering[3]  = [ ((annotations[i],\" \"), _regions[3][i][1]) for i in range(length)  ]\n\n    # CDRH3\t\n    # Delete symmetrically about 374. Delete right first. \n    # Scheme changes at length 8\n    # Scheme changes at length 12\n    ordered_deletions = []\n    for p1,p2 in zip( list(range(356,374)), list(range(391, 373,-1))): ordered_deletions += [ p1,p2 ]\n    ordered_deletions = [ 354, 394, 355, 393, 392 ] + ordered_deletions \n    ordered_deletions = [331,332] + [ 399, 398, 351, 352, 397, 353, 396, 395 ] + ordered_deletions\n    length = len( _regions[5] )\n\n    if length > len(ordered_deletions): return [], startindex, endindex # Too many insertions. Do not apply numbering.     \n    annotations = sorted(ordered_deletions[:length])\n    _numbering[5]  = [ ((annotations[i],\" \"), _regions[5][i][1]) for i in range(length)  ]    \n  \n    # Return the full vector and the start and end indices of the numbered region of the sequence\n    return sum( _numbering, [] ), startindex, endindex   \n            \n\ndef number_wolfguy_light(state_vector, sequence):\n    \"\"\"\n    Apply the wolfguy numbering scheme for light chains \n\n    The scheme numbers the sequence using different segments so that the numbering tells you\n    where in the antibody the sequence is describing. \n\n    XXXXXXX XXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXIXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXX\n    1111111 AAA BBBBBBBBBBBBB 22222222222222222 333333333333333 44444444444444 55555555555 6666 77777777777777777777 8888888888888 99999999999\n\n    Regions - (N.B These do not match up with any particular definition of CDR)\n     1  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     A  -  Move indels onto 508\n     B  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     2  -  CDRL1 - 551-599 (inc). Assign via the matching consensus sequence and length.\n     3  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     4  -  CDRL2 - 651-699 (inc). Gap about 673 then right from 694\n     5  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     6  -  Move indels onto 713 and 714\n     7  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n     8  -  CDRL3 751-799 (inc). Gap symmetrically about 374-375 \n     9  -  Simple mapping (treat \"I\" states as inserts and not own match states)\n    \n    \"\"\"\n    # Set up the numbering \n \n    # State string - 'X' means the imgt position exists in the scheme. 'I' means that it should be treated as an insertion of the previous number\n    state_string =  'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n                    \n    # Region string - regions that should be treated separately in putting the numbering together \n    region_string = '1111111AAABBBBBBBBBBBBB222222222222222223333333333333334444444444444455555555555666677777777777777777777888888888888899999999999'\n\n    region_index_dict = {\"1\":0,\"A\":1,\"B\":2,\"2\":3,\"3\":4,\"4\":5,\"5\":6,\"6\":7,\"7\":8,\"8\":9,\"9\":10}\n    \n    # Define how the scheme's numbering differs from IMGT at the start of each region. \n    # This is updated in the loop below\n    rels              =  {0:500,\n                         1:500,\n                         2:500,    \n                         3:527,\n                         4:560,\n                         5:595,\n                         6:631,\n                         7:630,\n                         8:630,                                                  \n                         9:646,\n                         10:683}    \n    \n    n_regions = 11\n    \n    exclude_deletions = [1,3,5,7,9]\n\n    _regions, startindex, endindex = _number_regions(sequence, state_vector, state_string , region_string,  region_index_dict, rels, n_regions, exclude_deletions)\n    \n    ###############\n    # Renumbering #\n    ###############\n        \n    # Renumbering required for 1, 3, 5 regions in wolfguy heavy    \n    _numbering = [ _regions[0], [], _regions[2], [] , _regions[4], [], _regions[6], [], _regions[8], [], _regions[10] ]\n\n\n    # Gaps in the first section go 508 instead of the imgt 510 equivalent\n    length = len(_regions[1] )\n    annotations = sorted([ (510,' '), (509, ' '), (508, ' ')][ :length ] + [(508,a) for a in alphabet[:max(0, length-3)]])  \n    _numbering[1]  = [ (annotations[i], _regions[1][i][1]) for i in range(length)  ]\n    \n    # CDRL1\n    # Number by predicting the canonical \n    length = len(_regions[3] )\n    annotations = _get_wolfguy_L1( _regions[3], length)\n    _numbering[3]  = [ ((annotations[i],\" \"), _regions[3][i][1]) for i in range(length)  ]\n    \n    # CDRL2\n    # Delete about 673. Finally delete right from 694. Maintain 651 as the last deletion\n    ordered_deletions = []\n    for p1,p2 in zip( list(range(652,673)), list(range(694, 672,-1))): ordered_deletions += [ p2,p1 ]\n    ordered_deletions = [651] + list(range( 699, 694, -1)) + ordered_deletions + [673]\n\n    length = len( _regions[5] )\n    annotations = sorted(ordered_deletions[:length])\n    _numbering[5]  = [ ((annotations[i],\" \"), _regions[5][i][1]) for i in range(length)  ]\n\n\n    # The placement of the indel in wolfguy is different to that in imgt\n    length = len( _regions[7] )\n    insertions = max( 0, length - 4 )\n    annotations = [(711, ' '), (712, ' '), (713, ' '), (714, ' ')][:length] + [ (714, a) for a in alphabet[:insertions] ]    \n    _numbering[7]  = [ (annotations[i], _regions[7][i][1]) for i in range(length)  ]  \n    \n    # CDRL3\n    # Delete symmetrically about 775. Delete right first. Finally delete 798 and 799\n    ordered_deletions = []\n    for p1,p2 in zip( list(range(751,775)), list(range(799, 775,-1))): ordered_deletions += [ p1,p2 ]\n    ordered_deletions.append( 775 )\n  \n    length = len( _regions[9] )\n    if length > len(ordered_deletions): return [], startindex, endindex # Too many insertions. Do not apply numbering. \n    annotations = sorted(ordered_deletions[:length])\n    _numbering[9]  = [ ((annotations[i],\" \"), _regions[9][i][1]) for i in range(length)  ]  \n  \n    # Return the full vector and the start and end indices of the numbered region of the sequence\n    return sum( _numbering, [] ), startindex, endindex  \n\n\ndef _get_wolfguy_L1(seq, length):\n    \"\"\"\n    Wolfguy's L1 annotation is based on recognising the length and the sequence pattern defined\n    by a set of rules. If the length has not been characterised, we number symmetrically about the\n    middle of the loop.\n    \"\"\"\n    \n    # These are the annotations for different lengths of L1 according to the wolfguy definitions.\n    L1_sequences = {\n    9: [['9',     'XXXXXXXXX', [551, 552, 554, 556, 563, 572, 597, 598, 599]]], \n    10: [['10',   'XXXXXXXXXX', [551, 552, 553, 556, 561, 562, 571, 597, 598, 599]]], \n    11: [['11a',  'RASQDISSYLA', [551, 552, 553, 556, 561, 562, 571, 596, 597, 598, 599]], \n         ['11b',  'GGNNIGSKSVH', [551, 552, 554, 556, 561, 562, 571, 572, 597, 598, 599]], \n         ['11b.2','SGDQLPKKYAY', [551, 552, 554, 556, 561, 562, 571, 572, 597, 598, 599]]], \n    12: [['12a',  'TLSSQHSTYTIE', [551, 552, 553, 554, 555, 556, 561, 563, 572, 597, 598, 599]], \n         ['12b',  'TASSSVSSSYLH', [551, 552, 553, 556, 561, 562, 571, 595, 596, 597, 598, 599]], \n         ['12c',  'RASQSVxNNYLA', [551, 552, 553, 556, 561, 562, 571, 581, 596, 597, 598, 599]], \n         ['12d',  'rSShSIrSrrVh', [551, 552, 553, 556, 561, 562, 571, 581, 596, 597, 598, 599]]], \n    13: [['13a',  'SGSSSNIGNNYVS', [551, 552, 554, 555, 556, 557, 561, 562, 571, 572, 597, 598, 599]], \n         ['13b',  'TRSSGSLANYYVQ', [551, 552, 553, 554, 556, 561, 562, 563, 571, 572, 597, 598, 599]]], \n    14: [['14a',  'RSSTGAVTTSNYAN', [551, 552, 553, 554, 555, 561, 562, 563, 564, 571, 572, 597, 598, 599]], \n         ['14b',  'TGTSSDVGGYNYVS', [551, 552, 554, 555, 556, 557, 561, 562, 571, 572, 596, 597, 598, 599]]], \n    15: [['15',   'XXXXXXXXXXXXXXX', [551, 552, 553, 556, 561, 562, 563, 581, 582, 594, 595, 596, 597, 598, 599]]], \n    16: [['16',   'XXXXXXXXXXXXXXXX', [551, 552, 553, 556, 561, 562, 563, 581, 582, 583, 594, 595, 596, 597, 598, 599]]], \n    17: [['17',   'XXXXXXXXXXXXXXXXX', [551, 552, 553, 556, 561, 562, 563, 581, 582, 583, 584, 594, 595, 596, 597, 598, 599]]]\n    }    \n\n    if length in L1_sequences: # Use the pre-defined motif \n        # Find the maximum scoring canonical form for this length. \n        curr_max = None, -10000\n        for canonical in L1_sequences[length]:\n            sub_score = 0\n            for i in range( length ):\n                try:\n                    sub_score += blosum62[ (seq[i][1].upper(), canonical[1][i].upper() ) ]\n                except KeyError:\n                    sub_score += blosum62[ (canonical[1][i].upper(), seq[i][1].upper() ) ]\n            if sub_score > curr_max[1]:\n                curr_max = canonical, sub_score\n\n        # return the annotations\n        return curr_max[0][2]\n    else: # Use a symmetric numbering about the anchors.\n        ordered_deletions = []\n        for p1,p2 in zip( list(range(551,575)), list(range(599, 575,-1))): ordered_deletions += [ p2,p1 ]\n        ordered_deletions.append(575)\n        return sorted( ordered_deletions[:length] )\n\ndef gap_missing( numbering ):\n    '''\n    Place gaps when a number is missing. All except wolfguy are continuously numbered\n    '''\n    # Gaps placed where a number is not present\n    num = [ ((0,' '),'-') ]\n    for p, a in sum( numbering, [] ):  \n        if p[0] > num[-1][0][0]+1:\n            for _i in range( num[-1][0][0]+1, p[0] ):\n                num.append( ((_i, ' '), '-' ) )\n        num.append( (p,a) )\n    return num[1:]\n\n\n######################\n# Annotation of CDR3 #\n######################\n    \ndef get_cdr3_annotations(length, scheme=\"imgt\", chain_type=\"\"):\n    \"\"\"\n    Given a length of a cdr3 give back a list of the annotations that should be applied to the sequence.\n    \n    This function should be depreciated\n    \"\"\"\n    az = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" \n    za = \"ZYXWVUTSRQPONMLKJIHGFEDCBA\"\n    \n    if scheme==\"imgt\":\n        start, end = 105, 118 # start (inclusive) end (exclusive)\n        annotations = [None for _ in range(max(length,13))]\n        front = 0\n        back  = -1\n        assert (length-13) < 50, \"Too many insertions for numbering scheme to handle\" # We ran out of letters.\n        for i in range(min(length,13)):\n            if i%2:\n                annotations[back] = (end+back, \" \")\n                back -= 1\n            else:\n                annotations[front] = (start+front, \" \")\n                front += 1\n        for i in range(max(0,length-13)): # add insertions onto 111 and 112 in turn\n            if i%2:\n                annotations[back] = (112, za[back+6])\n                back-=1\n            else:\n                annotations[front] = (111, az[front-7])\n                front +=1        \n        return annotations\n\n    elif scheme in [ \"chothia\", \"kabat\"] and chain_type==\"heavy\": # For chothia and kabat\n        # Number forwards from 93\n        insertions = max(length - 10, 0)\n        assert insertions < 27, \"Too many insertions for numbering scheme to handle\" # We ran out of letters.\n        ordered_deletions = [ (100, ' '), (99,' '), (98,' '), (97,' '), (96,' '), (95,' '), (101,' '),(102,' '),(94,' '), (93,' ') ]\n        annotations = sorted( ordered_deletions[ max(0, 10-length): ] + [ (100,a) for a in az[:insertions ] ] )\n        return annotations\n\n    elif scheme in [ \"chothia\", \"kabat\"] and chain_type==\"light\":\n        # Number forwards from 89\n        insertions = max(length - 9, 0)\n        assert insertions < 27, \"Too many insertions for numbering scheme to handle\" # We ran out of letters.\n        ordered_deletions = [ (95,' '),(94,' '),(93,' '),( 92,' '),(91,' '),(96,' '),(97,' '),(90,' '),(89,' ') ]\n        annotations = sorted( ordered_deletions[ max(0, 9-length): ] + [ (95,a) for a in az[:insertions ] ] )\n        return annotations\n\n    else:\n        raise AssertionError(\"Unimplemented scheme\")\n\n"
  },
  {
    "path": "requirements.txt",
    "content": "biopython\n"
  },
  {
    "path": "setup.py",
    "content": "import shutil, os, subprocess\nimport site, sys\nfrom importlib import util\nfrom distutils.core import setup\nfrom setuptools.command.install import install\n\nclass CustomInstallCommand(install):\n   def run(self):\n       install.run(self)\n       # Post-installation routine\n       ANARCI_LOC = os.path.join(site.getsitepackages()[0], 'anarci') # site-packages/ folder\n       ANARCI_BIN = sys.executable.split('python')[0] # bin/ folder\n\n       shutil.copy('bin/ANARCI', ANARCI_BIN) # copy ANARCI executable\n       print(\"INFO: ANARCI lives in: \", ANARCI_LOC) \n\n       # Build HMMs from IMGT germlines\n       os.chdir(\"build_pipeline\")\n       print('INFO: Downloading germlines from IMGT and building HMMs...')\n       print(\"INFO: running 'RUN_pipeline.sh', this will take a couple a minutes.\")\n       proc = subprocess.Popen([\"bash\", \"RUN_pipeline.sh\"], stdout = subprocess.PIPE, stderr = subprocess.PIPE)\n       o, e = proc.communicate()\n\n       print(o.decode())\n       print(e.decode())\n       \n       # Copy HMMs where ANARCI can find them\n       shutil.copy( \"curated_alignments/germlines.py\", ANARCI_LOC )\n       os.mkdir(os.path.join(ANARCI_LOC, \"dat\"))\n       shutil.copytree( \"HMMs\", os.path.join(ANARCI_LOC, \"dat/HMMs/\") )\n      \n      # Remove data from HMMs generation\n       try:\n           shutil.rmtree(\"curated_alignments/\")\n           shutil.rmtree(\"muscle_alignments/\")\n           shutil.rmtree(\"HMMs/\")\n           shutil.rmtree(\"IMGT_sequence_files/\")\n       except OSError:\n           pass\n\nsetup(name='anarci',\n     version='1.3',\n     description='Antibody Numbering and Receptor ClassIfication',\n     author='James Dunbar',\n     author_email='opig@stats.ox.ac.uk',\n     url='http://opig.stats.ox.ac.uk/webapps/ANARCI',\n     packages=['anarci'],\n     package_dir={'anarci': 'lib/python/anarci'},\n     data_files = [ ('bin', ['bin/muscle', 'bin/muscle_macOS', 'bin/ANARCI']) ],\n     include_package_data = True,\n     scripts=['bin/ANARCI'],\n     cmdclass={\"install\": CustomInstallCommand, }, # Run post-installation routine\n    )\n"
  }
]