diff --git a/.travis.yml b/.travis.yml index c99940c62b6eedd6a0e3442b40fb85bd3bb0e8a0..11d0d8315bb960f4ca26b02a52f0364a6f01f0e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,9 +4,6 @@ python: - "2.7" - "3.6" before_install: - # Commands below copied from: http://conda.pydata.org/docs/travis.html - # We do this conditionally because it saves us some downloading if the - # version is the same. - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh; else @@ -20,6 +17,7 @@ before_install: - conda update -q conda # Useful for debugging any issues with conda - conda info -a + - free -m addons: apt: packages: @@ -29,23 +27,21 @@ addons: install: - > conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION - numpy scipy nose pandas matplotlib mkl-service + numpy scipy nose pandas matplotlib mkl-service tensorflow pypandoc - source activate test-environment - - pip install tensorflow pypandoc pylint 'theano>=1.0.4' + - pip install nose-timer - pip install -r requirements.txt - pip install . - pip freeze env: global: - PYTHONHASHSEED=0 - - MKL_THREADING_LAYER=GNU # for theano - - CUDA_VISIBLE_DEVICES="" # for tensorflow - matrix: - - KERAS_BACKEND=theano - KERAS_BACKEND=tensorflow + - KMP_SETTINGS=TRUE + - OMP_NUM_THREADS=1 + script: # download data and models, then run tests - - mhcflurry-downloads fetch + - mhcflurry-downloads fetch data_curated models_class1 models_class1_pan allele_sequences - mhcflurry-downloads info # just to test this command works - - nosetests test -sv - - ./lint.sh + - nosetests --with-timer -sv test diff --git a/README.md b/README.md index 6d553de4bd894ebbaa0b0c19d73e7800d96603a3..753b3abd2790f6a2fafca90066029570746b16d2 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,14 @@ prediction package with competitive accuracy and a fast and [documented](http://openvax.github.io/mhcflurry/) implementation. -MHCflurry supports Class I peptide/MHC binding affinity prediction using -ensembles of allele-specific models. It runs on Python 2.7 and 3.4+ using -the [keras](https://keras.io) neural network library. It exposes [command-line](http://openvax.github.io/mhcflurry/commandline_tutorial.html) -and [Python library](http://openvax.github.io/mhcflurry/python_tutorial.html) interfaces. +MHCflurry implements class I peptide/MHC binding affinity prediction. By default +it supports 112 MHC alleles using ensembles of allele-specific models. +Pan-allele predictors supporting virtually any MHC allele of known sequence +are available for testing (see below). MHCflurry runs on Python 2.7 and 3.4+ using the +[keras](https://keras.io) neural network library. +It exposes [command-line](http://openvax.github.io/mhcflurry/commandline_tutorial.html) +and [Python library](http://openvax.github.io/mhcflurry/python_tutorial.html) +interfaces. If you find MHCflurry useful in your research please cite: @@ -43,12 +47,41 @@ Wrote: /tmp/predictions.csv See the [documentation](http://openvax.github.io/mhcflurry/) for more details. -## MHCflurry model variants and mass spec +### Pan-allele models (experimental) -The default MHCflurry models are trained -on affinity measurements. Mass spec datasets are incorporated only in -the model selection step. We also release experimental predictors whose training data directly -includes mass spec. To download these predictors, run: +We are testing new models that support prediction for any MHC I allele of known +sequence (as opposed to the 112 alleles supported by the allele-specific +predictors). These models are trained on both affinity measurements and mass spec. + +To try the pan-allele models, first download them: + +``` +$ mhcflurry-downloads fetch models_class1_pan +``` + +then set this environment variable to use them by default: + +``` +$ export MHCFLURRY_DEFAULT_CLASS1_MODELS="$(mhcflurry-downloads path models_class1_pan)/models.with_mass_spec" +``` + +You can now generate predictions for about 14,000 MHC I alleles. For example: + +``` +$ mhcflurry-predict --alleles HLA-A*02:04 --peptides SIINFEKL +``` + +If you use these models please let us know how it goes. + + +## Other allele-specific models + +The default MHCflurry models are trained on affinity measurements, one allele +per model (i.e. allele-specific). Mass spec datasets are incorporated in the +model selection step. + +We also release experimental allele-specific predictors whose training data +directly includes mass spec. To download these predictors, run: ``` $ mhcflurry-downloads fetch models_class1_trained_with_mass_spec @@ -66,4 +99,4 @@ these predictors, run: ``` $ mhcflurry-downloads fetch models_class1_selected_no_mass_spec export MHCFLURRY_DEFAULT_CLASS1_MODELS="$(mhcflurry-downloads path models_class1_selected_no_mass_spec)/models" -``` +``` \ No newline at end of file diff --git a/docs/commandline_tutorial.rst b/docs/commandline_tutorial.rst index fb538406af1f36c562dc43bc116057e3de049639..8ccf28c2817c8f0a744a2898c5fe2251e616f08a 100644 --- a/docs/commandline_tutorial.rst +++ b/docs/commandline_tutorial.rst @@ -151,3 +151,33 @@ This will write a file giving predictions for all subsequences of the specified .. command-output:: head -n 3 /tmp/subsequence_predictions.csv + + +Environment variables +------------------------------------------------- + +MHCflurry behavior can be modified using these environment variables: + +``MHCFLURRY_DEFAULT_CLASS1_MODELS`` + Path to models directory. If you call ``Class1AffinityPredictor.load()`` + with no arguments, the models specified in this environment variable will be + used. If this environment variable is undefined, the downloaded models for + the current MHCflurry release are used. + +``MHCFLURRY_OPTIMIZATION_LEVEL`` + The pan-allele models can be somewhat slow. As an optimization, when this + variable is greater than 0 (default is 1), we "stitch" the pan-allele models in + the ensemble into one large tensorflow graph. In our experiments + it gives about a 30% speed improvement. It has no effect on allele-specific + models. Set this variable to 0 to disable this behavior. This may be helpful + if you are running out of memory using the pan-allele models. + + +``MHCFLURRY_DEFAULT_PREDICT_BATCH_SIZE`` + For large prediction tasks, it can be helpful to increase the prediction batch + size, which is set by this environment variable (default is 4096). This + affects both allele-specific and pan-allele predictors. It can have large + effects on performance. Alternatively, if you are running out of memory, + you can try decreasing the batch size. + + diff --git a/downloads-generation/allele_sequences/GENERATE.sh b/downloads-generation/allele_sequences/GENERATE.sh new file mode 100755 index 0000000000000000000000000000000000000000..94271aa307501329f994a3a6d7afc9ae216b1878 --- /dev/null +++ b/downloads-generation/allele_sequences/GENERATE.sh @@ -0,0 +1,93 @@ +#!/bin/bash +# +# Create allele sequences (sometimes referred to as pseudosequences) by +# performing a global alignment across all MHC amino acid sequences we can get +# our hands on. +# +# Requires: clustalo, wget +# +set -e +set -x + +DOWNLOAD_NAME=allele_sequences +SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation +SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" +SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") +export PYTHONUNBUFFERED=1 + +mkdir -p "$SCRATCH_DIR" +rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" +mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" + +# Send stdout and stderr to a logfile included with the archive. +exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") +exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) + +# Log some environment info +date +pip freeze +git status +which clustalo +clustalo --version + +cd $SCRATCH_DIR/$DOWNLOAD_NAME +cp $SCRIPT_DIR/make_allele_sequences.py . +cp $SCRIPT_DIR/filter_sequences.py . +cp $SCRIPT_DIR/class1_pseudosequences.csv . +cp $SCRIPT_ABSOLUTE_PATH . + +# Generate sequences +# Training data is used to decide which additional positions to include in the +# allele sequences to differentiate alleles that have identical traditional +# pseudosequences but have associated training data +TRAINING_DATA="$(mhcflurry-downloads path data_curated)/curated_training_data.with_mass_spec.csv.bz2" + +bzcat "$(mhcflurry-downloads path data_curated)/curated_training_data.with_mass_spec.csv.bz2" \ + | cut -f 1 -d , | uniq | sort | uniq | grep -v allele > training_data.alleles.txt + +# Human +wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/A_prot.fasta +wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/B_prot.fasta +wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/C_prot.fasta +wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/E_prot.fasta +wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/F_prot.fasta +wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/G_prot.fasta + +# Mouse +wget -q https://www.uniprot.org/uniprot/P01899.fasta # H-2 Db +wget -q https://www.uniprot.org/uniprot/P01900.fasta # H-2 Dd +wget -q https://www.uniprot.org/uniprot/P14427.fasta # H-2 Dp +wget -q https://www.uniprot.org/uniprot/P14426.fasta # H-2 Dk +wget -q https://www.uniprot.org/uniprot/Q31145.fasta # H-2 Dq + +wget -q https://www.uniprot.org/uniprot/P01901.fasta # H-2 Kb +wget -q https://www.uniprot.org/uniprot/P01902.fasta # H-2 Kd +wget -q https://www.uniprot.org/uniprot/P04223.fasta # H-2 Kk +wget -q https://www.uniprot.org/uniprot/P14428.fasta # H-2 Kq + +wget -q https://www.uniprot.org/uniprot/P01897.fasta # H-2 Ld +wget -q https://www.uniprot.org/uniprot/Q31151.fasta # H-2 Lq + +# Various +wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/mhc/MHC_prot.fasta + +python filter_sequences.py *.fasta --out class1.fasta + +time clustalo -i class1.fasta -o class1.aligned.fasta + +time python make_allele_sequences.py \ + class1.aligned.fasta \ + --recapitulate-sequences class1_pseudosequences.csv \ + --differentiate-alleles training_data.alleles.txt \ + --out-csv allele_sequences.csv + +# Cleanup +gzip -f class1.fasta +gzip -f class1.aligned.fasta +rm *.fasta + +cp $SCRIPT_ABSOLUTE_PATH . +bzip2 LOG.txt +tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * + +echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" diff --git a/downloads-generation/allele_sequences/class1_pseudosequences.csv b/downloads-generation/allele_sequences/class1_pseudosequences.csv new file mode 100644 index 0000000000000000000000000000000000000000..d7957a5d613f2e7165048b92b7cebff065c2a040 --- /dev/null +++ b/downloads-generation/allele_sequences/class1_pseudosequences.csv @@ -0,0 +1,5328 @@ +allele,pseudosequence +BoLA-1:00901,YYSMYREISENVYGSNLYLLYRDYTWEYLNYRWY +BoLA-1:00902,YYSEYREISENVYESNLYLLYRDYTWEYLNYRWY +BoLA-1:01901,YHTKYREISENVYGSNLYYDYDYYTWAVFNYRGY +BoLA-1:02001,YHTKYREISENVYGSNLYFLYMDYTWAVFNYRGY +BoLA-1:02101,YYTKYREISENVYGSNLYFQFRYYTWADFNYEGY +BoLA-1:02301,YYSEYREISENVYESNLYIAYSDYTWEYLNYRWY +BoLA-1:02801,YYTKYREISEKLYENTLYLQFRYYTWADFNYEWY +BoLA-1:02901,YYTRYREISENLYKNTAYITFMYYTWANENYRGY +BoLA-1:03101,YYTKYDEISENLYKNTLYIAFRDYTWAYLNYTWY +BoLA-1:03102,YYTKYDEISENLYKDTLYIAFRDYTWAYLNYTWY +BoLA-1:04201,YHTKYDEISENLYKDTLYIAYRDYTWEYLNYRGY +BoLA-1:04901,YYAEYREISDTSFVGTLYIEYEYYTWAYLNYEGY +BoLA-1:06101,YYTIYREISENVYESNLYFRYDFYTWADFNYRWY +BoLA-1:06701,YYAMYEMDAEDRSLCTLYFQFTFYTWAAFNYTWY +BoLA-1:07401,YYTKYREISENLYKNTAYLRFSFYTWAAENYRGY +BoLA-2:00501,YYAEYRNIYDTIFVDTLYIAYWFYTWAAWNYEWY +BoLA-2:00601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY +BoLA-2:00602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWH +BoLA-2:00801,YLIMYRENSETTFANTAYVEYMDYTWADWNYRWY +BoLA-2:00802,YLIMYRENSETTFANTAYVEYMDYTWADWNYRGY +BoLA-2:01201,YYATYRENFDTTFVDTLYIAYRDYTWAEHNYTWY +BoLA-2:01601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEGY +BoLA-2:01602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY +BoLA-2:01801,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY +BoLA-2:01802,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY +BoLA-2:02201,YHSEYEQIVDTSFVGTLYLLYEDYTRAALNYTGY +BoLA-2:02501,YSAEYRNIYDTTFVYALYLWSWFYTWAAENYRGY +BoLA-2:02601,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY +BoLA-2:02602,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY +BoLA-2:02603,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY +BoLA-2:03001,YYSEYRNIYDTNFVSNLYLWSWFYTWANENYEWY +BoLA-2:03202,YYATYRENLGATFVDTLYIEYRDYTWAYLNYTWY +BoLA-2:04301,YSEMYRERAGNTFVNTLYIWYRDYTWAVFNYLGY +BoLA-2:04401,YYAMYEEKADTTFVDTLYIAYRDYTWAVFNYLGY +BoLA-2:04402,YYAMYEEKADTTFVDTLYIWYRDYTWAVFNYLGY +BoLA-2:04501,YYATYRENLDTTFVDTLYIEYRDYTWAEFNYLGY +BoLA-2:04601,YSEMYRERAGNTFVNTLYIWYRDYTWAEQNYTWY +BoLA-2:04701,YSEMYQERAGNTFVDTLYLWYMDYTWAEQNYTWY +BoLA-2:04801,YYSEYEQIVDTSFVGTLYLLYMDYTRAAQNYRGY +BoLA-2:05401,YYIMYQENSGATFANTLYFWYWFYTWANENYRGY +BoLA-2:05501,YYAEYREISETTFVDSLYIAYRDYTWAYLNYRGY +BoLA-2:05601,YYATYQENFDATFANTLYFLSTYYTWEAHNYRGY +BoLA-2:05701,YYIMYREISETTFVDTLYIEYDFYTWEYLNYRGY +BoLA-2:06001,YSAEYRNIYDTTFVYTLYLWSWFYTWANGNYEGY +BoLA-2:06201,YYATYQEIQENTFANTLYIEYRDYTWAYFNYRWY +BoLA-2:06901,YYSEYEQIVDTSFVNTLYLWYRDYTWEAENYRWY +BoLA-2:07001,YYATYRENLDATFVNTLYLWYRDYTWAERNYRWY +BoLA-2:07101,YYATYRENLGATFVDTLYIAYSDYTWAEFNYRGY +BoLA-3:00101,YSEMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY +BoLA-3:00102,YSSMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY +BoLA-3:00103,YSIMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY +BoLA-3:00201,YLEMYQEKAGNFFVSNLYLLSMFYSMAEQNYRWY +BoLA-3:00401,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY +BoLA-3:00402,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY +BoLA-3:00403,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY +BoLA-3:01001,YYSEYRNIYDTTFVDTLYLEYEYYSVAEFNYRGY +BoLA-3:01101,YSEMYQEKAGTTFANIAYFWYMYYTWAEQNYTWY +BoLA-3:01701,YSEMYRERAGNIFVSNLYFWYEYYTWAAQNYRWY +BoLA-3:01702,YSEMYRERAGNIFVSNLYFWYMYYTWAAQNYRWY +BoLA-3:01703,YSEMYRERAGNIFVSNLYFWYMYYTWAEQNYRWY +BoLA-3:02701,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH +BoLA-3:02702,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH +BoLA-3:03501,YYNMYQENAGNTFVGTLYLWSEFYTWAAHNYTWY +BoLA-3:03601,YYAMYRNNADATFVNTLYFLYEYYTVADHNYRWY +BoLA-3:03701,YSEMYRNNAGNSFVGTLYLLYMDYSRAVQNYRWY +BoLA-3:03801,YNEMYRNNAGNDSVGTLYLWYMYYSMAVQNYTWY +BoLA-3:05001,YSEMYRNNAGNTFGSNLYFLYTYYTWAEWNYTWH +BoLA-3:05002,YSEMYRNNAGNTFGSNLYFWYMYYTWAEQNYTWH +BoLA-3:05101,YSEMYRERAGNTFVNTLYIWYRDYTWAAENYTWY +BoLA-3:05201,YYSMYRENSDTGFVDTLYLLYTYYSVAVQNYRWY +BoLA-3:05301,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY +BoLA-3:05801,YSEMYRERAGNTFVGTLYLWYMDYSRAVQNYRWY +BoLA-3:05901,YSEMYRNNAGNSFVGTLYLWSMFYTWEYQNYRWH +BoLA-3:06501,YSEMYQEKAGTSSVGTLYLAYMFYSMAVQNYEWY +BoLA-3:06601,YYEMYQEKADTTFVDTLYLLYTYYSMAEFNYTWY +BoLA-3:06602,YYEMYQEKADTTFVDTLYLLYTFYSMAEFNYTWY +BoLA-3:06801,YSIVYQNNAGTTFANTLYLLYMYYTWAAHNYEWY +BoLA-3:07301,YYIIYQEISDTSFVSNLYLWYTYYSMAVQNYEWY +BoLA-4:02401,YSIAYEQIVDTTFANTAYIAYSDYTWEYLNYTWY +BoLA-4:02402,YSIAYEEIVDTTFANTAYLPYSDYTWTYLNYTWY +BoLA-4:06301,YYSTYRENFETTFVNTLYILYTFYSRAALNYRGY +BoLA-5:00301,YLIVYEERADHFFRGALYFEYEFYSWASYNYEWY +BoLA-5:03901,YYIVYQEKADTFFLGTLYLWCWFYTWANENYEWY +BoLA-5:06401,YYIVYQEKADHTFANTLYLWHWFYTWANENYEWY +BoLA-5:07201,YYIVYQEKADHFFLGTLYLWYWFYSWAVQNYTWY +BoLA-6:01301,YHTTYREISENWYEANLYLEYEYYSMAAFNYTWY +BoLA-6:01302,YHTTYREISENWYEANLYLLYEYYSMAAFNYTWY +BoLA-6:01401,YHTKYREISENWYEANLYYRYTFYTWAEFNYRGY +BoLA-6:01402,YHTKYREISENKYEAILYYRYTFYTWAEFNYRWY +BoLA-6:01501,YYTKYREISENWYEANLYLLYTFYSMADQNYRGY +BoLA-6:01502,YYTKYREISENWYEANLYLQFTFYSMADQNYRGY +BoLA-6:03401,YHTKYREISENVYGSNLYLLYTFYSMADRNYRGY +BoLA-6:04001,YSEMYEERAGIVFVNTLYLWCWFYSMAAGKYTWY +BoLA-6:04101,YHTKYREISENWYEATLYLEYEYYSMAAFNYRSY +BoLA-AW10,YSEMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY +BoLA-D18.4,YYSEYREISENVYESNLYIAYSDYTWEYLNYRWY +BoLA-HD6,YHTTYREISENWYEANLYLEYEYYSMAAFNYTWY +BoLA-JSP.1,YLEMYQEKAGNFFVSNLYLLSMFYSMAEQNYRWY +BoLA-N:00101,YSEMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY +BoLA-N:00102,YSSMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY +BoLA-N:00103,YSIMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY +BoLA-N:00201,YLEMYQEKAGNFFVSNLYLLSMFYSMAEQNYRWY +BoLA-N:00301,YLIVYEERADHFFRGALYFEYEFYSWASYNYEWY +BoLA-N:00401,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY +BoLA-N:00402,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY +BoLA-N:00501,YYAEYRNIYDTIFVDTLYIAYWFYTWAAWNYEWY +BoLA-N:00601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY +BoLA-N:00602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWH +BoLA-N:00801,YLIMYRENSETTFANTAYVEYMDYTWADWNYRWY +BoLA-N:00802,YLIMYRENSETTFANTAYVEYMDYTWADWNYRGY +BoLA-N:00901,YYSMYREISENVYGSNLYLLYRDYTWEYLNYRWY +BoLA-N:00902,YYSEYREISENVYESNLYLLYRDYTWEYLNYRWY +BoLA-N:01001,YYSEYRNIYDTTFVDTLYLEYEYYSVAEFNYRGY +BoLA-N:01101,YSEMYQEKAGTTFANIAYFWYMYYTWAEQNYTWY +BoLA-N:01201,YYATYRENFDTTFVDTLYIAYRDYTWAEHNYTWY +BoLA-N:01301,YHTTYREISENWYEANLYLEYEYYSMAAFNYTWY +BoLA-N:01302,YHTTYREISENWYEANLYLLYEYYSMAAFNYTWY +BoLA-N:01401,YHTKYREISENWYEANLYYRYTFYTWAEFNYRGY +BoLA-N:01402,YHTKYREISENKYEAILYYRYTFYTWAEFNYRWY +BoLA-N:01501,YYTKYREISENWYEANLYLLYTFYSMADQNYRGY +BoLA-N:01502,YYTKYREISENWYEANLYLQFTFYSMADQNYRGY +BoLA-N:01601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEGY +BoLA-N:01602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY +BoLA-N:01701,YSEMYRERAGNIFVSNLYFWYEYYTWAAQNYRWY +BoLA-N:01702,YSEMYRERAGNIFVSNLYFWYMYYTWAAQNYRWY +BoLA-N:01801,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY +BoLA-N:01802,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY +BoLA-N:01901,YHTKYREISENVYGSNLYYDYDYYTWAVFNYRGY +BoLA-N:02001,YHTKYREISENVYGSNLYFLYMDYTWAVFNYRGY +BoLA-N:02101,YYTKYREISENVYGSNLYFQFRYYTWADFNYEGY +BoLA-N:02201,YHSEYEQIVDTSFVGTLYLLYEDYTRAALNYTGY +BoLA-N:02301,YYSEYREISENVYESNLYIAYSDYTWEYLNYRWY +BoLA-N:02401,YSIAYEQIVDTTFANTAYIAYSDYTWEYLNYTWY +BoLA-N:02402,YSIAYEEIVDTTFANTAYLPYSDYTWTYLNYTWY +BoLA-N:02501,YSAEYRNIYDTTFVYALYLWSWFYTWAAENYRGY +BoLA-N:02601,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY +BoLA-N:02602,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY +BoLA-N:02701,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH +BoLA-N:02702,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH +BoLA-N:02801,YYTKYREISEKLYENTLYLQFRYYTWADFNYEWY +BoLA-N:02901,YYTRYREISENLYKNTAYITFMYYTWANENYRGY +BoLA-N:03001,YYSEYRNIYDTNFVSNLYLWSWFYTWANENYEWY +BoLA-N:03101,YYTKYDEISENLYKNTLYIAFRDYTWAYLNYTWY +BoLA-N:03401,YHTKYREISENVYGSNLYLLYTFYSMADRNYRGY +BoLA-N:03501,YYNMYQENAGNTFVGTLYLWSEFYTWAAHNYTWY +BoLA-N:03601,YYAMYRNNADATFVNTLYFLYEYYTVADHNYRWY +BoLA-N:03701,YSEMYRNNAGNSFVGTLYLLYMDYSRAVQNYRWY +BoLA-N:03801,YNEMYRNNAGNDSVGTLYLWYMYYSMAVQNYTWY +BoLA-N:03901,YYIVYQEKADTFFLGTLYLWCWFYTWANENYEWY +BoLA-N:04001,YSEMYEERAGIVFVNTLYLWCWFYSMAAGKYTWY +BoLA-N:04101,YHTKYREISENWYEATLYLEYEYYSMAAFNYRSY +BoLA-N:04201,YHTKYDEISENLYKDTLYIAYRDYTWEYLNYRGY +BoLA-N:04301,YSEMYRERAGNTFVNTLYIWYRDYTWAVFNYLGY +BoLA-N:04401,YYAMYEEKADTTFVDTLYIAYRDYTWAVFNYLGY +BoLA-N:04501,YYATYRENLDTTFVDTLYIEYRDYTWAEFNYLGY +BoLA-N:04601,YSEMYRERAGNTFVNTLYIWYRDYTWAEQNYTWY +BoLA-N:04701,YSEMYQERAGNTFVDTLYLWYMDYTWAEQNYTWY +BoLA-N:04801,YYSEYEQIVDTSFVGTLYLLYMDYTRAAQNYRGY +BoLA-N:04901,YYAEYREISDTSFVGTLYIEYEYYTWAYLNYEGY +BoLA-N:05001,YSEMYRNNAGNTFGSNLYFLYTYYTWAEWNYTWH +BoLA-N:05101,YSEMYRERAGNTFVNTLYIWYRDYTWAAENYTWY +BoLA-N:05201,YYSMYRENSDTGFVDTLYLLYTYYSVAVQNYRWY +BoLA-N:05301,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY +BoLA-N:05401,YYIMYQENSGATFANTLYFWYWFYTWANENYRGY +BoLA-N:05501,YYAEYREISETTFVDSLYIAYRDYTWAYLNYRGY +BoLA-N:05601,YYATYQENFDATFANTLYFLSTYYTWEAHNYRGY +BoLA-NC1:00101,YLTMYQEIQENTFANTLYIWHNHYTWTAFNYKLH +BoLA-NC1:00201,YLTMYQEIQENTFANTLYIWHNHYTWTAFNYKLH +BoLA-NC1:00301,YLTMYQEIQENTFANTLYIWHNHYTWTAFNYKLH +BoLA-NC1:00401,YLTMYQEIQENTFANTLYIWHNHYTWAEFNYELH +BoLA-NC2:00101,YYSIYQERTDTFFVYTLYVEYDFYTAADVIYKWY +BoLA-NC2:00102,YYSIYQERTDTFFVYTLYVEYDFYTAADVIYKWY +BoLA-NC3:00101,YNAMYEMDAESESLCNLYLVFWKYTWSQQNYKWH +BoLA-NC4:00101,CCAMYAMDAKARLTGTIFLWLWNYTWSEQNYKWH +BoLA-NC4:00201,YCAMYAMDAKARLTGTIFLWLWNYTWSEQNYKWH +BoLA-T2C,YYIIYRNISDTSFVSNLYLLYTYYSMAVQNYEWH +BoLA-T2a,YYATYRENFDTTFVDTLYIAYRDYTWAEHNYTWY +BoLA-T2b,YHTKYREISENWYEATLYLEYEYYSMAAFNYRSY +BoLA-T2c,YYIIYRNISDTSFVSNLYLLYTYYSMAVQNYEWH +BoLA-T5,YYSEYREISENVYESNLYLLYRDYTWEYLNYRWY +BoLA-T7,YLAMYRNNANTTFVNNLYVEHMYYSMAEQNYTWY +Chi-B0401,YRTYYGQIGLNINENIRRVWFRSYTWEEWNYTWY +Chi-B1201,YRDYYGQIGGNIDENILRVWYYMYTWGYLQYTWY +Chi-B1501,YSDAYSETSRTIDDGTLRVLYSDYTWGYLQYTWY +Gogo-B0101,YDTMYRETSAQTDENIAYIRFSSYTWAELAYTWY +H-2-Db,YESYYREKAGQWFVSNLYLQSLFYTWSAYAYEWY +H-2-Dd,YVEYYRERAGNSFVDTAYLWAWFYTWAADAYEWY +H-2-Kb,YVEYYREKAGNSFVDTLYIVSQYYTWAELAYTWY +H-2-Kd,YVAFYEQRASDWFVSTAYFRFQFYTWADYAYEWY +H-2-Kk,YHSYYRNIAGNIFVNTAYFRYEYYTWADDAYTWY +H-2-Ld,YESYYRIIAGQWFVNTLYLWYEFYTWAAYAYEWY +H-2-Lq,YESYYRIIAGQWFVNTLYIRYEYYTWAAYAYEWY +H-2-Qa1,YHIMYREKADMNFVNTLYLWYCEYSSVEQAYPWY +H-2-Qa2,YHSMYREIAGHSFGSTAYLWYLFYTWAIDAYTSY +H2-Db,YESYYREKAGQWFVSNLYLQSLFYTWSAYAYEWY +H2-Dd,YVEYYRERAGNSFVDTAYLWAWFYTWAADAYEWY +H2-Kb,YVEYYREKAGNSFVDTLYIVSQYYTWAELAYTWY +H2-Kd,YVAFYEQRASDWFVSTAYFRFQFYTWADYAYEWY +H2-Kk,YHSYYRNIAGNIFVNTAYFRYEYYTWADDAYTWY +H2-Ld,YESYYRIIAGQWFVNTLYLWYEFYTWAAYAYEWY +H2-Qa1,YHIMYREKADMNFVNTLYLWYCEYSSVEQAYPWY +H2-Qa2,YHSMYREIAGHSFGSTAYLWYLFYTWAIDAYTSY +HLA-A0101,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A0102,YSAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A0103,YFAMYQENMAHTDANTLYIMYRDYTWVARVYRGY +HLA-A0104,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A0106,YFAMYQENMAHTDANTLYIIYRDYTWVALAYRGY +HLA-A0107,YFAMYQENVAHTDENTLYIIYRDYTWVARVYRGY +HLA-A0108,YFAMYQENMAHTDANTLYIIYRDYTWVARVYWGY +HLA-A0109,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A0110,YFAMYQENMAHTDANTLYIIYRDYTWARRVYRGY +HLA-A0111,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A0112,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY +HLA-A0113,YFAMYQENMAQTDVDTLYIIYRDYTWVARVYRGY +HLA-A0114,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTGY +HLA-A0115,YFAMYQENMAHTDANTLYIIYRDYTWVARVYGGT +HLA-A0117,YFAMYQENMAQTDANTLYIIYRDYTWVARVYRGY +HLA-A0118,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A0119,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY +HLA-A0120,YSAMYQENMAHTDANTLYVRYRDYTWVARVYRGY +HLA-A0121,YFAMYQENMAHTDANTLYIIYRDYTWAVRVYRGY +HLA-A0122,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A0123,YFAMYQENVAHTDANTLYIIYRDYTWVARVYRGY +HLA-A0124,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A0125,YFAMYQENMAHTDANTLYIIYRDYTWVAQVYRGY +HLA-A0126,YFAMYQENMAHTDANTLYIIYRDYTWAARVYRGY +HLA-A01:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:02,YSAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:03,YFAMYQENMAHTDANTLYIMYRDYTWVARVYRGY +HLA-A01:06,YFAMYQENMAHTDANTLYIIYRDYTWVALAYRGY +HLA-A01:07,YFAMYQENVAHTDENTLYIIYRDYTWVARVYRGY +HLA-A01:08,YFAMYQENMAHTDANTLYIIYRDYTWVARVYWGY +HLA-A01:09,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:10,YFAMYQENMAHTDANTLYIIYRDYTWARRVYRGY +HLA-A01:12,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY +HLA-A01:13,YFAMYQENMAQTDVDTLYIIYRDYTWVARVYRGY +HLA-A01:14,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTGY +HLA-A01:17,YFAMYQENMAQTDANTLYIIYRDYTWVARVYRGY +HLA-A01:19,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY +HLA-A01:20,YSAMYQENMAHTDANTLYVRYRDYTWVARVYRGY +HLA-A01:21,YFAMYQENMAHTDANTLYIIYRDYTWAVRVYRGY +HLA-A01:23,YFAMYQENVAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:24,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:25,YFAMYQENMAHTDANTLYIIYRDYTWVAQVYRGY +HLA-A01:26,YFAMYQENMAHTDANTLYIIYRDYTWAARVYRGY +HLA-A01:28,YFAMYQENMAHTDVDTLYIIYRDYTWVARVYRGY +HLA-A01:29,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:30,YFAMYQENMAHTDANTLYIIYHYYTWVARVYRGY +HLA-A01:32,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:33,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:35,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:36,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:37,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:38,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:39,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:40,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:41,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:42,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:43,YYAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:44,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:45,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:46,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:47,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:48,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:49,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:50,YFAMYQENMAHTDANTLYIIYREYTWVARVYRGY +HLA-A01:51,YFAMYRNNVAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:54,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:55,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:58,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:59,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:60,YFAMYPENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:61,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:62,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:63,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:64,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY +HLA-A01:65,YFAMYQENMAHTDANTLYIIYRDYTWVARVCRGY +HLA-A01:66,YFAMYQENMAHTDANTLYVRYRDYTWVARVYRGY +HLA-A0201,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0202,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A0203,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY +HLA-A0204,YFAMYGEKVAHTHVDTLYVMYHYYTWAVLAYTWY +HLA-A0205,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A0206,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0207,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY +HLA-A0208,YYAMYGENVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A0209,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0210,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY +HLA-A0211,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY +HLA-A0212,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY +HLA-A0213,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYTWY +HLA-A0214,YYAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY +HLA-A0215,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY +HLA-A0216,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY +HLA-A0217,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY +HLA-A0218,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY +HLA-A0219,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY +HLA-A0220,YFAMYGENVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0221,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0222,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY +HLA-A0224,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0225,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0226,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY +HLA-A0227,YFAMYGEKVAHTHVDTLYVRYHYYTWAAQAYTWY +HLA-A0228,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0229,YFAMYGEQVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0230,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0231,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0233,YFAMYGEKVAHTHVDTLYVRSHYYTWAVLAYTWY +HLA-A0234,YFAMYGEKVAQTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0235,YFAMYGEKVAQTDVDTLYVRYHYYTWAVLAYTWY +HLA-A0236,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTGY +HLA-A0237,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY +HLA-A0238,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYRWY +HLA-A0239,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY +HLA-A0240,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0241,YYAMYGEKVAHTHVDTLYVRYQYYTWAVLAYTWY +HLA-A0242,YFSMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0243,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0244,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY +HLA-A0245,YFAMYQEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0246,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0247,YFAMYGEKVAHSHVDTLYLRYHYYTWAVWAYTWY +HLA-A0248,YFAMYEEKVAHTDVDTLYVRYHYYTWAVLAYTWY +HLA-A0249,YFAMYGEKVAHTHVDTLYVRYHYYTWAVRAYTWY +HLA-A0250,YFAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY +HLA-A0251,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0252,YFAMYGEKVAHTHVDTLYVRYEHYTWAVLAYTWY +HLA-A0254,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY +HLA-A0255,YFAMYRNNVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0256,YFAMYQENVAQTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0257,YYAMYGEKVAHTHVDTLYLMYHYYTWAVLAYTWY +HLA-A0258,YFAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY +HLA-A0259,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0260,YFAMYGEKVAHTHVDTLYVRYHFYTWAVLAYTWY +HLA-A0261,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0262,YFAMYGENVAQTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0263,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A0264,YFAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY +HLA-A0265,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY +HLA-A0266,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0267,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0268,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0269,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY +HLA-A0270,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0271,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0272,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0273,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY +HLA-A0274,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0275,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0276,YSAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0277,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0278,YYAMYQENVAQTDVDTLYVRYHYYTWAVLAYTWY +HLA-A0279,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0280,YFAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY +HLA-A0281,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY +HLA-A0283,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0284,YYAMYGEKVAHTHVDTLYFRYHYYTWAVLAYTWY +HLA-A0285,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0286,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0287,YFAMYGEKVAHTDENIAYVRYHYYTWAVLAYTWY +HLA-A0289,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0290,YFAMYGEKVAHTDVDTLYVRYHYYTWAVLAYTWY +HLA-A0291,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0292,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0293,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0295,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0296,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0297,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A0299,YYAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY +HLA-A02:01,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:02,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:03,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY +HLA-A02:04,YFAMYGEKVAHTHVDTLYVMYHYYTWAVLAYTWY +HLA-A02:05,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:06,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:07,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY +HLA-A02:08,YYAMYGENVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:09,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:10,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY +HLA-A02:101,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYRWY +HLA-A02:102,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:103,YFAMYQENVAQTHVDTLYVRCHYYTWAVLAYTWY +HLA-A02:104,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY +HLA-A02:105,YFAMYGEKVAHTHVDTLYVRYEYYTWAVLAYTWY +HLA-A02:106,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:107,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:108,YYAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY +HLA-A02:109,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:11,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY +HLA-A02:110,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY +HLA-A02:111,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:112,YFAMYGEKVAHTDENIAYVRCHYYTWAVLAYTWY +HLA-A02:114,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY +HLA-A02:115,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:116,YFAMYGEKVAHTHLDTLYVRYHYYTWAVLAYTWY +HLA-A02:117,YFAMYGEKVAHTHVDTLYVRYQDYTWAEWAYTWY +HLA-A02:118,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:119,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:12,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY +HLA-A02:120,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:121,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:122,YYAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY +HLA-A02:123,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:124,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY +HLA-A02:126,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:127,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY +HLA-A02:128,YFAMYGENVAHIDVDTLYVRYHYYTWAVLAYTWY +HLA-A02:129,YYAMYEEKVAHTDENIAYVRYHYYTWAVLAYTWY +HLA-A02:13,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYTWY +HLA-A02:130,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY +HLA-A02:131,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY +HLA-A02:132,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:133,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:134,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:135,YFAMYGEKVAHTHVDTLYIRYQDYTWAEWAYRWY +HLA-A02:136,YFAMYGEKVAHTDENIAYVRYHYYTWAVWAYTWY +HLA-A02:137,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:138,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:139,YFAMYGEKVTHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:14,YYAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY +HLA-A02:140,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:141,YFVMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:142,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY +HLA-A02:143,YYAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:144,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:145,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:146,YFAMYGEKVAHTDANTLYVRYHYYTWAVLAYTWY +HLA-A02:147,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY +HLA-A02:148,YFAMYGEKVAHTHVDTLYVRFHYYTWAEWAYTWY +HLA-A02:149,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:150,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:151,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY +HLA-A02:152,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY +HLA-A02:153,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:154,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYRWY +HLA-A02:155,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:156,YFAMYGEKVAHTHVDTLYIIYHYYTWAVLAYTWY +HLA-A02:157,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:158,YFAMYGEKVAHAHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:159,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:16,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY +HLA-A02:160,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:161,YFAVYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:162,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:163,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:164,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:165,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:166,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:167,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY +HLA-A02:168,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:169,YYAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:17,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY +HLA-A02:170,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:171,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY +HLA-A02:172,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:173,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:174,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:175,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:176,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:177,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:178,YYAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY +HLA-A02:179,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:18,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY +HLA-A02:180,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:181,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:182,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:183,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:184,YFAMYGEKVAHTHEDTLYVRYHYYTWAVLAYTWY +HLA-A02:185,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:186,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:187,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:188,YFAMYGEKVAHTHVDTLYVRYDSYTWAVLAYTWY +HLA-A02:189,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:19,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY +HLA-A02:190,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:191,YFAMYGEKVAHTHVDTLYVRCHYYTWAVWAYTWY +HLA-A02:192,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:193,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:194,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:195,YFAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:196,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:197,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:198,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:199,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:20,YFAMYGENVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:200,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:201,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:202,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:203,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:204,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:205,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:206,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:207,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:208,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:209,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:21,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:210,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:211,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:212,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:213,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:214,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:215,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:216,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:217,YFAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:218,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:219,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY +HLA-A02:22,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY +HLA-A02:220,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:221,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:224,YFAMYGEKVAHTHVDTLYVGYHYYTWAVLAYTWY +HLA-A02:228,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:229,YYAMYGEKVAHTHVDTLYLRYRYYTWAVWAYTWY +HLA-A02:230,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY +HLA-A02:231,YFAMYGEKVAHTHVDTLYVRNHYYTWAVLAYTWY +HLA-A02:232,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:233,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTRY +HLA-A02:234,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:235,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:236,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:237,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:238,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:239,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:24,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:240,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:241,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:242,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY +HLA-A02:243,YTAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:244,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY +HLA-A02:245,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY +HLA-A02:246,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY +HLA-A02:247,YFAMYGEKVAHTDENTLYVRYHYYTWAVLAYTWY +HLA-A02:248,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:249,YFAMYVEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:25,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:251,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:252,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:253,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY +HLA-A02:254,YFAMYGEKVAHTHVDTLYVRYNFYTWAVLAYTWY +HLA-A02:255,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTGY +HLA-A02:256,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:257,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:258,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY +HLA-A02:259,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:26,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY +HLA-A02:260,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:261,YFAMYGEKVAHTHMDTLYVRCHYYTWAVLAYTWY +HLA-A02:262,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLVYTWY +HLA-A02:263,YFAMYGEKVAHTHVDTLYVRYHYYTWSVLAYTWY +HLA-A02:264,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY +HLA-A02:265,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY +HLA-A02:266,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:27,YFAMYGEKVAHTHVDTLYVRYHYYTWAAQAYTWY +HLA-A02:28,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:29,YFAMYGEQVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:30,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:31,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:33,YFAMYGEKVAHTHVDTLYVRSHYYTWAVLAYTWY +HLA-A02:34,YFAMYGEKVAQTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:35,YFAMYGEKVAQTDVDTLYVRYHYYTWAVLAYTWY +HLA-A02:36,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTGY +HLA-A02:37,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY +HLA-A02:38,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYRWY +HLA-A02:39,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY +HLA-A02:40,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:41,YYAMYGEKVAHTHVDTLYVRYQYYTWAVLAYTWY +HLA-A02:42,YFSMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:44,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY +HLA-A02:45,YFAMYQEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:46,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:47,YFAMYGEKVAHSHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:48,YFAMYEEKVAHTDVDTLYVRYHYYTWAVLAYTWY +HLA-A02:49,YFAMYGEKVAHTHVDTLYVRYHYYTWAVRAYTWY +HLA-A02:50,YFAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY +HLA-A02:51,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:52,YFAMYGEKVAHTHVDTLYVRYEHYTWAVLAYTWY +HLA-A02:54,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY +HLA-A02:55,YFAMYRNNVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:56,YFAMYQENVAQTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:57,YYAMYGEKVAHTHVDTLYLMYHYYTWAVLAYTWY +HLA-A02:58,YFAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY +HLA-A02:59,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:60,YFAMYGEKVAHTHVDTLYVRYHFYTWAVLAYTWY +HLA-A02:61,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:62,YFAMYGENVAQTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:63,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A02:64,YFAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY +HLA-A02:65,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY +HLA-A02:66,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:67,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:68,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:69,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY +HLA-A02:70,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:71,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:72,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:73,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY +HLA-A02:74,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:75,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:76,YSAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:77,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:78,YYAMYQENVAQTDVDTLYVRYHYYTWAVLAYTWY +HLA-A02:79,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:80,YFAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY +HLA-A02:81,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY +HLA-A02:84,YYAMYGEKVAHTHVDTLYFRYHYYTWAVLAYTWY +HLA-A02:85,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:86,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:87,YFAMYGEKVAHTDENIAYVRYHYYTWAVLAYTWY +HLA-A02:89,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:90,YFAMYGEKVAHTDVDTLYVRYHYYTWAVLAYTWY +HLA-A02:91,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:92,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:93,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:95,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:96,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:97,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A02:99,YYAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY +HLA-A0301,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0302,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY +HLA-A0303,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0304,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0305,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0306,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0307,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY +HLA-A0308,YFAMYQENVAHTDVDTLYIIYRDYTWAELAYTWY +HLA-A0309,YFAMYQENVAQTHVDTLYIIYRDYTWAELAYTWY +HLA-A0310,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY +HLA-A0312,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0313,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0314,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0315,YFAMYQENVAQTDVDTLYIIFRDYTWAELAYTWY +HLA-A0316,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0317,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0318,YFAMYQENVAQTDVDTLYIIYRDYTWVARVYRGY +HLA-A0319,YFAMYQENVAQTDVDTLYIIFHYYTWAELAYTWY +HLA-A0320,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0321,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0322,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0323,YFAMYGEKVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0324,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0325,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0326,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0327,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0328,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0329,YFAMYQENVVQTDVDTLYIIYRDYTWAELAYTWY +HLA-A0330,YFAMYEEKVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:01,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:02,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY +HLA-A03:04,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:05,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:06,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:07,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY +HLA-A03:08,YFAMYQENVAHTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:09,YFAMYQENVAQTHVDTLYIIYRDYTWAELAYTWY +HLA-A03:10,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY +HLA-A03:12,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:13,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:14,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:15,YFAMYQENVAQTDVDTLYIIFRDYTWAELAYTWY +HLA-A03:16,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:17,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:18,YFAMYQENVAQTDVDTLYIIYRDYTWVARVYRGY +HLA-A03:19,YFAMYQENVAQTDVDTLYIIFHYYTWAELAYTWY +HLA-A03:20,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:22,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:23,YFAMYGEKVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:24,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:25,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:26,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:27,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:28,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:29,YFAMYQENVVQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:30,YFAMYEEKVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:31,YFAMYQENVAQTDVDTLYIIYRYYTWAVQAYTWY +HLA-A03:32,YFAMYQENVAHIDVDTLYIIYRDYTWAVQAYTWY +HLA-A03:33,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:34,YFAMYQENVAPTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:35,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:37,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:38,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:39,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:40,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:41,YFAMYQENVAHTDANTLYIIYRDYTWAELAYTWY +HLA-A03:42,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY +HLA-A03:43,YFAMYQENVAQTDVDTLYIIYEHYTWAELAYTWY +HLA-A03:44,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:45,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:46,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:47,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:48,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:49,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:50,YFAMYQENVAQTDVDTLYIIYRDYTWAEWAYTWY +HLA-A03:51,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:52,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:53,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:54,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:55,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:56,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:57,YFAMYQENVAQTDANTLYIIYRDYTWAELAYTWY +HLA-A03:58,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:59,CFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:60,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:61,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:62,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:63,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:64,YFAMYQENVAQTDVDTLYIIYRDYTWADLAYTWY +HLA-A03:65,YFAMYQENVAQTDVDTLYIIYRDYTWAEQAYTWY +HLA-A03:66,YFAMYQENVAQTDVDTLYIIYRDYTWAERAYTWY +HLA-A03:67,YFATYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:70,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:71,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:72,YSAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:73,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY +HLA-A03:74,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:75,YFAMYQENVAQTDVDTLYLMYRDYTWAELAYTWY +HLA-A03:76,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY +HLA-A03:77,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:78,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:79,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:80,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:81,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A03:82,YFAMYQENVAQTDVDTLYIIYEHYTWAVQAYTWY +HLA-A1101,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1102,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1103,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY +HLA-A1104,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTWY +HLA-A1105,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1106,YYAMYQENVAQTHVDTLYIIYRDYTWAAQAYRWY +HLA-A1107,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1108,YYAMYQENVAQTDVDTLYIIYRDYTWAERAYRWY +HLA-A1109,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1110,YYAMYRNNVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1111,YYAMYLQNVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1112,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1113,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1114,YYAMYQENVAQTDVDTLYIIYRDYTWARQAYRWY +HLA-A1115,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1116,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1117,YYAMYQENMAHTDANTLYIIYRDYTWAAQAYRWY +HLA-A1118,YYAMYQENVAHTHVDTLYIIYRDYTWAAQAYRWY +HLA-A1119,YYAMYQENVAHTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1120,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY +HLA-A1121,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1122,YYAMYQENVAQTDVDTLYIIYPDYTWAAQAYRWY +HLA-A1123,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1124,YYAMYQENVAQTDVDTLYIIYRDYTWAALAYRWY +HLA-A1125,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYRWY +HLA-A1126,YYAMYQENVAQTDVDTLYIMYRDYTWAAQAYRWY +HLA-A1127,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTGY +HLA-A1128,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1129,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1130,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A1131,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYRWY +HLA-A1132,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:01,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:02,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:03,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY +HLA-A11:04,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTWY +HLA-A11:05,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:06,YYAMYQENVAQTHVDTLYIIYRDYTWAAQAYRWY +HLA-A11:07,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:08,YYAMYQENVAQTDVDTLYIIYRDYTWAERAYRWY +HLA-A11:09,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:10,YYAMYRNNVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:11,YYAMYLQNVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:12,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:13,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:14,YYAMYQENVAQTDVDTLYIIYRDYTWARQAYRWY +HLA-A11:15,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:16,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:17,YYAMYQENMAHTDANTLYIIYRDYTWAAQAYRWY +HLA-A11:18,YYAMYQENVAHTHVDTLYIIYRDYTWAAQAYRWY +HLA-A11:19,YYAMYQENVAHTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:20,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY +HLA-A11:22,YYAMYQENVAQTDVDTLYIIYPDYTWAAQAYRWY +HLA-A11:23,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:24,YYAMYQENVAQTDVDTLYIIYRDYTWAALAYRWY +HLA-A11:25,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYRWY +HLA-A11:26,YYAMYQENVAQTDVDTLYIMYRDYTWAAQAYRWY +HLA-A11:27,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTGY +HLA-A11:29,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:30,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:31,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYRWY +HLA-A11:32,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:33,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:34,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:35,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY +HLA-A11:36,YYAMYQENVAQTDVDTLYIICRDYTWAAQAYRWY +HLA-A11:37,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:38,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY +HLA-A11:39,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY +HLA-A11:40,YYAMYQENVAHTDANTLYIIYRDYTWAAQAYRWY +HLA-A11:41,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:42,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:43,YTAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:44,YYAMYQENVAQTDVDTLYIIYRDYTWAARAYRWY +HLA-A11:45,YYAMYQENVAQTDADTLYIIYRDYTWAAQAYRWY +HLA-A11:46,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:47,YHAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:48,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:49,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:51,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:53,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:54,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:55,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:56,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:57,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:58,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:59,YYAMYQENVAQTDVDTLYIIYGDYTWAAQAYRWY +HLA-A11:60,YYAMYQENVAQTDVDTLYIIYRDYTWAVQAYRWY +HLA-A11:61,YYAMYQENAAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:62,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:63,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY +HLA-A11:64,YYAMYQENVAQTDVDTLHIIYRDYTWAAQAYRWY +HLA-A2301,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2302,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY +HLA-A2303,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2304,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY +HLA-A2305,CSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2306,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2307,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2309,YSAMYQENMAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2310,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYRGY +HLA-A2312,YSAMYEEKVAHTHENIAYLMFHYYTWAVLAYTGY +HLA-A2313,YSAMYEEKVAQTDENIAYLMFHYYTWAVLAYTGY +HLA-A2314,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2315,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2316,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:01,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY +HLA-A23:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:04,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY +HLA-A23:05,CSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:09,YSAMYQENMAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYRGY +HLA-A23:12,YSAMYEEKVAHTHENIAYLMFHYYTWAVLAYTGY +HLA-A23:13,YSAMYEEKVAQTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:14,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:15,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:16,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:17,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:18,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:24,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:25,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A23:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2402,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2403,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY +HLA-A2404,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY +HLA-A2405,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2406,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY +HLA-A2407,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY +HLA-A2408,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2409,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2410,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRWY +HLA-A2411,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2413,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2414,YSAMYEEKVAHTDENIAYVRYHYYTWAVQAYTGY +HLA-A2415,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY +HLA-A2417,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY +HLA-A2418,YSAMYEEKVAHTDENIAYLMFHYYTWAELAYTWY +HLA-A2419,YSAMYEEKVAQTDVDTLYLMFHYYTWAVQAYTGY +HLA-A2420,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2421,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2422,YSAMYEEKVAHTDENIAYLMFHYYTWAVWVYTWY +HLA-A2423,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY +HLA-A2424,YSAMYRNNVAQTDENIAYLMFHYYTWAVLAYTGY +HLA-A2425,CSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2426,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2427,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2428,YSAMYEEKVAHTHVDTLYLMFHYYTWAVQAYTGY +HLA-A2429,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2430,YSAMYEEKVAHTHENIAYLMFHYYTWAVQAYTGY +HLA-A2431,YSAMYEQKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2432,YSAMYEEKVAHTDESIAYLMFHYYTWAVQAYTGY +HLA-A2433,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY +HLA-A2434,YSAMYEEKVAHIDENIAYLMFHYYTWAVQAYTGY +HLA-A2435,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2437,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2438,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2439,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2440,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2441,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY +HLA-A2442,YSAMYGEKVAHTHENIAYLMFHYYTWAVQAYTGY +HLA-A2443,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2444,YSAMYEEKVAHTDVDTLYLMFHYYTWAVQAYTGY +HLA-A2446,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRGY +HLA-A2447,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2449,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2450,YYAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2451,YSAMYEEKVAHTDENIAYLIYHYYTWAVQAYTGY +HLA-A2452,YSAMYEEKVAHTDENIAYLRFHYYTWAVQAYTGY +HLA-A2453,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY +HLA-A2454,YSAMYEEKVAHTDENIAYLMFHYYTWAVQPYTGY +HLA-A2455,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYEGY +HLA-A2456,YSAMYEEKVAHTDENIAYLMFHYYTWAEQAYTGY +HLA-A2457,YSAMYEEKVAHTDENIAYIMYHYYTWAVQAYTGY +HLA-A2458,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2459,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYTGY +HLA-A2461,YSAMYEEKVAHTDEKIAYLMFHYYTWAVQAYTGY +HLA-A2462,YSAMYEEKVAHTDENIAYLMFQDYTWAVQAYTGY +HLA-A2463,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2464,YSAMYEEKVAHTDENIAYLWIHYYTWAVQAYTGY +HLA-A2465,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A2466,YSAMYEEKVAHTDENIAYLMFEHYTWAVQAYTGY +HLA-A2467,YSAMYRNNVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2468,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2469,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2470,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2471,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2472,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2473,YSAMYEEKVAHTDENIAYLMFDYYTWAVQAYTGY +HLA-A2474,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2475,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2476,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2477,YSAMYQEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2478,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2479,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY +HLA-A24:04,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY +HLA-A24:05,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY +HLA-A24:07,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:08,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRWY +HLA-A24:100,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:101,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:102,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:103,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:104,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:105,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:106,YSAMYEEKVAHTDENIAYLMFDDYTWAVQAYTGY +HLA-A24:107,YSAMYEEKVAHTDENIAYLMFHYYTWAVHAYTGY +HLA-A24:108,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:109,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY +HLA-A24:110,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:111,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:112,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:113,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:114,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:115,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:116,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:117,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:118,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:119,YSAMYEEKVAHADENIAYLMFHYYTWAVQAYTGY +HLA-A24:120,YSAMYEEKVAHTDENIAYIMFHYYTWAVQAYTGY +HLA-A24:121,YSAMYEEKVAHTDENIAYLMFHSYTWAVQAYTGY +HLA-A24:122,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:123,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:124,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:125,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY +HLA-A24:126,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:127,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:128,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:129,YSAMYQENMAHTDANTLYLMFHYYTWAVQAYTGY +HLA-A24:13,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY +HLA-A24:130,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:131,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:133,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:134,YSAMYEEKVAHTDENIAYLMFHYYPWAVQAYTGY +HLA-A24:135,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:136,YSAMYEEKVAHTDENIAYLMFHYYTWVVQAYTGY +HLA-A24:137,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:138,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTWY +HLA-A24:139,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:14,YSAMYEEKVAHTDENIAYVRYHYYTWAVQAYTGY +HLA-A24:140,YSTMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:141,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:142,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:143,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYLGY +HLA-A24:144,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:15,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY +HLA-A24:17,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY +HLA-A24:18,YSAMYEEKVAHTDENIAYLMFHYYTWAELAYTWY +HLA-A24:19,YSAMYEEKVAQTDVDTLYLMFHYYTWAVQAYTGY +HLA-A24:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVWVYTWY +HLA-A24:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY +HLA-A24:24,YSAMYRNNVAQTDENIAYLMFHYYTWAVLAYTGY +HLA-A24:25,CSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:27,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:28,YSAMYEEKVAHTHVDTLYLMFHYYTWAVQAYTGY +HLA-A24:29,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:30,YSAMYEEKVAHTHENIAYLMFHYYTWAVQAYTGY +HLA-A24:31,YSAMYEQKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:32,YSAMYEEKVAHTDESIAYLMFHYYTWAVQAYTGY +HLA-A24:33,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY +HLA-A24:34,YSAMYEEKVAHIDENIAYLMFHYYTWAVQAYTGY +HLA-A24:35,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:37,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:38,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:39,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:41,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY +HLA-A24:42,YSAMYGEKVAHTHENIAYLMFHYYTWAVQAYTGY +HLA-A24:43,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:44,YSAMYEEKVAHTDVDTLYLMFHYYTWAVQAYTGY +HLA-A24:46,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRGY +HLA-A24:47,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:49,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:50,YYAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:51,YSAMYEEKVAHTDENIAYLIYHYYTWAVQAYTGY +HLA-A24:52,YSAMYEEKVAHTDENIAYLRFHYYTWAVQAYTGY +HLA-A24:53,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY +HLA-A24:54,YSAMYEEKVAHTDENIAYLMFHYYTWAVQPYTGY +HLA-A24:55,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYEGY +HLA-A24:56,YSAMYEEKVAHTDENIAYLMFHYYTWAEQAYTGY +HLA-A24:57,YSAMYEEKVAHTDENIAYIMYHYYTWAVQAYTGY +HLA-A24:58,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:59,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYTGY +HLA-A24:61,YSAMYEEKVAHTDEKIAYLMFHYYTWAVQAYTGY +HLA-A24:62,YSAMYEEKVAHTDENIAYLMFQDYTWAVQAYTGY +HLA-A24:63,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:64,YSAMYEEKVAHTDENIAYLWIHYYTWAVQAYTGY +HLA-A24:66,YSAMYEEKVAHTDENIAYLMFEHYTWAVQAYTGY +HLA-A24:67,YSAMYRNNVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:68,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:69,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:70,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:71,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:72,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:73,YSAMYEEKVAHTDENIAYLMFDYYTWAVQAYTGY +HLA-A24:74,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:75,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:76,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:77,YSAMYQEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:78,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:79,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:80,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:81,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:82,YTAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:85,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:87,YSAMYEEKVAHTDENIAYLMFHYYTWAVRAYTGY +HLA-A24:88,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:89,YSAMYGEKVAHTHVDTLYLMFHYYTWAVQAYTGY +HLA-A24:91,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:92,YSAMYEEKVAHTDENIAYIIYHYYTWAVQAYTGY +HLA-A24:93,YSAMYEEKVAHTDENIAYVMFHYYTWAVQAYTGY +HLA-A24:94,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY +HLA-A24:95,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:96,YSAMYEEKVAHTDENIAYLMFNFYTWAVQAYTGY +HLA-A24:97,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:98,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A24:99,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY +HLA-A2501,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A2502,YYAMYRNNVAQTDESIAYIRYQDYTWAEWAYRWY +HLA-A2503,YFAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A2504,YYAMYRNNVAHTDESIAYIRYQDYTWAEQAYRWY +HLA-A2505,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A2506,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYTWY +HLA-A25:01,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A25:02,YYAMYRNNVAQTDESIAYIRYQDYTWAEWAYRWY +HLA-A25:03,YFAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A25:04,YYAMYRNNVAHTDESIAYIRYQDYTWAEQAYRWY +HLA-A25:05,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A25:06,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYTWY +HLA-A25:07,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A25:08,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A25:09,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A25:10,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A25:11,YYAMYRNNVAHTHESIAYIRYQDYTWAEWAYRWY +HLA-A25:13,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY +HLA-A2601,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2602,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY +HLA-A2603,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY +HLA-A2604,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYLWY +HLA-A2605,YYAMYRNNVAHTDENTLYIRYQDYTWAEWAYRWY +HLA-A2606,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY +HLA-A2607,YYAMYGEKVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2608,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY +HLA-A2609,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYTWY +HLA-A2610,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2611,YYAMYRNNVAHTDANTLYIRYQDYTWPMSEPASD +HLA-A2612,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY +HLA-A2613,YYAMYRNNVAQTDANTLYIRYQDYTWAEWAYRWY +HLA-A2614,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2615,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2616,YSAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2617,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2618,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY +HLA-A2619,YYAMYQENVAQTDANTLYIRYQDYTWAEWAYRWY +HLA-A2620,YFAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2621,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY +HLA-A2622,YYAMYRNNVAHTDANTLYVRYQDYTWAEWAYRWY +HLA-A2623,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2624,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2626,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2627,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2628,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2629,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY +HLA-A2630,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY +HLA-A2631,YYAMYPNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2632,YYAMYRNNVAHTDANTLYMVYQDYTWAEWAYRWY +HLA-A2633,YYAMYRNNVAQIHANTLYIRYQDYTWAEWAYRWY +HLA-A2634,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYWWY +HLA-A2635,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:01,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:02,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY +HLA-A26:03,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY +HLA-A26:04,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYLWY +HLA-A26:05,YYAMYRNNVAHTDENTLYIRYQDYTWAEWAYRWY +HLA-A26:06,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY +HLA-A26:07,YYAMYGEKVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:08,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY +HLA-A26:09,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYTWY +HLA-A26:10,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:12,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY +HLA-A26:13,YYAMYRNNVAQTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:14,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:15,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:16,YSAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:17,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:18,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY +HLA-A26:19,YYAMYQENVAQTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:20,YFAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:21,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY +HLA-A26:22,YYAMYRNNVAHTDANTLYVRYQDYTWAEWAYRWY +HLA-A26:23,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:24,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:26,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:27,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:28,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:29,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY +HLA-A26:30,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY +HLA-A26:31,YYAMYPNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:32,YYAMYRNNVAHTDANTLYMVYQDYTWAEWAYRWY +HLA-A26:33,YYAMYRNNVAQIHANTLYIRYQDYTWAEWAYRWY +HLA-A26:34,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYWWY +HLA-A26:35,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:36,YYAMYRNNVAHTHANTLYIRYQDYTWAEWAYRWY +HLA-A26:37,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:38,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:39,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:40,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:41,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:42,YYAIYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:43,YYAMYRNNVAHTDANTLYIRYQDYTWAELAYRWY +HLA-A26:45,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:46,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:47,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A26:48,YYAMYRNKVAHTDANTLYIRYQDYTWAEQAYRWY +HLA-A26:49,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY +HLA-A26:50,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A2901,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2902,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2903,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTGY +HLA-A2904,YTAMYLQHVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2905,YTAMYLQNVAQTDANTLYIMYRDYTWAEQAYTWY +HLA-A2906,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2907,YTAMYLQNVAQTDANTLYLMFRDYTWAVLAYTWY +HLA-A2909,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2910,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2911,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2912,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2913,YTAMYLQNVAQTDESIAYIMYRDYTWAVLAYTWY +HLA-A2914,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2915,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A2916,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:01,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:02,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:03,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTGY +HLA-A29:04,YTAMYLQHVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:05,YTAMYLQNVAQTDANTLYIMYRDYTWAEQAYTWY +HLA-A29:06,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:07,YTAMYLQNVAQTDANTLYLMFRDYTWAVLAYTWY +HLA-A29:09,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:10,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:11,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:12,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:13,YTAMYLQNVAQTDESIAYIMYRDYTWAVLAYTWY +HLA-A29:14,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:15,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:16,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:17,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:18,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:19,YTAMYLQNVAHTHVDTLYIMYRDYTWAVLAYTWY +HLA-A29:20,YTAMYLQNVAHTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:21,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY +HLA-A29:22,YTAMYLQNVAQTDANTLYVRYRDYTWAVLAYTWY +HLA-A3001,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A3002,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A3003,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A3004,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY +HLA-A3006,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY +HLA-A3007,YSAMYEEKVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A3008,YYAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A3009,YSAMYQENVAHTDENTLYIIYEHYTWAVLAYTWY +HLA-A3010,YSAMYQENVAHTDENTLYIIHEHYTWARLAYTWY +HLA-A3011,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A3012,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A3013,YSAMYQENVAHTHVDTLYIIYEHYTWARLAYTWY +HLA-A3014,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A3015,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A3016,YSAMYQENVAQTHVDTLYIIYEHYTWAWLAYTWY +HLA-A3017,YSAMYQENVAQTDVDTLYIIYEHYTWAVWAYTWY +HLA-A3018,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A3019,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A3020,YSAMYQENVAQTEVDTLYIIYEHYTWAWLAYTWY +HLA-A3021,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A3022,YSAMYGEKVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A30:01,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:02,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A30:03,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A30:04,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY +HLA-A30:06,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY +HLA-A30:07,YSAMYEEKVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A30:08,YYAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:09,YSAMYQENVAHTDENTLYIIYEHYTWAVLAYTWY +HLA-A30:10,YSAMYQENVAHTDENTLYIIHEHYTWARLAYTWY +HLA-A30:11,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:12,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A30:13,YSAMYQENVAHTHVDTLYIIYEHYTWARLAYTWY +HLA-A30:15,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:16,YSAMYQENVAQTHVDTLYIIYEHYTWAWLAYTWY +HLA-A30:17,YSAMYQENVAQTDVDTLYIIYEHYTWAVWAYTWY +HLA-A30:18,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:19,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:20,YSAMYQENVAQTEVDTLYIIYEHYTWAWLAYTWY +HLA-A30:22,YSAMYGEKVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A30:23,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:24,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:25,YSAMYQENVAQTDENTLYIIYEHYTWARLAYTWY +HLA-A30:26,YSAMYQENVAQTDVDTLYIIYRDYTWAWLAYTWY +HLA-A30:28,YSAMYQENVAHTDENTLYIVYEHYTWARLAYTWY +HLA-A30:29,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTSY +HLA-A30:30,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:31,YSAMYQENVARTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:32,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A30:33,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A30:34,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY +HLA-A30:35,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:36,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:37,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:38,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:39,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:40,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A30:41,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY +HLA-A3101,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3102,YTAMYQEKVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3103,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY +HLA-A3104,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY +HLA-A3105,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTGY +HLA-A3106,YTAMYQENVAHIDVDTLYIMYRDYTWAVLAYTWY +HLA-A3107,YTAMYQEKVAHTDENIAYIMYQDYTWAVLAYTWY +HLA-A3108,YTAMYEEKVAHTDENIAYIMYQDYTWAVLAYTWY +HLA-A3109,YTAMYQENVGHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3110,YTAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY +HLA-A3111,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3112,YTAMYQENVAHIDVDTLYIKYQDYTWAVLAYTWY +HLA-A3113,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3114,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3115,YTAMYQENVARIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3116,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3117,YTAMYQENVAHINVDTLYIMYQDYTWAVLAYTWY +HLA-A3118,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTRY +HLA-A31:01,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:02,YTAMYQEKVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:03,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY +HLA-A31:04,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY +HLA-A31:05,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTGY +HLA-A31:06,YTAMYQENVAHIDVDTLYIMYRDYTWAVLAYTWY +HLA-A31:07,YTAMYQEKVAHTDENIAYIMYQDYTWAVLAYTWY +HLA-A31:08,YTAMYEEKVAHTDENIAYIMYQDYTWAVLAYTWY +HLA-A31:09,YTAMYQENVGHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:10,YTAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY +HLA-A31:11,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:12,YTAMYQENVAHIDVDTLYIKYQDYTWAVLAYTWY +HLA-A31:13,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:15,YTAMYQENVARIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:16,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:17,YTAMYQENVAHINVDTLYIMYQDYTWAVLAYTWY +HLA-A31:18,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTRY +HLA-A31:19,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:20,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:21,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:22,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:23,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:24,YTAMYQENVAHIDVDTLYIMYQDYTWAAQAYRWY +HLA-A31:25,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYRWY +HLA-A31:26,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:27,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:28,YTAMYQENVTHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:29,YTAMYQENVAHIDVDTLYLMFQDYTWAVLAYTWY +HLA-A31:30,YTAMYQENVAHIDVDTLYIMYQDYTWAVWAYTWY +HLA-A31:31,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:32,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:33,YTAMYQENVAHIDGDTLYIMYQDYTWAVLAYTWY +HLA-A31:34,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:35,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:36,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A31:37,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3201,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A3202,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY +HLA-A3203,YFAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY +HLA-A3204,YFAMYQENVAHTDESIAYIIYRDYTWAELAYTWY +HLA-A3205,YFAMYQEKVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A3206,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A3207,YSAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A3208,YFAMYQENVAHTHESIAYIMYQDYTWAVLAYTWY +HLA-A3209,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTRY +HLA-A3210,YFAMYQENVAHTDESIAYIMYQDYTWAEWAYTWY +HLA-A3211,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYEWY +HLA-A3212,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A3213,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTGY +HLA-A3214,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A3215,YFAMYRNNVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:01,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:02,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY +HLA-A32:03,YFAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY +HLA-A32:04,YFAMYQENVAHTDESIAYIIYRDYTWAELAYTWY +HLA-A32:05,YFAMYQEKVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:06,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:07,YSAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:08,YFAMYQENVAHTHESIAYIMYQDYTWAVLAYTWY +HLA-A32:09,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTRY +HLA-A32:10,YFAMYQENVAHTDESIAYIMYQDYTWAEWAYTWY +HLA-A32:12,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:13,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTGY +HLA-A32:14,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:15,YFAMYRNNVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:16,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:17,YFAMYQENVAQTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:18,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:20,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:21,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:22,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY +HLA-A32:23,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:24,YFAMYQENMAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A32:25,YFAMYHENVAHTDESIAYIMYQDYTWAVLAYTWY +HLA-A3301,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A3303,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3304,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A3305,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A3306,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3307,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A3308,YTAMYGEKVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3309,YTAMYGENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3310,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTGY +HLA-A3311,YTAMYRNNVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A3312,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3313,YTAMYRNNVAHTDANTLYIMYQDYTWAVLAYTWY +HLA-A33:01,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A33:03,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:04,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A33:05,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A33:06,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:07,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A33:08,YTAMYGEKVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:09,YTAMYGENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:10,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTGY +HLA-A33:11,YTAMYRNNVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:12,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:13,YTAMYRNNVAHTDANTLYIMYQDYTWAVLAYTWY +HLA-A33:14,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:15,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:16,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A33:17,YTAMYRNNVAHIDADTLYIMYQDYTWAVLAYTWY +HLA-A33:18,YTAMYRNNVAHIDVDTLYIMYRDYTWAVLAYTWY +HLA-A33:19,YTAMYRNNVAHIDVDTLYLMFHYYTWAVQAYTGY +HLA-A33:20,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:21,YTAMYEENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:22,YTAMYRNNVAHIDVDTLYVRYQDYTWAVLAYTWY +HLA-A33:23,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:24,YTAMYRNNVAHTHVDTLYIMYQDYTWAVLAYTWY +HLA-A33:25,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:26,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:27,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH +HLA-A33:28,YTAMYRNNVAHIDVDTLYIMYQDYTWAELAYTWY +HLA-A33:29,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:30,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A33:31,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A3401,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY +HLA-A3402,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A3403,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A3404,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A3405,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY +HLA-A3406,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYTWY +HLA-A3407,YYAMYRNNVSQTDVDTLYIIYRDYTWAELAYTWY +HLA-A3408,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A34:01,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY +HLA-A34:02,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A34:03,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A34:04,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A34:05,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY +HLA-A34:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYTWY +HLA-A34:07,YYAMYRNNVSQTDVDTLYIIYRDYTWAELAYTWY +HLA-A34:08,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY +HLA-A3601,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY +HLA-A3602,YFAMYQENMAHTDANTLYIIYRDYTWVARAYTWY +HLA-A3603,YFAMYQENMAHTDANTLYLMYRDYTWVARVYTWY +HLA-A3604,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRWY +HLA-A36:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY +HLA-A36:02,YFAMYQENMAHTDANTLYIIYRDYTWVARAYTWY +HLA-A36:03,YFAMYQENMAHTDANTLYLMYRDYTWVARVYTWY +HLA-A36:04,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRWY +HLA-A36:05,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY +HLA-A4301,YYAMYLQNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A43:01,YYAMYLQNVAHTDANTLYIRYQDYTWAEWAYRWY +HLA-A6601,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY +HLA-A6602,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYEWY +HLA-A6603,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYEWY +HLA-A6604,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWH +HLA-A6605,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYRWY +HLA-A6606,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYRWY +HLA-A66:01,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY +HLA-A66:02,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYEWY +HLA-A66:03,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYEWY +HLA-A66:04,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWH +HLA-A66:05,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYRWY +HLA-A66:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYRWY +HLA-A66:07,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY +HLA-A66:08,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY +HLA-A66:09,YYAMYRNNVAQTDVDTLYVRYQDYTWAEWAYRWY +HLA-A66:10,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRGY +HLA-A66:11,YYAMYRNNVAQTDADTLYIRYQDYTWAEWAYRWY +HLA-A66:12,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY +HLA-A66:13,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY +HLA-A66:14,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY +HLA-A66:15,YYAMYRNNVAHIDVDTLYIRYQDYTWAEWAYRWY +HLA-A6801,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6802,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A6803,YYAMYRNNVAHTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6804,YYAMYRNNVAHIDVDTLYIMYRDYTWAVWAYTWY +HLA-A6805,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY +HLA-A6806,YYAMYRNNVAQTDVDTLYIMYEHYTWAVWAYTWY +HLA-A6807,YYAMYRNNVAQTDVDTLYIMYRHYTWAVWAYTWY +HLA-A6808,YYAMYRNNVAQTDVDTLYIMYRDYTWAVLAYTWY +HLA-A6809,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTWY +HLA-A6810,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6812,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6813,YYAMYRENVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6814,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6815,YYAMYRNNVAHTHVDTLYIRYHYYTWAVWAYTWY +HLA-A6816,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6817,YYAMYRNNVAQTDVDTLYIMYRVYTWAVWAYTWY +HLA-A6819,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6820,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY +HLA-A6821,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6822,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6823,YYAMYRNNVAQTDVDTLYIRYRDYTWAVWAYTWY +HLA-A6824,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6825,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6826,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTGY +HLA-A6827,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A6828,YYAMYRNNVAQTDVDTLYIRYHYYTWAVRAYTWY +HLA-A6829,YTAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6830,YYAMYGENVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6831,YYAMYRNNVAHTDVDTLYIRYHYYTWAVWAYTWY +HLA-A6832,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6833,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6834,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYMWY +HLA-A6835,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6836,YYAMYRNNVAQTDENIAYIMYRDYTWAVWAYTWY +HLA-A6837,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6838,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6839,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A6840,YYAMYRNNVGQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A68:01,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:02,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A68:03,YYAMYRNNVAHTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:04,YYAMYRNNVAHIDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:05,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY +HLA-A68:06,YYAMYRNNVAQTDVDTLYIMYEHYTWAVWAYTWY +HLA-A68:07,YYAMYRNNVAQTDVDTLYIMYRHYTWAVWAYTWY +HLA-A68:08,YYAMYRNNVAQTDVDTLYIMYRDYTWAVLAYTWY +HLA-A68:09,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTWY +HLA-A68:10,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:12,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:13,YYAMYRENVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:14,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:15,YYAMYRNNVAHTHVDTLYIRYHYYTWAVWAYTWY +HLA-A68:16,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:17,YYAMYRNNVAQTDVDTLYIMYRVYTWAVWAYTWY +HLA-A68:19,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:20,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY +HLA-A68:21,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:22,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:23,YYAMYRNNVAQTDVDTLYIRYRDYTWAVWAYTWY +HLA-A68:24,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:25,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:26,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTGY +HLA-A68:27,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A68:28,YYAMYRNNVAQTDVDTLYIRYHYYTWAVRAYTWY +HLA-A68:29,YTAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:30,YYAMYGENVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:31,YYAMYRNNVAHTDVDTLYIRYHYYTWAVWAYTWY +HLA-A68:32,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:33,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:34,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYMWY +HLA-A68:35,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:36,YYAMYRNNVAQTDENIAYIMYRDYTWAVWAYTWY +HLA-A68:37,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:38,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:39,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:40,YYAMYRNNVGQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A68:41,YYAMYRNNVAQTDVDTLYIMYRDYTWVVWAYTWY +HLA-A68:42,YYAMYRNNVAQTDVDTLYIMYRDYTWAEWAYTWY +HLA-A68:43,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:44,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A68:45,YSAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:46,YYAMYRNNVAQTDVNTLYIMYRDYTWAVWAYTWY +HLA-A68:47,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:48,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A68:50,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:51,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A68:52,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY +HLA-A68:53,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY +HLA-A68:54,YYAMYRNNVAQTDVDTLYIRYHYYTWAEWAYTWY +HLA-A6901,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY +HLA-A69:01,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY +HLA-A7401,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A7402,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A7403,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A7404,YFAMYGEKVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A7405,YFAMYQENVAHADVDTLYIMYQDYTWAVLAYTWY +HLA-A7406,YFAMYQENVAHTHVDTLYIMYQDYTWAVLAYTWY +HLA-A7407,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A7408,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A7409,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A7410,YFAMYQENVAHTDANTLYIMYQDYTWAVLAYTWY +HLA-A7411,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A74:01,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A74:02,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A74:03,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A74:04,YFAMYGEKVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A74:05,YFAMYQENVAHADVDTLYIMYQDYTWAVLAYTWY +HLA-A74:06,YFAMYQENVAHTHVDTLYIMYQDYTWAVLAYTWY +HLA-A74:07,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY +HLA-A74:08,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A74:09,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A74:10,YFAMYQENVAHTDANTLYIMYQDYTWAVLAYTWY +HLA-A74:11,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY +HLA-A74:13,YFAMYQENVAQTDVDTLYIMYQDYTWAVLAYTWY +HLA-A8001,YFAMYEENVAHTNANTLYIIYRDYTWARLAYEGY +HLA-A80:01,YFAMYEENVAHTNANTLYIIYRDYTWARLAYEGY +HLA-A80:02,YFAMYEENVAHTDVDTLYIIYRDYTWARLAYEGY +HLA-A9201,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYRWY +HLA-A9202,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A9203,YFAMYQENVAQTHVDTLYVRCHYYTWAVLAYTWY +HLA-A9204,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY +HLA-A9205,YFAMYGEKVAHTHVDTLYVRYEYYTWAVLAYTWY +HLA-A9206,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A9207,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A9208,YYAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY +HLA-A9209,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A9210,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY +HLA-A9211,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A9212,YFAMYGEKVAHTDENIAYVRCHYYTWAVLAYTWY +HLA-A9214,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY +HLA-A9215,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY +HLA-A9216,YFAMYGEKVAHTHLDTLYVRYHYYTWAVLAYTWY +HLA-A9217,YFAMYGEKVAHTHVDTLYVRYQDYTWAEWAYTWY +HLA-A9218,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A9219,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A9220,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A9221,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A9222,YYAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY +HLA-A9223,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-A9224,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY +HLA-A9226,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY +HLA-B0702,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0703,YYSEYRNIYTNTDESNLYLSYDYYTWAERAYEWY +HLA-B0704,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYEWY +HLA-B0705,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B0706,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B0707,YYSEYRNIYAQTDESNLYLRYDYYTWAERAYEWY +HLA-B0708,YYSEYRNIFTNTDESNLYLSYDYYTWAERAYEWY +HLA-B0709,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY +HLA-B0710,YYSEYRNICAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0711,YYSEYRNIYAQTDENNLYLSYDSYTWAERAYEWY +HLA-B0712,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY +HLA-B0713,YYSGYREKYRQADVSNLYLSYDYYTWAERAYEWY +HLA-B0714,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY +HLA-B0715,YYSEYRNIYAQADVSNLYLSYDYYTWAERAYEWY +HLA-B0716,YYSEYRNIYTNTYESNLYLSYDYYTWAERAYEWY +HLA-B0717,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY +HLA-B0718,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY +HLA-B0719,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYTWY +HLA-B0720,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLSY +HLA-B0721,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0722,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0723,YYSEYRNIYAQTDESNLHLSYDYYTWAERAYEWY +HLA-B0724,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY +HLA-B0725,YYSEYRNIYAQTDESNLYLSYDYYTWAVDAYEWY +HLA-B0726,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYEWY +HLA-B0727,YYSEYRNISTNTYEDTLYLSYDYYTWAERAYEWY +HLA-B0728,YYSEYRNIYAQTDESNLYLSYDDYTWAERAYEWY +HLA-B0729,YDSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0730,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0731,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYTWY +HLA-B0732,YYSEYRNIFTNTDESNLYLSYNYYTWAERAYEWY +HLA-B0733,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0734,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYTWY +HLA-B0735,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0736,YYSEYRNIYAQTDENIAYLSYDYYTWAERAYEWY +HLA-B0737,YYSEYRNIYANTYESNLYLSYDYYTWAERAYEWY +HLA-B0738,YYSEYRNIFTNTYENIAYLSYDYYTWAERAYEWY +HLA-B0739,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0740,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B0741,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0742,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0743,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYTWY +HLA-B0744,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0745,YYSEYRNIYAQTDESNLYLSYDYYTWAERTYEWY +HLA-B0746,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0747,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0748,YYSEYRNIYAQTDESNLYLSYDYYTWAVLAYEWY +HLA-B0749,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0750,YYSEYRNISTNTYESNLYLSYDYYTWAERAYEWY +HLA-B0751,YYSEYRNIYAQTDESNLYLSYDYYTWAARAYEWY +HLA-B0752,YYSEYRNIYAQTDESNLYLSYDYYTWAERVYEWY +HLA-B0753,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B0754,YYSEYREIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0755,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYEWY +HLA-B0756,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0757,YYSEYRNIYAQTDENNLYLSYDYYTWAERAYEWY +HLA-B0758,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:02,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:03,YYSEYRNIYTNTDESNLYLSYDYYTWAERAYEWY +HLA-B07:04,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYEWY +HLA-B07:05,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B07:06,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B07:07,YYSEYRNIYAQTDESNLYLRYDYYTWAERAYEWY +HLA-B07:08,YYSEYRNIFTNTDESNLYLSYDYYTWAERAYEWY +HLA-B07:09,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY +HLA-B07:10,YYSEYRNICAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:100,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYLWY +HLA-B07:101,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:102,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:103,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:104,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:105,YYSEYRNIYAQTVESNLYLSYNYYTWAERAYEWY +HLA-B07:106,YYSEYRNIYAQTDESNLYLSYDYYTRAERAYEWY +HLA-B07:107,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:108,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:109,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:11,YYSEYRNIYAQTDENNLYLSYDSYTWAERAYEWY +HLA-B07:110,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:112,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B07:113,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:114,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:115,YYSEYRNIYAQTDESNLYLSYNFYTWAERAYEWY +HLA-B07:12,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY +HLA-B07:13,YYSGYREKYRQADVSNLYLSYDYYTWAERAYEWY +HLA-B07:14,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY +HLA-B07:15,YYSEYRNIYAQADVSNLYLSYDYYTWAERAYEWY +HLA-B07:16,YYSEYRNIYTNTYESNLYLSYDYYTWAERAYEWY +HLA-B07:17,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY +HLA-B07:18,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY +HLA-B07:19,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYTWY +HLA-B07:20,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLSY +HLA-B07:21,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:22,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:23,YYSEYRNIYAQTDESNLHLSYDYYTWAERAYEWY +HLA-B07:24,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY +HLA-B07:25,YYSEYRNIYAQTDESNLYLSYDYYTWAVDAYEWY +HLA-B07:26,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYEWY +HLA-B07:27,YYSEYRNISTNTYEDTLYLSYDYYTWAERAYEWY +HLA-B07:28,YYSEYRNIYAQTDESNLYLSYDDYTWAERAYEWY +HLA-B07:29,YDSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:30,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:31,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYTWY +HLA-B07:32,YYSEYRNIFTNTDESNLYLSYNYYTWAERAYEWY +HLA-B07:33,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:34,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYTWY +HLA-B07:35,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:36,YYSEYRNIYAQTDENIAYLSYDYYTWAERAYEWY +HLA-B07:37,YYSEYRNIYANTYESNLYLSYDYYTWAERAYEWY +HLA-B07:38,YYSEYRNIFTNTYENIAYLSYDYYTWAERAYEWY +HLA-B07:39,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:40,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B07:41,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:42,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:43,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYTWY +HLA-B07:44,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:45,YYSEYRNIYAQTDESNLYLSYDYYTWAERTYEWY +HLA-B07:46,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:47,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:48,YYSEYRNIYAQTDESNLYLSYDYYTWAVLAYEWY +HLA-B07:50,YYSEYRNISTNTYESNLYLSYDYYTWAERAYEWY +HLA-B07:51,YYSEYRNIYAQTDESNLYLSYDYYTWAARAYEWY +HLA-B07:52,YYSEYRNIYAQTDESNLYLSYDYYTWAERVYEWY +HLA-B07:53,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B07:54,YYSEYREIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:55,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYEWY +HLA-B07:56,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:57,YYSEYRNIYAQTDENNLYLSYDYYTWAERAYEWY +HLA-B07:58,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:59,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:60,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY +HLA-B07:61,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:62,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:63,YYSDYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:64,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEGY +HLA-B07:65,YYATYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:66,YYSEYRNIYAQTDESNLYLSYDYYTWAEQAYEWY +HLA-B07:68,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:69,YYSEYRNICTNTDESNLYLSYNYYTWAERAYEWY +HLA-B07:70,YCSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:71,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:72,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:73,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:74,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:75,YYSEYRNIYAQTYENNLYLSYDYYTWAERAYEWY +HLA-B07:76,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:77,YYSEYRNIYAQTDESNLYLRSDYYTWAERAYEWY +HLA-B07:78,YYSEYRNIYAQTDESNLYWTYNLYTWAERAYEWY +HLA-B07:79,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:80,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYEWY +HLA-B07:81,YYSEYRNIYAQTDESIAYLSYDYYTWAERAYEWY +HLA-B07:82,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:83,YYSEYRNIFAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:84,YYSEYRNIYAQTDESNLYWTYDYYTWAERAYEWY +HLA-B07:85,YYSEYRNICTNTDESNLYLSYDYYTWAERAYEWY +HLA-B07:86,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:87,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:88,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:89,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:90,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B07:91,YYSEYRNIYAQTYESNLYLSYDYYTWAERAYEWY +HLA-B07:92,YYSEYRNIYAQTDVSNLYLSYDYYTWAERAYEWY +HLA-B07:93,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:94,YYSEYWNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:95,YYSEYRNIYAQTDESNLYFSYDYYTWAERAYEWY +HLA-B07:96,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B07:97,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY +HLA-B07:98,YYSEYRNIYAQTDESNLYLSYDYYTCAERAYEWY +HLA-B07:99,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY +HLA-B0801,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0802,YDSEYRNIFTNTDENTAYLSYNYYTWAVDAYTWY +HLA-B0803,YDSEYRNIFTNTYENIAYLSYNYYTWAVDAYTWY +HLA-B0804,YDSEYRNISTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0805,YDSEYRNTFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0806,YDSEYRNIFTNTDENNLYLSYNYYTWAERAYTWY +HLA-B0807,YDSEYRNIFTNTDESNLYLSYDYYTWAVDAYTWY +HLA-B0808,YDSEYRNIFTNTDESNLYLSYNYYPGPWTPTRGT +HLA-B0809,YDSEYRNIFTNTDESNLYWTYNYYTWAVDAYTWY +HLA-B0810,YDSEYRDIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0811,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYAWY +HLA-B0812,YDSEYRNIFTNTDESNLYLRYNYYTWAVDAYTWY +HLA-B0813,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYTWY +HLA-B0814,YDSEYRNIFTNTDESNLYLSYHDYTWAVDAYTWY +HLA-B0815,YDSEYRNIFTNTDVSNLYLSYNYYTWAVDAYTWY +HLA-B0816,YDSEYRNIFTNADESNLYLRYNYYTWAVDAYTWY +HLA-B0817,YDSEYREISTNTDENNLYLSYNYYTWAVDAYTWY +HLA-B0818,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0819,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0820,YDSEYRNIFTNTDESNLYLSYNYYTWAERAYTWY +HLA-B0821,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYLWY +HLA-B0822,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0823,YDSEYRNIFTNTYESNLYLSYNYYTWAVDAYTWY +HLA-B0824,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0825,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYLWY +HLA-B0826,YYAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0827,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0828,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY +HLA-B0829,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0831,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0832,YDSTYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B0833,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:01,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:02,YDSEYRNIFTNTDENTAYLSYNYYTWAVDAYTWY +HLA-B08:03,YDSEYRNIFTNTYENIAYLSYNYYTWAVDAYTWY +HLA-B08:04,YDSEYRNISTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:05,YDSEYRNTFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:07,YDSEYRNIFTNTDESNLYLSYDYYTWAVDAYTWY +HLA-B08:09,YDSEYRNIFTNTDESNLYWTYNYYTWAVDAYTWY +HLA-B08:10,YDSEYRDIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:11,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYAWY +HLA-B08:12,YDSEYRNIFTNTDESNLYLRYNYYTWAVDAYTWY +HLA-B08:13,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYTWY +HLA-B08:14,YDSEYRNIFTNTDESNLYLSYHDYTWAVDAYTWY +HLA-B08:15,YDSEYRNIFTNTDVSNLYLSYNYYTWAVDAYTWY +HLA-B08:16,YDSEYRNIFTNADESNLYLRYNYYTWAVDAYTWY +HLA-B08:17,YDSEYREISTNTDENNLYLSYNYYTWAVDAYTWY +HLA-B08:18,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:20,YDSEYRNIFTNTDESNLYLSYNYYTWAERAYTWY +HLA-B08:21,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYLWY +HLA-B08:22,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:23,YDSEYRNIFTNTYESNLYLSYNYYTWAVDAYTWY +HLA-B08:24,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:25,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYLWY +HLA-B08:26,YYAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:27,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:28,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY +HLA-B08:29,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:31,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:32,YDSTYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:33,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:34,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:35,YDSEYRNIFTNTDESNLYLSYNSYTWAVDAYTWY +HLA-B08:36,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:37,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY +HLA-B08:38,YDSEYREIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:39,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:40,YDSEYRNIFTNTDESNLYLSYNYYTWAVRAYEWY +HLA-B08:41,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:42,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:43,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:44,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:45,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:46,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:47,YDSEYRNIFTNTDENNLYLSYNYYTWAVDAYTWY +HLA-B08:48,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:49,YDSEYRNIFTNTDESNLYIRSNFYTWAVDAYTWY +HLA-B08:50,YYSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:51,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:52,YDSEYRNIFTNTDESIAYLSYNYYTWAVDAYTWY +HLA-B08:53,YDSEYRNIFTNTDESNLYLSYNYYTWAEDAYTWY +HLA-B08:54,YDSEYREISTNTYESNLYLSYNYYTWAVDAYTWY +HLA-B08:55,YDSEYRNIFTNTDESNLYLSYNYYTWAVLTYTWY +HLA-B08:56,YDAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:57,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:58,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:59,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:60,YDSEYRNIFTNTDESNLYISYNYYTWAVDAYTWY +HLA-B08:61,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B08:62,YHSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B1301,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY +HLA-B1302,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B1303,YYTMYREISTNTYENTAYWTYNLYTWAVLAYLWY +HLA-B1304,YYTMYREISTNTYENTAYWTYDSYTWAVLAYLWY +HLA-B1306,YYTMYREISTNTYENTAYIRYNLYTWAVLAYTWY +HLA-B1308,YYTMYREISTNTYENTAYWTYNLYTWAVLACEWY +HLA-B1309,YYTMYREISTNTYESNLYWTYNLYTWAVLAYEWY +HLA-B1310,YYTMYREISTNTYENTAYLRYDSYTWAVLAYEWY +HLA-B1311,YYTMYREISTNTYENTAYLRYNLYTWAVLAYEWY +HLA-B1312,YYTMYREISTNTYENTAYIRYNLYTWAVLAYGWY +HLA-B1313,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY +HLA-B1314,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B1315,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWH +HLA-B1316,YYTMYREISTNTYENTAYWTYNLYTWAELAYEWY +HLA-B1317,YYAMYREISTNTYENTAYIRYNLYTWAVLAYEWY +HLA-B1318,YYTMYREISTNTYENTAYWTYNLYTWAVRAYEWY +HLA-B1319,YYTMYREVSTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B1320,YYTMYREISTNTYENTAYIRYNLYTWAELAYEWY +HLA-B13:01,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY +HLA-B13:02,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B13:03,YYTMYREISTNTYENTAYWTYNLYTWAVLAYLWY +HLA-B13:04,YYTMYREISTNTYENTAYWTYDSYTWAVLAYLWY +HLA-B13:06,YYTMYREISTNTYENTAYIRYNLYTWAVLAYTWY +HLA-B13:09,YYTMYREISTNTYESNLYWTYNLYTWAVLAYEWY +HLA-B13:10,YYTMYREISTNTYENTAYLRYDSYTWAVLAYEWY +HLA-B13:11,YYTMYREISTNTYENTAYLRYNLYTWAVLAYEWY +HLA-B13:12,YYTMYREISTNTYENTAYIRYNLYTWAVLAYGWY +HLA-B13:13,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY +HLA-B13:14,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B13:15,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWH +HLA-B13:16,YYTMYREISTNTYENTAYWTYNLYTWAELAYEWY +HLA-B13:17,YYAMYREISTNTYENTAYIRYNLYTWAVLAYEWY +HLA-B13:18,YYTMYREISTNTYENTAYWTYNLYTWAVRAYEWY +HLA-B13:19,YYTMYREVSTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B13:20,YYTMYREISTNTYENTAYIRYNLYTWAELAYEWY +HLA-B13:21,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY +HLA-B13:22,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY +HLA-B13:23,YHTMYREISTNTYENTAYIRYNLYTWAVLAYEWY +HLA-B13:25,YYTMYREISTNTYESTAYIRYNLYTWAVLAYEWY +HLA-B13:26,YYTMYREISTNTYENTAYIRYDSYTWAVLAYEWY +HLA-B13:27,YYTMYREISTNTYENTAYWTFNLYTWAVLAYEWY +HLA-B13:28,YYTMYREISTNTYENTACIRYNLYTWAVLAYEWY +HLA-B13:29,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY +HLA-B13:30,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B13:31,YYTMYREISTNTYENTAYWTYNLYTWAEWAYEWY +HLA-B13:32,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B13:33,YYAMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B13:34,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B13:35,YYTMYREISTNTYENTAYWTYDYYTWAVLAYEWY +HLA-B13:36,YYTMYRNISTNTYENTAYIRYNLYTWAVLAYEWY +HLA-B13:37,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B13:38,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY +HLA-B13:39,YYTMYREISTNTYENNLYIRYNLYTWAVLAYEWY +HLA-B1401,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B1402,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B1403,YYSEYRNICTNTDESNLYLWYNFYTWAERAYTWH +HLA-B1404,HYSEYRNNCTNTDESNLYLWYNFYTWAELAYTWH +HLA-B1405,YYSEYRNICTNTDESNLYLSYNFYTWAELAYTWH +HLA-B1406,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH +HLA-B14:01,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B14:02,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B14:03,YYSEYRNICTNTDESNLYLWYNFYTWAERAYTWH +HLA-B14:04,HYSEYRNNCTNTDESNLYLWYNFYTWAELAYTWH +HLA-B14:05,YYSEYRNICTNTDESNLYLSYNFYTWAELAYTWH +HLA-B14:06,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH +HLA-B14:08,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH +HLA-B14:09,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B14:10,YYSEYRNICTNTDESNLYIRYNFYTWAELAYTWH +HLA-B14:11,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B14:12,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B14:13,YYSEYRNICTNTDESNLYLSYNYYTWAELAYTWH +HLA-B14:14,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH +HLA-B14:15,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B14:16,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B14:17,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH +HLA-B14:18,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH +HLA-B1501,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1502,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B1503,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B1504,YYAMYREISTNTYESNLYWTYDSYTWAEWAYLWY +HLA-B1505,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B1506,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY +HLA-B1507,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY +HLA-B1508,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1509,YYSEYRNICTNTYESNLYLRYNYYTWAELAYLWY +HLA-B1510,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY +HLA-B1511,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1512,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY +HLA-B1513,YYAMYRNISTNTYENIAYIRYDSYTWAELAYLWY +HLA-B1514,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLSY +HLA-B1515,YYAMYRNISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1516,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY +HLA-B1517,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY +HLA-B1518,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B1519,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY +HLA-B1520,YYAMYREISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B1521,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY +HLA-B1523,YYSEYRNICTNTYENIAYLRYDSYTWAELAYLWY +HLA-B1524,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY +HLA-B1525,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B1527,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY +HLA-B1528,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1529,YYSEYRNIFTNTYESNLYLRYDSYTWAELAYLWY +HLA-B1530,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY +HLA-B1531,YYAMYRNISTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B1532,YYAMYREISTNTYESNLYLRSDSYTWAEWAYLWY +HLA-B1533,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1534,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1535,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY +HLA-B1536,YYAMYREISTNTYENTAYIRYDSYTWAELAYLWY +HLA-B1537,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWH +HLA-B1538,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWH +HLA-B1539,YYAMYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B1540,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY +HLA-B1542,YYAMYREISTNTYESNLYWTYNLYTWAELAYTWY +HLA-B1543,YYAMYREISTNTYEDTLYLRYDSYTWAEWAYLWY +HLA-B1544,YYAMYRNICTNTYESNLYIRYDSYTWAELAYTWY +HLA-B1545,YYAMYREISTNTYESNLYLSYDYYTWAEWAYLWY +HLA-B1546,YYAKYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1547,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY +HLA-B1548,YYAMYREISTNTYESNLYLRYNYYTWAVLTYLWY +HLA-B1549,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY +HLA-B1550,YYAMYREISTNTYESNLYLRYDSYTWAEWAYTWY +HLA-B1551,YYSEYRNICTNTYESNLYLRYDSYTWAVDAYLWY +HLA-B1552,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY +HLA-B1553,YYTKYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1554,YYSEYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1555,YYAMYRNISTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B1556,YYAMYREIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1557,YYAMYREISTNTYVNNLYLRYDSYTWAEWAYLWY +HLA-B1558,YYAMYREISTNTYESNLYLRYNFYTWAEWAYLWY +HLA-B1560,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1561,YYSEYREISTNTDESNLYLRYDSYTWAELAYLWY +HLA-B1562,YYSEYREISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B1563,YYAMYREISTNTYESNLYLRYDYYTWAEWAYLWY +HLA-B1564,YYSEYRNISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B1565,YYAMYREISTNTYESNLYLRYDSYTWAERAYLWY +HLA-B1566,YYAMYREICTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1567,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY +HLA-B1568,YYSEYREISTNTYESNLYLSYDSYTWAEWAYLWY +HLA-B1569,YYSEYREISTNTYESNLYLRYDSYTWAELTYTWY +HLA-B1570,YYAMYREISTNTDESNLYLRYDSYTWAEWAYLWY +HLA-B1571,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1572,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B1573,YYAMYREISTNTYESNLYLRYNLYTWAEWAYLWY +HLA-B1574,YYSEYREISINTYESNLYLRYDSYTWAELAYLWY +HLA-B1575,YYAMYREISTNTYESNLYLRYDSYTWAQWAYLWY +HLA-B1576,YYAMYRNIYAQTDESNLYLRYDSYTWAEWAYLWY +HLA-B1577,YYAMYREISTNTYESNLYIRYDDYTWAEWAYLWY +HLA-B1578,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1580,YYSEYRNICTNTYESNLYIRYDSYTWAELAYLWY +HLA-B1581,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1582,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1583,YYAMYREISTNTYESNLYWTYNYYTWAVDAYTWY +HLA-B1584,YYAMYREISTNTYESNLYLRFDSYTWAVRAYLWY +HLA-B1585,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY +HLA-B1586,YYAMYREISTNTYESNLYLRYNLYTWAVLAYTWY +HLA-B1587,YYAMYREISTNTYESIAYLRYDSYTWAEWAYLWY +HLA-B1588,YYAMYRNISTNTYESNLYIRYDSYTWATLAYLWY +HLA-B1589,YYAMYRNISTNTYENTAYIRYDSYTWAELAYLWY +HLA-B1590,YYSEYRNICTNTYESNLYLRYDYYTWAELVYLWY +HLA-B1591,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLSY +HLA-B1592,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1593,YYSEYRNICTNTYESNLYLRYDSYTWAELAYTWY +HLA-B1595,YYAMYQENMASTYENIAYWRYDSYTWAELAYLWY +HLA-B1596,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1597,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B1598,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B1599,YYSEYRNICTNTYESNLYLRYDYYTWAERAYLWY +HLA-B15:01,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:02,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B15:03,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:04,YYAMYREISTNTYESNLYWTYDSYTWAEWAYLWY +HLA-B15:05,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B15:06,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY +HLA-B15:07,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY +HLA-B15:08,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:09,YYSEYRNICTNTYESNLYLRYNYYTWAELAYLWY +HLA-B15:10,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY +HLA-B15:101,YYAMYREIYAQTDESNLYLRYDSYTWAEWAYLWY +HLA-B15:102,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:103,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:104,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:105,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:106,YYAKYREISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B15:107,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B15:108,YYSEYRNICTNTYESNLYLRYDSYTWAELTYLWY +HLA-B15:109,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY +HLA-B15:11,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:110,YYAMYREISTNTYESNLYLRCDSYTWAEWAYLWY +HLA-B15:112,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B15:113,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:114,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY +HLA-B15:115,YYSEYRNICTNTYESTAYLRYDSYTWAELAYLWY +HLA-B15:116,YYAMYREISTNTYESNLYLRYDSYSLAEWAYLWY +HLA-B15:117,YYAMYREISTNTYESNLYLRYDSYTWAEWAYEWY +HLA-B15:118,YYAMYREISTNTYESNLYLMYDSYTWAEWAYLWY +HLA-B15:119,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:12,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY +HLA-B15:120,YYAMYRDISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:121,YYAMYRNISTNTYESNLYIRYDSYTWAELAYTWY +HLA-B15:122,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:123,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B15:124,YYSEYRNICTNTYESNLYLRYDSYSLAVLAYEWY +HLA-B15:125,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:126,YYAMYREISTNTYESNLYLSYDSCTWAEWAYLWY +HLA-B15:127,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:128,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:129,YYAMYREISTNTYESNLYLNYDSYTWAEWAYLWY +HLA-B15:13,YYAMYRNISTNTYENIAYIRYDSYTWAELAYLWY +HLA-B15:131,YYSEYREISTNTYESNLYLRYDSYTWAELAYLSY +HLA-B15:132,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:133,YYSEYRNICTNTYESNLYLRYDFYTWAELAYLWY +HLA-B15:134,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:135,YYAMYREISTNTYENNLYLRYDSYTWAEWAYLWY +HLA-B15:136,YYAMYREISTNTYESNLYLRYDSYTWAVLTYLWY +HLA-B15:137,YYAMYREISTNTYESNLYWTYNFYTWAEWAYLWY +HLA-B15:138,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY +HLA-B15:139,YYAMYRNISANTYESNLYIRYDSYTWAELAYLWY +HLA-B15:14,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLSY +HLA-B15:140,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:141,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY +HLA-B15:142,YDAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:143,YYAKYRNIYTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:144,YYAMYRNISTNTYESNLYIRYDSYTWAEWAYLWY +HLA-B15:145,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:146,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:147,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:148,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:15,YYAMYRNISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:150,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY +HLA-B15:151,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B15:152,YYAMYREIYTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:153,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:154,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY +HLA-B15:155,YYAMYREISTNTYESNLYWTYDSYTWAVLAYLWY +HLA-B15:156,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:157,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY +HLA-B15:158,YYSEYREISTNTYESNLFLRYDSYTWAELAYLWY +HLA-B15:159,YYAMYREISTNTYESNLHLRYDSYTWAEWAYLWY +HLA-B15:16,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY +HLA-B15:160,YYAMHREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:161,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLSY +HLA-B15:162,YYAMYRENMASTYENIAYLRYHDYTWAALAYLWY +HLA-B15:163,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:164,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:165,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY +HLA-B15:166,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:167,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:168,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY +HLA-B15:169,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:17,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY +HLA-B15:170,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B15:171,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:172,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:173,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:174,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:175,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:176,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:177,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY +HLA-B15:178,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:179,YYAMYREISTNTYESNLYLRYDSYTWAVDAYLWY +HLA-B15:18,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:180,YDSEYRNIFTNTDESNLYLRYDSYTWAEWAYLWY +HLA-B15:183,YYTMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:184,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:185,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWH +HLA-B15:186,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY +HLA-B15:187,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:188,YYAMYREISTNTYESNLYLRYNYYTWAVLAYTWY +HLA-B15:189,YYAMYRNICTNTDESNLYLRYDSYTWAEWAYLWY +HLA-B15:19,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY +HLA-B15:191,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:192,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:193,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:194,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B15:195,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY +HLA-B15:196,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY +HLA-B15:197,YYSEYRNICTNTYESNLYLSYDSYTWAELAYLWY +HLA-B15:198,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:199,YYAMYREISTNTYESNLYLRYDSYTWAEDAYTWY +HLA-B15:20,YYAMYREISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B15:200,YYSEYRNICTNTYESNLYLRYDSYTWATLAYLWY +HLA-B15:201,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:202,YYATYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:21,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY +HLA-B15:23,YYSEYRNICTNTYENIAYLRYDSYTWAELAYLWY +HLA-B15:24,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY +HLA-B15:25,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B15:27,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY +HLA-B15:28,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:29,YYSEYRNIFTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:30,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY +HLA-B15:31,YYAMYRNISTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B15:32,YYAMYREISTNTYESNLYLRSDSYTWAEWAYLWY +HLA-B15:33,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:34,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:35,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY +HLA-B15:36,YYAMYREISTNTYENTAYIRYDSYTWAELAYLWY +HLA-B15:37,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWH +HLA-B15:38,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWH +HLA-B15:39,YYAMYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:40,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY +HLA-B15:42,YYAMYREISTNTYESNLYWTYNLYTWAELAYTWY +HLA-B15:43,YYAMYREISTNTYEDTLYLRYDSYTWAEWAYLWY +HLA-B15:44,YYAMYRNICTNTYESNLYIRYDSYTWAELAYTWY +HLA-B15:45,YYAMYREISTNTYESNLYLSYDYYTWAEWAYLWY +HLA-B15:46,YYAKYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:47,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY +HLA-B15:48,YYAMYREISTNTYESNLYLRYNYYTWAVLTYLWY +HLA-B15:49,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY +HLA-B15:50,YYAMYREISTNTYESNLYLRYDSYTWAEWAYTWY +HLA-B15:51,YYSEYRNICTNTYESNLYLRYDSYTWAVDAYLWY +HLA-B15:52,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY +HLA-B15:53,YYTKYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:54,YYSEYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:55,YYAMYRNISTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B15:56,YYAMYREIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:57,YYAMYREISTNTYVNNLYLRYDSYTWAEWAYLWY +HLA-B15:58,YYAMYREISTNTYESNLYLRYNFYTWAEWAYLWY +HLA-B15:60,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:61,YYSEYREISTNTDESNLYLRYDSYTWAELAYLWY +HLA-B15:62,YYSEYREISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B15:63,YYAMYREISTNTYESNLYLRYDYYTWAEWAYLWY +HLA-B15:64,YYSEYRNISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:65,YYAMYREISTNTYESNLYLRYDSYTWAERAYLWY +HLA-B15:66,YYAMYREICTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:67,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY +HLA-B15:68,YYSEYREISTNTYESNLYLSYDSYTWAEWAYLWY +HLA-B15:69,YYSEYREISTNTYESNLYLRYDSYTWAELTYTWY +HLA-B15:70,YYAMYREISTNTDESNLYLRYDSYTWAEWAYLWY +HLA-B15:71,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:72,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:73,YYAMYREISTNTYESNLYLRYNLYTWAEWAYLWY +HLA-B15:74,YYSEYREISINTYESNLYLRYDSYTWAELAYLWY +HLA-B15:75,YYAMYREISTNTYESNLYLRYDSYTWAQWAYLWY +HLA-B15:76,YYAMYRNIYAQTDESNLYLRYDSYTWAEWAYLWY +HLA-B15:77,YYAMYREISTNTYESNLYIRYDDYTWAEWAYLWY +HLA-B15:78,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:80,YYSEYRNICTNTYESNLYIRYDSYTWAELAYLWY +HLA-B15:81,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:82,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:83,YYAMYREISTNTYESNLYWTYNYYTWAVDAYTWY +HLA-B15:84,YYAMYREISTNTYESNLYLRFDSYTWAVRAYLWY +HLA-B15:85,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY +HLA-B15:86,YYAMYREISTNTYESNLYLRYNLYTWAVLAYTWY +HLA-B15:87,YYAMYREISTNTYESIAYLRYDSYTWAEWAYLWY +HLA-B15:88,YYAMYRNISTNTYESNLYIRYDSYTWATLAYLWY +HLA-B15:89,YYAMYRNISTNTYENTAYIRYDSYTWAELAYLWY +HLA-B15:90,YYSEYRNICTNTYESNLYLRYDYYTWAELVYLWY +HLA-B15:91,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLSY +HLA-B15:92,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:93,YYSEYRNICTNTYESNLYLRYDSYTWAELAYTWY +HLA-B15:95,YYAMYQENMASTYENIAYWRYDSYTWAELAYLWY +HLA-B15:96,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:97,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B15:98,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B15:99,YYSEYRNICTNTYESNLYLRYDYYTWAERAYLWY +HLA-B1801,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B1802,YHSTYRNISTNTYESNLYLNYDSYTWAVLAYTWH +HLA-B1803,YHSTYRNISTNTDESNLYLRYDSYTWAVLAYTWH +HLA-B1804,YYATYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B1805,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B1806,YHSTYRNISTNTYVSNLYLRYDSYTWAVLAYTWH +HLA-B1807,YHSTYRNIFTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B1808,YHSTYRNISTNTYESNLYLRCDSYTWAVLAYTWH +HLA-B1809,YHSTYRNISTNTYENTAYLRYDSYTWAVLAYTWH +HLA-B1810,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY +HLA-B1811,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWY +HLA-B1812,YHSTYREISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B1813,YHSTYRNISTNTYESNLYLRYDSYTWAVRAYTWH +HLA-B1814,YHSTYRNISTNTYESNLYLSYDSYTWAVLAYTWH +HLA-B1815,YHSTYRNISTNTYESNLYLRYDSYTWAELAYTWH +HLA-B1818,YHSTYRNISTNTYESNLYLRSDSYTWAVLAYTWH +HLA-B1819,YHSTYRNISTNTYESNLYLRYDSYTWAEWAYTWH +HLA-B1820,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B1821,YHSTYRNISTNTYESNLYLRYDSYTWAERAYEWY +HLA-B1822,YHSTYRNISTNTYESNLYISYDSYTWAVLAYTWH +HLA-B1823,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B1824,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B1825,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B1826,YHSTYRNISTNTYESNLYLRYNYYTWAVLAYTWH +HLA-B18:01,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:02,YHSTYRNISTNTYESNLYLNYDSYTWAVLAYTWH +HLA-B18:03,YHSTYRNISTNTDESNLYLRYDSYTWAVLAYTWH +HLA-B18:04,YYATYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:05,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:06,YHSTYRNISTNTYVSNLYLRYDSYTWAVLAYTWH +HLA-B18:07,YHSTYRNIFTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:08,YHSTYRNISTNTYESNLYLRCDSYTWAVLAYTWH +HLA-B18:09,YHSTYRNISTNTYENTAYLRYDSYTWAVLAYTWH +HLA-B18:10,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY +HLA-B18:11,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWY +HLA-B18:12,YHSTYREISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:13,YHSTYRNISTNTYESNLYLRYDSYTWAVRAYTWH +HLA-B18:14,YHSTYRNISTNTYESNLYLSYDSYTWAVLAYTWH +HLA-B18:15,YHSTYRNISTNTYESNLYLRYDSYTWAELAYTWH +HLA-B18:18,YHSTYRNISTNTYESNLYLRSDSYTWAVLAYTWH +HLA-B18:19,YHSTYRNISTNTYESNLYLRYDSYTWAEWAYTWH +HLA-B18:20,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:21,YHSTYRNISTNTYESNLYLRYDSYTWAERAYEWY +HLA-B18:22,YHSTYRNISTNTYESNLYISYDSYTWAVLAYTWH +HLA-B18:24,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:25,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:26,YHSTYRNISTNTYESNLYLRYNYYTWAVLAYTWH +HLA-B18:27,YHSTYRNISTNTYESNLYLMFDSYTWAVLAYTWH +HLA-B18:28,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:29,YHATYRNIFTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:30,YHSTYRNISTNTYESNLYLRYDSYTWAERAYTWH +HLA-B18:31,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:32,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:33,YHSTYRNICTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:34,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:35,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY +HLA-B18:36,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYLWH +HLA-B18:37,YHSEYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:38,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:39,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:40,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:41,YHSTYRNISTNTYESNLYLRYESYTWAVLAYTWH +HLA-B18:42,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:43,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:44,YHSTYRNISTNTYESNLYLWYDSYTWAVLAYTWH +HLA-B18:45,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:46,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:47,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:48,YHSKYRNISTNTYESNLYLRYDSYTWAVLAYTWH +HLA-B18:49,YHSTYRNISTNTYENNLYLRYDSYTWAVLAYTWH +HLA-B18:50,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWH +HLA-B2701,YHTEYREICAKTYENTAYLNYHDYTWAVLAYEWY +HLA-B2702,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY +HLA-B2703,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B2704,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY +HLA-B2705,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B2706,YHTEYREICAKTDESTLYLNYDYYTWAELAYEWY +HLA-B2707,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY +HLA-B2708,YHTEYREICAKTDESNLYLNYHDYTWAVLAYEWY +HLA-B2709,YHTEYREICAKTDEDTLYLNYHHYTWAVLAYEWY +HLA-B2710,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY +HLA-B2711,YHTEYREICAKTDESTLYLSYNYYTWAVLAYEWY +HLA-B2712,YHTEYREICTNTDESNLYLNYHDYTWAVLAYEWY +HLA-B2713,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B2714,YHTEYREICAKTDEDTLYWTYHDYTWAVLAYEWY +HLA-B2715,YHTEYREICAKTDESTLYLNYHDYTWAELAYTWY +HLA-B2716,YHTEYREICTNTDEDTLYLNYHDYTWAVLAYEWY +HLA-B2717,YHTEFREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B2718,YHTEYREISTNTYESNLYLNYHDYTWAELAYEWY +HLA-B2719,YHTEYREICAKTDEDTLYIRYHDYTWAVLAYEWY +HLA-B2720,YHTEYREICAKTDESTLYLNYNYYTWAELAYEWY +HLA-B2721,YHTEYREICAKTDESTLYLRYDYYTWAELAYEWY +HLA-B2723,YHTEYRNIFTNTYESTLYLNYHDYTWAVLAYEWY +HLA-B2724,YHTEYREICAKTDESTLYLSYNYYSWAELAYEWY +HLA-B2725,YHTEYREICAKTDESTLYLNYHDYTWAEWAYLWY +HLA-B2726,YHTEYREICAQTDESNLYLNYHDYTWAVLAYEWY +HLA-B2727,YHTEYREICAKTDEDTLYLNYNYYTWAVLAYEWY +HLA-B2728,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYTWH +HLA-B2729,YHTEYREISTNTYEDTLYLNYHDYTWAVLAYEWY +HLA-B2730,YHTEYREICAKTDENIAYIRYHDYTWAVLAYEWY +HLA-B2731,YHTEYREICAQTDESTLYLNYHDYTWAVLAYEWY +HLA-B2732,YHTEYREICAKTDEDTLYLSYHDYTWAVLAYEWY +HLA-B2733,YHTEYREICAKTDESNLYLSYNYYTWAVLAYEWY +HLA-B2734,YHTEYREICAKTDEDTLYLSYDYYTWAVLAYEWY +HLA-B2735,YHTEYREICAKTDEDTLYLNYNFYTWAVLAYEWY +HLA-B2736,YHTEYREICAKTDESTLYLNYHDYSLAVLAYEWY +HLA-B2737,YYTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B2738,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYLWY +HLA-B27:01,YHTEYREICAKTYENTAYLNYHDYTWAVLAYEWY +HLA-B27:02,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY +HLA-B27:03,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:04,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY +HLA-B27:05,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:06,YHTEYREICAKTDESTLYLNYDYYTWAELAYEWY +HLA-B27:07,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY +HLA-B27:08,YHTEYREICAKTDESNLYLNYHDYTWAVLAYEWY +HLA-B27:09,YHTEYREICAKTDEDTLYLNYHHYTWAVLAYEWY +HLA-B27:10,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY +HLA-B27:11,YHTEYREICAKTDESTLYLSYNYYTWAVLAYEWY +HLA-B27:12,YHTEYREICTNTDESNLYLNYHDYTWAVLAYEWY +HLA-B27:13,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:14,YHTEYREICAKTDEDTLYWTYHDYTWAVLAYEWY +HLA-B27:15,YHTEYREICAKTDESTLYLNYHDYTWAELAYTWY +HLA-B27:16,YHTEYREICTNTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:17,YHTEFREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:18,YHTEYREISTNTYESNLYLNYHDYTWAELAYEWY +HLA-B27:19,YHTEYREICAKTDEDTLYIRYHDYTWAVLAYEWY +HLA-B27:20,YHTEYREICAKTDESTLYLNYNYYTWAELAYEWY +HLA-B27:21,YHTEYREICAKTDESTLYLRYDYYTWAELAYEWY +HLA-B27:23,YHTEYRNIFTNTYESTLYLNYHDYTWAVLAYEWY +HLA-B27:24,YHTEYREICAKTDESTLYLSYNYYSWAELAYEWY +HLA-B27:25,YHTEYREICAKTDESTLYLNYHDYTWAEWAYLWY +HLA-B27:26,YHTEYREICAQTDESNLYLNYHDYTWAVLAYEWY +HLA-B27:27,YHTEYREICAKTDEDTLYLNYNYYTWAVLAYEWY +HLA-B27:28,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYTWH +HLA-B27:29,YHTEYREISTNTYEDTLYLNYHDYTWAVLAYEWY +HLA-B27:30,YHTEYREICAKTDENIAYIRYHDYTWAVLAYEWY +HLA-B27:31,YHTEYREICAQTDESTLYLNYHDYTWAVLAYEWY +HLA-B27:32,YHTEYREICAKTDEDTLYLSYHDYTWAVLAYEWY +HLA-B27:33,YHTEYREICAKTDESNLYLSYNYYTWAVLAYEWY +HLA-B27:34,YHTEYREICAKTDEDTLYLSYDYYTWAVLAYEWY +HLA-B27:35,YHTEYREICAKTDEDTLYLNYNFYTWAVLAYEWY +HLA-B27:36,YHTEYREICAKTDESTLYLNYHDYSLAVLAYEWY +HLA-B27:37,YYTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:38,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYLWY +HLA-B27:39,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:40,YHTEYREICAKTDESNLYLNYHDYTWAELAYEWY +HLA-B27:41,YHTEYREICAKTDEDTLYLNYDSYTWAVLAYEWY +HLA-B27:42,YHTEYREICAKTDEDNLYLNYHDYTWAVLAYEWY +HLA-B27:43,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY +HLA-B27:44,YHTEYREICAKTYESNLYLNYHDYTWAVLAYEWY +HLA-B27:45,YHTEYREICAKTDEDTLYLNYHDYTWAVRAYEWY +HLA-B27:46,YHTEYREICAKTDEDTLYLNYHYYTWAVLAYEWY +HLA-B27:47,YHTEYREICAKTDEDTLYLNYHDYTWAVDAYLSY +HLA-B27:48,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:49,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:50,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYESY +HLA-B27:51,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:52,YHTTYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:53,YHTEYREICAKTDEDIAYLNYHDYTWAVLAYEWY +HLA-B27:54,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY +HLA-B27:55,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:56,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:57,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY +HLA-B27:58,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:60,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:61,YHTEYREICAKTDESTLYLNYHDYTWAVLAYEWY +HLA-B27:62,YHTEYREICAKTDENIAYLNYHDYTWAVLAYTWH +HLA-B27:63,YHTEYREICAKTDESTLYLNYHDYTWAELAYLWY +HLA-B27:67,YHTMYREICAKTDEDTLYLNYHDYTWAVLAYEWY +HLA-B27:68,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY +HLA-B27:69,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY +HLA-B3501,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3502,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B3503,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B3504,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B3505,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B3506,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY +HLA-B3507,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3508,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY +HLA-B3509,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B3510,YYATYREIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3511,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWY +HLA-B3512,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B3513,YYATYREIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B3514,YYATYRNIFTNTYESNLYIRYDSYTWAEWAYLWY +HLA-B3515,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYEWY +HLA-B3516,YYATYREIFTNTYESNLYISYDSYTWAVLAYLWY +HLA-B3517,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY +HLA-B3518,YYATYRNIFTNTYESNLYIRYNYYTWAVRAYLWY +HLA-B3519,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3520,YYATYRNISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3521,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWH +HLA-B3522,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYLWY +HLA-B3523,YYATYRNIFTNTYESNLYIRFDSYTWAVLAYLWY +HLA-B3524,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWH +HLA-B3525,YYSEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3526,YYAEYRNICTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3527,YYATYRNIFTNTYENNLYIRYDSYTWAVLAYLWY +HLA-B3528,YYATYREISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3529,YYATYRNIFTNTDESNLYIRYDSYTWAVLAYLWY +HLA-B3530,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY +HLA-B3531,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B3532,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B3533,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYEWY +HLA-B3534,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY +HLA-B3535,YYATYRNIFTNTYESNLYIRYDSYTWAVLTYTWY +HLA-B3536,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B3537,YYATYRNIFTNTYESNLYWTYDSYTWAVLAYLWY +HLA-B3538,YYATYRNIFTNTYESNLYIRYDFYTWAVDAYLWY +HLA-B3539,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY +HLA-B3540,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3541,YYATYRNIFTNTYESNLYIRYDSCTWAVLAYLWY +HLA-B3542,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3543,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B3544,YYATYRNIFTNTYESNLYLRYNYYTWAEWAYLWY +HLA-B3545,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLSY +HLA-B3546,YYAMYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3547,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3548,YYATYRNIFTNTYESNLYIRSDSYTWAVLAYLWY +HLA-B3549,YYAEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3550,YHATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3551,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B3552,YYATYRNIFTNTYECNLYIRYDSYTWAVLAYLWY +HLA-B3554,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3555,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B3556,YYATYRNIFTNTYENNLYIRYDFYTWAVLAYLWY +HLA-B3557,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3558,YYATYRNIFTNTYESNLYLSYDSYTWAELAYLWY +HLA-B3559,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY +HLA-B3560,YYATYRNIFTNTYESNLYWTYNLYTWAVLAYTWY +HLA-B3561,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY +HLA-B3562,YYATYRNIFTNTYESNLYIRYDSYTWAVWAYLWY +HLA-B3563,YHTKYREISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3564,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B3565,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B3566,YYATYRNIFTNTYESNLYLSYDSYTWAVRAYEWY +HLA-B3567,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B3568,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B3569,YYATYREIFTNTDESNLYIRYDSYTWAVLAYLWY +HLA-B3570,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B3571,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLSY +HLA-B3572,YYATYRNISTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B3573,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY +HLA-B3574,YYATYRNIFTNTYVSNLYIRYDFYTWAVLAYLWY +HLA-B3575,YYATYRNIFTNTYESNLYLRYDFYTWAVLAYLWY +HLA-B3576,YYATYRNIYAQTDESNLYIRYDSYTWAVLAYLWY +HLA-B3577,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:01,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:02,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B35:03,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:04,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B35:05,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B35:06,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY +HLA-B35:07,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:08,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY +HLA-B35:09,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B35:10,YYATYREIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:100,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY +HLA-B35:101,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:102,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B35:103,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:104,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:105,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY +HLA-B35:106,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:107,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:108,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:109,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWH +HLA-B35:11,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWY +HLA-B35:110,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:111,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:112,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:113,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY +HLA-B35:114,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B35:115,YYATYRNIFTNTYESNLYIRYDSYTWAVDAYLWY +HLA-B35:116,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:117,YYATYRNIFTNTYESNLYLSYDSYTWAEWAYLWY +HLA-B35:118,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B35:119,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:12,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B35:120,YYATYRNIFTNTYESNLYIRHDSYTWAVLAYLWY +HLA-B35:121,YYATYRNIFTNTYESNLYIRYHSYTWAVLAYLWY +HLA-B35:122,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:123,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:124,YYSTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:125,YYSTYRNIFTNTYESNLYISYDSYTWAVLAYLWY +HLA-B35:126,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:127,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:128,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:13,YYATYREIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:131,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:132,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:133,YYATYRNIFTNTYESNLYIRYVSYTWAVLAYLWY +HLA-B35:135,YYATYRNICTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B35:136,YYATYRNIFTNTDESNLYIRYDFYTWAVLAYLWY +HLA-B35:137,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:138,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:139,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:14,YYATYRNIFTNTYESNLYIRYDSYTWAEWAYLWY +HLA-B35:140,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:141,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:142,YYSTYRNIFTNTYESNLYIRYDSYTWAVRAYLWY +HLA-B35:143,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:144,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:15,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYEWY +HLA-B35:16,YYATYREIFTNTYESNLYISYDSYTWAVLAYLWY +HLA-B35:17,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY +HLA-B35:18,YYATYRNIFTNTYESNLYIRYNYYTWAVRAYLWY +HLA-B35:19,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:20,YYATYRNISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:21,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWH +HLA-B35:22,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYLWY +HLA-B35:23,YYATYRNIFTNTYESNLYIRFDSYTWAVLAYLWY +HLA-B35:24,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWH +HLA-B35:25,YYSEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:26,YYAEYRNICTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:27,YYATYRNIFTNTYENNLYIRYDSYTWAVLAYLWY +HLA-B35:28,YYATYREISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:29,YYATYRNIFTNTDESNLYIRYDSYTWAVLAYLWY +HLA-B35:30,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY +HLA-B35:31,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B35:32,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B35:33,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYEWY +HLA-B35:34,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY +HLA-B35:35,YYATYRNIFTNTYESNLYIRYDSYTWAVLTYTWY +HLA-B35:36,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:37,YYATYRNIFTNTYESNLYWTYDSYTWAVLAYLWY +HLA-B35:38,YYATYRNIFTNTYESNLYIRYDFYTWAVDAYLWY +HLA-B35:39,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY +HLA-B35:41,YYATYRNIFTNTYESNLYIRYDSCTWAVLAYLWY +HLA-B35:42,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:43,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B35:44,YYATYRNIFTNTYESNLYLRYNYYTWAEWAYLWY +HLA-B35:45,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLSY +HLA-B35:46,YYAMYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:47,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:48,YYATYRNIFTNTYESNLYIRSDSYTWAVLAYLWY +HLA-B35:49,YYAEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:50,YHATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:51,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B35:52,YYATYRNIFTNTYECNLYIRYDSYTWAVLAYLWY +HLA-B35:54,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:55,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:56,YYATYRNIFTNTYENNLYIRYDFYTWAVLAYLWY +HLA-B35:57,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:58,YYATYRNIFTNTYESNLYLSYDSYTWAELAYLWY +HLA-B35:59,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY +HLA-B35:60,YYATYRNIFTNTYESNLYWTYNLYTWAVLAYTWY +HLA-B35:61,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY +HLA-B35:62,YYATYRNIFTNTYESNLYIRYDSYTWAVWAYLWY +HLA-B35:63,YHTKYREISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:64,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:66,YYATYRNIFTNTYESNLYLSYDSYTWAVRAYEWY +HLA-B35:67,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B35:68,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B35:69,YYATYREIFTNTDESNLYIRYDSYTWAVLAYLWY +HLA-B35:70,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:71,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLSY +HLA-B35:72,YYATYRNISTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B35:74,YYATYRNIFTNTYVSNLYIRYDFYTWAVLAYLWY +HLA-B35:75,YYATYRNIFTNTYESNLYLRYDFYTWAVLAYLWY +HLA-B35:76,YYATYRNIYAQTDESNLYIRYDSYTWAVLAYLWY +HLA-B35:77,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:78,YYATYRNIFANTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:79,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B35:80,YYATYREIFTNTYESNLYIRYDSYTWAVRAYLWY +HLA-B35:81,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWH +HLA-B35:82,YYATYRNICTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:83,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B35:84,YHTTYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:85,YYATYRNICTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:86,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYEWY +HLA-B35:87,YYATYRNIFTNTYESNLYLSYNYYTWAVDAYTWY +HLA-B35:88,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYEWY +HLA-B35:89,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B35:90,YYTTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:91,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:92,YYATYRNIFTNAYESNLYIRYDSYTWAVLAYLWY +HLA-B35:93,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYTWY +HLA-B35:94,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B35:95,YYATYRNISTNTYESNLYIRYNYYTWAVLAYLWY +HLA-B35:96,YYATYRNIFTNTYESNLYIRYDFYTWAELAYTWH +HLA-B35:97,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY +HLA-B35:98,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY +HLA-B35:99,YYATYRNIFTNTYESNLYLRYDSYTWAERAYLWY +HLA-B3701,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B3702,YHSTYREISTNTYEDTLYLNYHDYTWAVLAYEWY +HLA-B3704,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWH +HLA-B3705,YHSTYREISTNTYEDNLYIRSNFYTWAVDAYTWY +HLA-B3706,YHSKYREISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B3707,YHSTYREISTNTYEDTLYLSYDYYTWAERAYEWY +HLA-B3708,YHSTYRNISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B3709,YHSTYREISTNTYEDTLYLSYDYYTWAVDAYTWY +HLA-B3710,YHSTYREISTNTYENTAYIRSNFYTWAVDAYTWY +HLA-B3711,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY +HLA-B3712,YHSTYREISTNTYEDTLYIRYNYYTWAVDAYTWY +HLA-B3713,YHSTYREISTNTYEDTLYIRSNFYTWAEDAYTWY +HLA-B37:01,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B37:02,YHSTYREISTNTYEDTLYLNYHDYTWAVLAYEWY +HLA-B37:04,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWH +HLA-B37:05,YHSTYREISTNTYEDNLYIRSNFYTWAVDAYTWY +HLA-B37:06,YHSKYREISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B37:07,YHSTYREISTNTYEDTLYLSYDYYTWAERAYEWY +HLA-B37:08,YHSTYRNISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B37:09,YHSTYREISTNTYEDTLYLSYDYYTWAVDAYTWY +HLA-B37:10,YHSTYREISTNTYENTAYIRSNFYTWAVDAYTWY +HLA-B37:11,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY +HLA-B37:12,YHSTYREISTNTYEDTLYIRYNYYTWAVDAYTWY +HLA-B37:13,YHSTYREISTNTYEDTLYIRSNFYTWAEDAYTWY +HLA-B37:14,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY +HLA-B37:15,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B37:17,YHSTYREISTNTYEDTLYIRSNFYTWTVDAYTWY +HLA-B37:18,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B37:19,YHSTYREISTNTYEDTLYIRYNFYTWAVDAYTWY +HLA-B37:20,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B37:21,YHSTYREIFTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B37:22,YHATYREISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B37:23,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY +HLA-B3801,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B3802,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY +HLA-B3803,YYSEYREISTNTDESTAYLRYNFYTWAVLTYTWY +HLA-B3804,YYSEYREICTNTYENTAYLRYNFYTWAVLTYTWY +HLA-B3805,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B3806,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B3807,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B3808,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYMWY +HLA-B3809,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B3810,YYSEYRNICTNTYENIAYLRYNFYTWAELAYTWY +HLA-B3811,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B3812,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B3813,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B3814,YYSEYRNICTNTDENIAYLRYNFYTWAVLTYTWY +HLA-B3815,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY +HLA-B3816,YYTEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:01,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:02,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY +HLA-B38:03,YYSEYREISTNTDESTAYLRYNFYTWAVLTYTWY +HLA-B38:04,YYSEYREICTNTYENTAYLRYNFYTWAVLTYTWY +HLA-B38:05,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:06,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:07,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:08,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYMWY +HLA-B38:09,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:10,YYSEYRNICTNTYENIAYLRYNFYTWAELAYTWY +HLA-B38:11,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:12,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:13,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:14,YYSEYRNICTNTDENIAYLRYNFYTWAVLTYTWY +HLA-B38:15,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY +HLA-B38:16,YYTEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:17,YYSEYRNICTNTYEDTLYLRYNFYTWAVLTYTWY +HLA-B38:18,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY +HLA-B38:19,YYSEYRNICTNTYENIAYLSYNFYTWAVLTYTWY +HLA-B38:20,YYSEYRNICTNTYENIAYIRYNFYTWAVLTYTWY +HLA-B38:21,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY +HLA-B38:22,YYSEYRNICTNTYENIAYLNYNFYTWAVLTYKWY +HLA-B38:23,YYSEYRNICTNTYENTAYFRYNFYTWAVLTYTWY +HLA-B3901,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3902,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3903,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY +HLA-B3904,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3905,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY +HLA-B3906,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY +HLA-B3908,YYSEYREISTNTYESNLYLRYNFYTWAVRTYTWY +HLA-B3909,YYSEYRNICTNTDESNLYLRSNFYTWAVLTYTWY +HLA-B3910,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3912,YDSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3913,YYSEYREISTNTYESNLYLRYNFYTWAVLTYTWY +HLA-B3914,YYSEYRNICTNTDESNLYLSYNYYTWAVLTYTWY +HLA-B3915,YYSEYRNICTNTDESNLYLRYDFYTWAVLTYTWY +HLA-B3916,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3917,YYSEYRNIYTNTDESNLYLRYNLYTWAVLTYTWY +HLA-B3918,YYSEYRNICTNTDESNLYLRYNFYTWAEWTYTWY +HLA-B3919,YYSTYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3920,YYSEYRNIYTNTYENNLYLRYNFYTWAVLTYTWY +HLA-B3922,YYSEYREICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3923,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3924,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY +HLA-B3926,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3927,YYSEYRNICTNTDVSNLYLRYNFYTWAVLTYTWY +HLA-B3928,YYSEYRNICTNTDESNLYLTYNFYTWAVLTYTWY +HLA-B3929,YYSEYRNICTNTDESNLYLSYDYYTWAVLTYTWY +HLA-B3930,YYSEYRNICTNTDESNLYLRYNFYTWAVLAYTWY +HLA-B3931,YHSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3932,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYLWH +HLA-B3933,YYSEYRNICTNTDESNLYWTYNFYTWAVRAYLWY +HLA-B3934,YYSEYRNICTNTDESNLYWTYNFYTWAVLAYTWY +HLA-B3935,YYSEYRNICTNTDESNLYLRYNFYTWAELTYTWY +HLA-B3936,YYSEYRNICTNTDESNLYLRYNFYTWAEWAYTWY +HLA-B3937,YYSEYRNICTNTYESNLYLSYNFYTWAVLTYTWY +HLA-B3938,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3939,YYSEYRNISTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3941,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B3942,YYSEYRNICTNTDESNLYIRYNFYTWAVLTYTWY +HLA-B39:01,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:02,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:03,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY +HLA-B39:04,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:05,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY +HLA-B39:06,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY +HLA-B39:07,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY +HLA-B39:08,YYSEYREISTNTYESNLYLRYNFYTWAVRTYTWY +HLA-B39:09,YYSEYRNICTNTDESNLYLRSNFYTWAVLTYTWY +HLA-B39:10,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:11,YYSEYRNICTNTYESNLYLRYNFYTWAVRTYTWY +HLA-B39:12,YDSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:13,YYSEYREISTNTYESNLYLRYNFYTWAVLTYTWY +HLA-B39:14,YYSEYRNICTNTDESNLYLSYNYYTWAVLTYTWY +HLA-B39:15,YYSEYRNICTNTDESNLYLRYDFYTWAVLTYTWY +HLA-B39:16,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:17,YYSEYRNIYTNTDESNLYLRYNLYTWAVLTYTWY +HLA-B39:18,YYSEYRNICTNTDESNLYLRYNFYTWAEWTYTWY +HLA-B39:19,YYSTYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:20,YYSEYRNIYTNTYENNLYLRYNFYTWAVLTYTWY +HLA-B39:22,YYSEYREICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:23,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:24,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY +HLA-B39:26,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:27,YYSEYRNICTNTDVSNLYLRYNFYTWAVLTYTWY +HLA-B39:28,YYSEYRNICTNTDESNLYLTYNFYTWAVLTYTWY +HLA-B39:29,YYSEYRNICTNTDESNLYLSYDYYTWAVLTYTWY +HLA-B39:30,YYSEYRNICTNTDESNLYLRYNFYTWAVLAYTWY +HLA-B39:31,YHSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:32,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYLWH +HLA-B39:33,YYSEYRNICTNTDESNLYWTYNFYTWAVRAYLWY +HLA-B39:34,YYSEYRNICTNTDESNLYWTYNFYTWAVLAYTWY +HLA-B39:35,YYSEYRNICTNTDESNLYLRYNFYTWAELTYTWY +HLA-B39:36,YYSEYRNICTNTDESNLYLRYNFYTWAEWAYTWY +HLA-B39:37,YYSEYRNICTNTYESNLYLSYNFYTWAVLTYTWY +HLA-B39:39,YYSEYRNISTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:41,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:42,YYSEYRNICTNTDESNLYIRYNFYTWAVLTYTWY +HLA-B39:43,YYSEYRNICTNTDESNLYLRYDSYTWAVLAYTWH +HLA-B39:44,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:45,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:46,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:47,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYEWY +HLA-B39:48,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWH +HLA-B39:49,YYSEYREISTNTYESNLYLRYDFYTWAVLTYTWY +HLA-B39:50,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYEWY +HLA-B39:51,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:52,YYSEYRNICTDTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:53,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:54,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:55,YYSEYRNICTNTYESNLYLRYDFYTWAVLTYTWY +HLA-B39:56,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY +HLA-B39:57,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY +HLA-B39:58,YYSEYRNIFTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:59,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY +HLA-B39:60,YYSEYRNICTNTDESNLYLRYNFYTWAALTYTWY +HLA-B4001,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4002,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4003,YHTKYREISTNTYESNLYLSYDSYTWAVLAYEWY +HLA-B4004,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY +HLA-B4005,YHTKYREISTNTYESNLYLSYNYYTWAELAYLWY +HLA-B4006,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B4007,YHTKYREIFTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4008,YHTKYRNIFTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4009,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY +HLA-B4010,YYAKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4011,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY +HLA-B4012,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4013,YHTKYREIFTNTYENIAYLSYNYYTWAVLAYEWY +HLA-B4014,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY +HLA-B4015,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY +HLA-B4016,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY +HLA-B4018,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY +HLA-B4019,YHTKYREISTNTYENIAYLSYNYYTWAVLAYEWY +HLA-B4020,YHTKYREISTNTYESNLYLRYDSYTWAVLAYEWY +HLA-B4021,YYAMYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4023,YHTKYREISTNTYESNLYLRYNYYSWAERAYEWY +HLA-B4024,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY +HLA-B4025,YHTKYRNISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4026,YHTKYREISTNTYESNLYLRYNYYTWAELAYLWY +HLA-B4027,YHTKYREISTNTYESNLYLSYNNYTWAVLAYEWY +HLA-B4028,YHTKYREISTNTYESNLYIRYNYYTWAELAYLWH +HLA-B4029,YHTKYPEISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4030,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY +HLA-B4031,YHTKYREISTNTYESNLYLSYDYYSLAVLAYEWY +HLA-B4032,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY +HLA-B4033,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY +HLA-B4034,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY +HLA-B4035,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4036,YHTKYREISTNTYESNLYLRYNFYSLAVLAYEWY +HLA-B4037,YHTKYREISTNTYENNLYLSYNYYTWAVLAYEWY +HLA-B4038,YHTKYREISTNTYESNLYLRYNSYSLAVLAYEWY +HLA-B4039,YHTKYREISTNTYESNLYLSYNYYTWAVLAYTWY +HLA-B4040,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4042,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY +HLA-B4043,YHTKYREISTNTDESNLYLRYNYYSLAVLAYEWY +HLA-B4044,YHTKYREISTNTYESNLYWTYDYYTWAVLAYEWY +HLA-B4045,YHTKYREISTNTYESNLYLSYNYYSWAVLAYEWY +HLA-B4046,YHTEYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4047,YHTKYREISTNTYENTAYLRYNYYSLAVLAYEWY +HLA-B4048,YHTKYREISTNTYESNLYLRYNLYSLAVLAYEWY +HLA-B4049,YYTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4050,YHTKYREISTNTDESNLYLSYNYYTWAVLAYEWY +HLA-B4051,YHTKYREISTNTYESNLYLRYNYYSWAELAYTWH +HLA-B4052,YHTKYREISTNTYESNLYLRYDSYSLAVLAYEWY +HLA-B4053,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B4054,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4055,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4056,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4057,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4058,YYAKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4059,YHTKYREISTNTYESNLYIRYDSYSLAVLAYEWY +HLA-B4060,YHTKYREISTNTYESNLYLRSDSYSLAVLAYEWY +HLA-B4061,YHTKYREIYTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4062,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4063,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY +HLA-B4064,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY +HLA-B4065,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4066,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4067,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4068,YHTKYRNIFTNTYESNLYIRYNYYTWAVLAYEWY +HLA-B4069,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4070,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B4071,YHTKYREISTNTYESNLYLSYNLYTWAVLAYLWY +HLA-B4072,YHTKYREISTNTYESNLYLRYNYYTLAVLAYEWY +HLA-B4073,YHTKYREISTNTYVSNLYLRYNYYSLAVLAYEWY +HLA-B4074,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4075,YHTKYREICTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B4076,YHTKYREISTNTYESKLYLRYNYYSLAVLAYEWY +HLA-B4077,YHTKYREISTNTYESNLYLRYNFYTLAVLAYEWY +HLA-B40:01,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:02,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:03,YHTKYREISTNTYESNLYLSYDSYTWAVLAYEWY +HLA-B40:04,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY +HLA-B40:05,YHTKYREISTNTYESNLYLSYNYYTWAELAYLWY +HLA-B40:06,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B40:07,YHTKYREIFTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:08,YHTKYRNIFTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:09,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY +HLA-B40:10,YYAKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:100,YHTKYREISTNTYESNLYLRFNYYSLAVLAYEWY +HLA-B40:101,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:102,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:103,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B40:104,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:105,YHTKYREISTNTYESNLYLSYNSYTWAVLAYEWY +HLA-B40:106,YHTKYRNIFTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:107,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:108,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:109,YHTKYREISTNTYESIAYWTYNYYTWAVLAYEWY +HLA-B40:11,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY +HLA-B40:110,YYTKYREISTNTYENTAYWTYNYYTWAVLAYEWY +HLA-B40:111,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:112,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:113,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWH +HLA-B40:114,YHTKYREISTNTYESNLYLRYNYYSWAVLAYEWY +HLA-B40:115,YHTKYWEISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:116,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:117,YHTKYREISTNTYENIAYLRYNYYSLAVLAYEWY +HLA-B40:119,YHTKYREISTNTYDSNLYLSYNYYTWAVLAYEWY +HLA-B40:12,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:120,YHTKYREISTNTYESNLYIRYDYYTWAVLAYEWY +HLA-B40:121,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY +HLA-B40:122,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:123,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:124,YHTKYREISTNTYESNLYLRYHDYSLAVLAYEWY +HLA-B40:125,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:126,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:127,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B40:128,YHTKYREISTNTYESNLYLRYNYYSLAVRAYEWY +HLA-B40:129,YYTKYREISTNTYESNLYIRYNYYTWAVLAYEWY +HLA-B40:13,YHTKYREIFTNTYENIAYLSYNYYTWAVLAYEWY +HLA-B40:130,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:131,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B40:132,YHTKYREISTNTYESNLYLRYNYYSLAVLAYESY +HLA-B40:134,YHTKYREISTNIYESNLYLRYNYYSLAVLAYEWY +HLA-B40:135,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:136,YHTKYREISTNTYESNLYLRYNYYTWAVDAYEWY +HLA-B40:137,YYAMYREISTNTYESNLYIRYNYYSLAVLAYEWY +HLA-B40:138,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:139,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:14,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY +HLA-B40:140,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:141,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:143,YHTKYREISTNTYESNLYLSFNYYTWAVLAYEWY +HLA-B40:145,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:146,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:147,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:15,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY +HLA-B40:16,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY +HLA-B40:18,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY +HLA-B40:19,YHTKYREISTNTYENIAYLSYNYYTWAVLAYEWY +HLA-B40:20,YHTKYREISTNTYESNLYLRYDSYTWAVLAYEWY +HLA-B40:21,YYAMYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:23,YHTKYREISTNTYESNLYLRYNYYSWAERAYEWY +HLA-B40:24,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY +HLA-B40:25,YHTKYRNISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:26,YHTKYREISTNTYESNLYLRYNYYTWAELAYLWY +HLA-B40:27,YHTKYREISTNTYESNLYLSYNNYTWAVLAYEWY +HLA-B40:28,YHTKYREISTNTYESNLYIRYNYYTWAELAYLWH +HLA-B40:29,YHTKYPEISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:30,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY +HLA-B40:31,YHTKYREISTNTYESNLYLSYDYYSLAVLAYEWY +HLA-B40:32,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY +HLA-B40:33,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY +HLA-B40:34,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY +HLA-B40:35,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:36,YHTKYREISTNTYESNLYLRYNFYSLAVLAYEWY +HLA-B40:37,YHTKYREISTNTYENNLYLSYNYYTWAVLAYEWY +HLA-B40:38,YHTKYREISTNTYESNLYLRYNSYSLAVLAYEWY +HLA-B40:39,YHTKYREISTNTYESNLYLSYNYYTWAVLAYTWY +HLA-B40:40,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:42,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY +HLA-B40:43,YHTKYREISTNTDESNLYLRYNYYSLAVLAYEWY +HLA-B40:44,YHTKYREISTNTYESNLYWTYDYYTWAVLAYEWY +HLA-B40:45,YHTKYREISTNTYESNLYLSYNYYSWAVLAYEWY +HLA-B40:46,YHTEYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:47,YHTKYREISTNTYENTAYLRYNYYSLAVLAYEWY +HLA-B40:48,YHTKYREISTNTYESNLYLRYNLYSLAVLAYEWY +HLA-B40:49,YYTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:50,YHTKYREISTNTDESNLYLSYNYYTWAVLAYEWY +HLA-B40:51,YHTKYREISTNTYESNLYLRYNYYSWAELAYTWH +HLA-B40:52,YHTKYREISTNTYESNLYLRYDSYSLAVLAYEWY +HLA-B40:53,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B40:54,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:55,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:56,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:57,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:58,YYAKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:59,YHTKYREISTNTYESNLYIRYDSYSLAVLAYEWY +HLA-B40:60,YHTKYREISTNTYESNLYLRSDSYSLAVLAYEWY +HLA-B40:61,YHTKYREIYTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:62,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:63,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY +HLA-B40:64,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY +HLA-B40:65,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:66,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:67,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:68,YHTKYRNIFTNTYESNLYIRYNYYTWAVLAYEWY +HLA-B40:69,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:70,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B40:71,YHTKYREISTNTYESNLYLSYNLYTWAVLAYLWY +HLA-B40:72,YHTKYREISTNTYESNLYLRYNYYTLAVLAYEWY +HLA-B40:73,YHTKYREISTNTYVSNLYLRYNYYSLAVLAYEWY +HLA-B40:74,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:75,YHTKYREICTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B40:76,YHTKYREISTNTYESKLYLRYNYYSLAVLAYEWY +HLA-B40:77,YHTKYREISTNTYESNLYLRYNFYTLAVLAYEWY +HLA-B40:78,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:79,YHTKYREISTNTYESNLHLRYNYYSLAVLAYEWY +HLA-B40:80,YHTKYREISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B40:81,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:82,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:83,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B40:84,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:85,YHTKYREISTNTYESNLYLSYNYYIWAVLAYEWY +HLA-B40:86,YHTKYREISTNTYESNLYWTYNFYTWAVLAYEWY +HLA-B40:87,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:88,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B40:89,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:90,YHTKYREISTNTYESNLYLSYNYYTWAVLAHEWY +HLA-B40:91,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:92,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY +HLA-B40:93,YHTEYREISTNTYESNLYWTYNYYTWAVLAYEWY +HLA-B40:94,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:95,YHTKYREISTNTYESNLYWTYNYYTWAELAYEWY +HLA-B40:96,YHTKYREISTNTYENTAYWTYNYYTWAVLAYEWY +HLA-B40:97,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B40:98,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY +HLA-B40:99,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY +HLA-B4101,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY +HLA-B4102,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY +HLA-B4103,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY +HLA-B4104,YHTKYREISTNTYESNLYLSYDYYTWAVDAYTWY +HLA-B4105,YHTKYREISTNTYESKLYWRYNYYTWAVDAYTWY +HLA-B4106,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY +HLA-B4107,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY +HLA-B4108,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY +HLA-B41:01,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY +HLA-B41:02,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY +HLA-B41:03,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY +HLA-B41:04,YHTKYREISTNTYESNLYLSYDYYTWAVDAYTWY +HLA-B41:05,YHTKYREISTNTYESKLYWRYNYYTWAVDAYTWY +HLA-B41:06,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY +HLA-B41:07,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY +HLA-B41:08,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY +HLA-B41:09,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY +HLA-B41:10,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY +HLA-B41:11,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY +HLA-B41:12,YHAKYREISTNTYESNLYWRYNYYTWAVDAYTWY +HLA-B4201,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B4202,YHSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B4204,YYSEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY +HLA-B4205,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B4206,YYSEYRNIYAQTDESNLYLSYNFYTWAVDAYTWY +HLA-B4207,YYSEYRNIYTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B4208,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B4209,YHSEYRNIYAQTDESNLYLSYDSYTWAVDAYTWY +HLA-B42:01,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B42:02,YHSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B42:04,YYSEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY +HLA-B42:05,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B42:06,YYSEYRNIYAQTDESNLYLSYNFYTWAVDAYTWY +HLA-B42:07,YYSEYRNIYTNTDESNLYLSYNYYTWAVDAYTWY +HLA-B42:08,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B42:09,YHSEYRNIYAQTDESNLYLSYDSYTWAVDAYTWY +HLA-B42:10,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B42:11,YYSEYREISTNTYESNLYLSYNYYTWAVDAYTWY +HLA-B42:12,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B42:13,YYSEYRNIYAQTDESNLYIRYNYYTWAVDAYTWY +HLA-B42:14,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY +HLA-B4402,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4403,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4404,YYTKYREISTNTYENTAYIRYDDYTWAVRAYTSY +HLA-B4405,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY +HLA-B4406,YYATYRNIFTNTYENIAYIRYDDYTWAVDAYLSY +HLA-B4407,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4408,YYTMYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4409,YYTKYREISTNTYESNLYIRYDDYTWAVDAYLSY +HLA-B4410,YYTKYREISTNTYENTAYIRFNLYTWAVLAYLSY +HLA-B4411,YYTKYREISTNTYENTPYIRYDDYTWAVDAYLSY +HLA-B4412,YYTKYRNISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4413,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4414,YYTKYREISTNTYENTAYIRYNDYTWAVDAYLSY +HLA-B4415,YHTKYREISTNTYESTAYWRYNLYTWAVDAYLSY +HLA-B4416,YYTKYREISTNTYENTAYIRYDDYTWAVDAYEWY +HLA-B4417,YYTKYREISTNTYENTAYIRYDSYTWAVDAYLSY +HLA-B4418,YHTKYREISTNTYENIAYWRYNLYTWAVDAYLSY +HLA-B4420,YYTKYREISTNTYENTAYWTYDDYTWAVDAYLSY +HLA-B4421,YYTKYREISTNTYENTAYIRYDDYTWAVDAYESY +HLA-B4422,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4424,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4425,YYTKYREISTNTYENIAYIRYDYYTWAVDAYLSY +HLA-B4426,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4427,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4428,YYTKYREISTNTYENTAYIRYDDYTWAVRAYLSY +HLA-B4429,YYTKYREISTNTYENTAYIRYDDYTWAVLTYLSY +HLA-B4430,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4431,YYTKYREISTNTYENTAYLRYNYYSLAVLAYESY +HLA-B4432,YYTKYPEISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4433,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4434,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4435,YYTKYREISTNTYENTAYIRYDDYTWAVEAYLSY +HLA-B4436,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4437,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLWY +HLA-B4438,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4439,YYPKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4440,YYTEYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4441,YYTKYREISTNTYENTAYLRYDDYTWAVDAYLSY +HLA-B4442,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLWY +HLA-B4443,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLSY +HLA-B4444,YYTEYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4445,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B4446,YYTKYREISTNTYESNLYIRYDDYTWAVLAYLSY +HLA-B4447,YYTKYREISTNTYENTAYWTYDDYTWAVLAYLSY +HLA-B4448,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4449,YDTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4450,YYTKYREISTNTYENIAYIRYDDYTWAVLAYLSY +HLA-B4451,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4453,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4454,YYTKYREISTNTYENTAYLSYDDYTWAVLAYLSY +HLA-B44:02,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:03,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:04,YYTKYREISTNTYENTAYIRYDDYTWAVRAYTSY +HLA-B44:05,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY +HLA-B44:06,YYATYRNIFTNTYENIAYIRYDDYTWAVDAYLSY +HLA-B44:07,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:08,YYTMYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:09,YYTKYREISTNTYESNLYIRYDDYTWAVDAYLSY +HLA-B44:10,YYTKYREISTNTYENTAYIRFNLYTWAVLAYLSY +HLA-B44:100,YYTKYREISTNTYENTAYWRYDDYTWAVDAYLSY +HLA-B44:101,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:102,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:103,YHTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:104,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:105,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:106,YYTKYREISTNTYENTAYLSYDDYTWAVDAYLSY +HLA-B44:107,YYTKYREISTNTYENTAYIRYDYYTWAVLAYLSY +HLA-B44:109,YYTKYREISTNTYESTAYIRYDDYTWAVLAYLSY +HLA-B44:11,YYTKYREISTNTYENTPYIRYDDYTWAVDAYLSY +HLA-B44:110,YYTKYREISTNTYENTAYISYDDYTWAVLAYLSY +HLA-B44:12,YYTKYRNISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:13,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:14,YYTKYREISTNTYENTAYIRYNDYTWAVDAYLSY +HLA-B44:15,YHTKYREISTNTYESTAYWRYNLYTWAVDAYLSY +HLA-B44:16,YYTKYREISTNTYENTAYIRYDDYTWAVDAYEWY +HLA-B44:17,YYTKYREISTNTYENTAYIRYDSYTWAVDAYLSY +HLA-B44:18,YHTKYREISTNTYENIAYWRYNLYTWAVDAYLSY +HLA-B44:20,YYTKYREISTNTYENTAYWTYDDYTWAVDAYLSY +HLA-B44:21,YYTKYREISTNTYENTAYIRYDDYTWAVDAYESY +HLA-B44:22,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:24,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:25,YYTKYREISTNTYENIAYIRYDYYTWAVDAYLSY +HLA-B44:26,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:27,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:28,YYTKYREISTNTYENTAYIRYDDYTWAVRAYLSY +HLA-B44:29,YYTKYREISTNTYENTAYIRYDDYTWAVLTYLSY +HLA-B44:30,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:31,YYTKYREISTNTYENTAYLRYNYYSLAVLAYESY +HLA-B44:32,YYTKYPEISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:33,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:34,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:35,YYTKYREISTNTYENTAYIRYDDYTWAVEAYLSY +HLA-B44:36,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:37,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLWY +HLA-B44:38,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:39,YYPKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:40,YYTEYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:41,YYTKYREISTNTYENTAYLRYDDYTWAVDAYLSY +HLA-B44:42,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLWY +HLA-B44:43,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLSY +HLA-B44:44,YYTEYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:45,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:46,YYTKYREISTNTYESNLYIRYDDYTWAVLAYLSY +HLA-B44:47,YYTKYREISTNTYENTAYWTYDDYTWAVLAYLSY +HLA-B44:48,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:49,YDTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:50,YYTKYREISTNTYENIAYIRYDDYTWAVLAYLSY +HLA-B44:51,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:53,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:54,YYTKYREISTNTYENTAYLSYDDYTWAVLAYLSY +HLA-B44:55,YHTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:57,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:59,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:60,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:62,YYTKYREISTNTYENTAYIRYNYYTWAVDAYLSY +HLA-B44:63,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:64,YYTKYREISTNTYENTAYIRYDDYTWAVLAYEWY +HLA-B44:65,YYTKYREISTNTYENTAYLRYDDYTWAVLAYLSY +HLA-B44:66,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:67,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:68,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:69,YYTKYWEISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:70,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY +HLA-B44:71,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:72,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:73,YYTKYREISTNTYENTAYIRYDDYTWAVDGYLSY +HLA-B44:74,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:75,YYTKYREISTNTYENNLYIRYDYYTWAVDAYLSY +HLA-B44:76,YYTKYREISTNTYENTAYIRYDDYTWAERAYLSY +HLA-B44:77,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY +HLA-B44:78,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY +HLA-B44:79,YYTKYREISTNTYENTAYIRYDDYTWAELAYLSY +HLA-B44:80,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:81,YYTNYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:82,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY +HLA-B44:83,YYATYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:84,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:85,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:86,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:87,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:88,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:89,YYTKYREISTNTYENTAYIRYDDYTWAVDTYLSY +HLA-B44:90,YYTKYREIYAQTDESNLYIRYDDYTWAVDAYLSY +HLA-B44:91,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLWY +HLA-B44:92,YYTKYREISTNTYENTAYIRYDDYTWAMLAYLSY +HLA-B44:93,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B44:94,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:95,YYTKYREISTNTYENIAYIRYDDYTWAVDAYLSY +HLA-B44:96,YYTKYREISTNTYENTAYIGYDDYTWAVLAYLSY +HLA-B44:97,YYTKYREICAKTDENTAYIRYDDYTWAVDAYLSY +HLA-B44:98,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY +HLA-B44:99,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY +HLA-B4501,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY +HLA-B4502,YHTKYREISTNTYESNLYWRYNFYTWAVDAYLSY +HLA-B4503,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY +HLA-B4504,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLWY +HLA-B4505,YHTKYREISTNTYESNLYWRYNLYTWAVDVYLSY +HLA-B4506,YHTKYREIYAQTDESNLYWRYNLYTWAVDAYLSY +HLA-B4507,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY +HLA-B45:01,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY +HLA-B45:02,YHTKYREISTNTYESNLYWRYNFYTWAVDAYLSY +HLA-B45:03,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY +HLA-B45:04,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLWY +HLA-B45:05,YHTKYREISTNTYESNLYWRYNLYTWAVDVYLSY +HLA-B45:06,YHTKYREIYAQTDESNLYWRYNLYTWAVDAYLSY +HLA-B45:07,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY +HLA-B45:08,YHTKYREISTNTYESNLYWRYNLYTWAVDAYTWY +HLA-B45:09,YHTKYREISTNTYESNLYWRYDSYTWAVDAYLSY +HLA-B45:10,YHTKYREISTNTYESNLYWRYNLYTWAVDAYEWY +HLA-B45:11,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY +HLA-B45:12,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY +HLA-B4601,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B4602,YYAMYREKYRQTGVSNLYLRYDSYTWAEWAYLWY +HLA-B4603,YYAMYREKYRQTDVSNLYLRYDSYTWAERAYTWY +HLA-B4604,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B4605,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B4606,YYAMYREKYRQTDVSNLYLRYDSYSLAVLAYEWY +HLA-B4608,YYAMYREKYRQTDVSNLYLRYDSYTWAELAYLWY +HLA-B4609,YYAMYREKYRQTDVSNLYLRYDSYTWAVWAYLWY +HLA-B4610,YYTMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B4611,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYLWY +HLA-B46:01,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B46:02,YYAMYREKYRQTGVSNLYLRYDSYTWAEWAYLWY +HLA-B46:03,YYAMYREKYRQTDVSNLYLRYDSYTWAERAYTWY +HLA-B46:04,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B46:05,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B46:06,YYAMYREKYRQTDVSNLYLRYDSYSLAVLAYEWY +HLA-B46:08,YYAMYREKYRQTDVSNLYLRYDSYTWAELAYLWY +HLA-B46:09,YYAMYREKYRQTDVSNLYLRYDSYTWAVWAYLWY +HLA-B46:10,YYTMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B46:11,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYLWY +HLA-B46:12,YYAMYREKYRQTDVSNLYLSYDSYTWAEWAYLWY +HLA-B46:13,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYLWY +HLA-B46:14,YHAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B46:16,YYAMYREKFRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B46:17,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLSY +HLA-B46:18,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYTWY +HLA-B46:19,YYAMYREKYRQTDVSNLYLRYDSYTWAVLTYLWY +HLA-B46:20,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B46:21,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYTWY +HLA-B46:22,YYAMYREKYRRTDVSNLYLRYDSYTWAEWAYLWY +HLA-B46:23,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B46:24,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY +HLA-B4701,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY +HLA-B4702,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY +HLA-B4703,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY +HLA-B4704,YYTKYREISTNTYENTAYLNYHDYTWAVLAYEWY +HLA-B4705,YYTKYREISTNTYEDTLYLNYHDYTWAVLAYEWY +HLA-B47:01,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY +HLA-B47:02,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY +HLA-B47:03,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY +HLA-B47:04,YYTKYREISTNTYENTAYLNYHDYTWAVLAYEWY +HLA-B47:05,YYTKYREISTNTYEDTLYLNYHDYTWAVLAYEWY +HLA-B47:06,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY +HLA-B47:07,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY +HLA-B4801,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B4802,YYSEYREISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B4803,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B4804,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B4805,YYSEYREISTNTYESNLYLSYNYYTWAERAYEWY +HLA-B4806,YYSEYRNIFTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B4807,YYSEYREISTNTYESNLYLSYNFYSLAVLAYEWY +HLA-B4808,YYSEYREISTNTYESNLYLSYDYYTWAERAYEWY +HLA-B4809,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B4810,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4811,YYSEYREISTNTYESNLYLSYNYYSLAVLAYELY +HLA-B4812,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4813,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B4814,YYSEYREISTNTYESNLYLSYNSYTLAVLAYEWY +HLA-B4815,YYSEYREISTNTYESNLYLSYNYYSLAELAYEWY +HLA-B4816,YYSEYRVISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B4817,YYSEYREISTNTYESNLYIRYNFYSLAVLAYEWY +HLA-B4818,YYSEYREISTNTYESIAYLSYNYYSLAVLAYEWY +HLA-B48:01,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B48:02,YYSEYREISTNTYESNLYIRYDSYTWAVLAYLWY +HLA-B48:03,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY +HLA-B48:04,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B48:05,YYSEYREISTNTYESNLYLSYNYYTWAERAYEWY +HLA-B48:06,YYSEYRNIFTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B48:07,YYSEYREISTNTYESNLYLSYNFYSLAVLAYEWY +HLA-B48:08,YYSEYREISTNTYESNLYLSYDYYTWAERAYEWY +HLA-B48:09,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B48:10,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B48:11,YYSEYREISTNTYESNLYLSYNYYSLAVLAYELY +HLA-B48:12,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B48:13,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY +HLA-B48:14,YYSEYREISTNTYESNLYLSYNSYTLAVLAYEWY +HLA-B48:15,YYSEYREISTNTYESNLYLSYNYYSLAELAYEWY +HLA-B48:16,YYSEYRVISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B48:17,YYSEYREISTNTYESNLYIRYNFYSLAVLAYEWY +HLA-B48:18,YYSEYREISTNTYESIAYLSYNYYSLAVLAYEWY +HLA-B48:19,YYSEYREISTNTYESNLYLSYNYYSLAVWAYEWY +HLA-B48:20,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B48:21,YYSEYREISTNTYESNLYLNYNYYSLAVLAYEWY +HLA-B48:22,YHSEYREISTNTYESNLYLSYNYYSLAVLAYEWY +HLA-B48:23,YYSEYREISTNTYESNLYLRYDSYSLAVLAYEWY +HLA-B4901,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY +HLA-B4902,YHTKYREISTNTYENTAYWRYNLYTWAELAYLWY +HLA-B4903,YHATYREISTNTYENIAYWRYNLYTWAELAYLWY +HLA-B4904,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY +HLA-B4905,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY +HLA-B49:01,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY +HLA-B49:02,YHTKYREISTNTYENTAYWRYNLYTWAELAYLWY +HLA-B49:03,YHATYREISTNTYENIAYWRYNLYTWAELAYLWY +HLA-B49:04,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY +HLA-B49:05,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY +HLA-B49:06,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY +HLA-B49:07,YHTKYREISTNTYENIAYWRYNLYTWAELAYEWY +HLA-B49:08,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY +HLA-B49:09,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWH +HLA-B49:10,YYTKYREISTNTYENIAYWRYNLYTWAELAYLWY +HLA-B5001,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY +HLA-B5002,YHTKYREISTNTYESNLYWRYNLYTWAELAYLSY +HLA-B5004,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY +HLA-B50:01,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY +HLA-B50:02,YHTKYREISTNTYESNLYWRYNLYTWAELAYLSY +HLA-B50:04,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY +HLA-B50:05,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY +HLA-B50:06,YHTRYREISTNTYESNLYWRYNLYTWAELAYLWY +HLA-B50:07,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY +HLA-B50:08,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY +HLA-B50:09,YHTKYREISTNTYESNLYWRYNFYTWAELAYLWY +HLA-B5101,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5102,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY +HLA-B5103,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLGH +HLA-B5104,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH +HLA-B5105,YYATYRNIFTNTYENIAYWTYNYYTWAVRAYLWY +HLA-B5106,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWH +HLA-B5107,YYATYRNISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5108,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYLWH +HLA-B5109,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH +HLA-B5111,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5112,YYATYRNIFTNTYENIADWTYNYYTWAELAYLWH +HLA-B5113,YYATYRNIFTNTYENIAYWTYNFYTWAELAYLWH +HLA-B5114,YYATYRNIFTNTYENIAYWTYKYYTWAELAYLWH +HLA-B5115,YYATYRNIFTNTYENIAYWTYNLYTWAVLAYLWY +HLA-B5116,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWH +HLA-B5117,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5118,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5119,YYATYRNIFTNTYENIAYWTYNYYTWAVLTYLWH +HLA-B5120,YYATYRNIFTNTDENIAYWTYNYYTWAVDAYLWH +HLA-B5121,YYATYRNIFTNTYENIAYWTYNYYTWAELAYTWH +HLA-B5122,YYATYRNICTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5123,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLSY +HLA-B5124,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5126,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5128,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5129,YYATYRNIFTNTYENIAYWTYNYYTWAERAYLWH +HLA-B5130,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5131,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWH +HLA-B5132,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5133,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5134,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWY +HLA-B5135,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5136,YYATYRNIFTNTYENIAYWTYNYYTWAEDAYTWY +HLA-B5137,YYATYRNIFTNTYENIAYWTYDSYTWAELAYLWH +HLA-B5138,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5139,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5140,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWY +HLA-B5142,YYATYRNIFTNTYENIAYIRYDDYTWAVLAYLSY +HLA-B5143,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5145,YYATYRNIFTNTYENIAYLRYDSYTWAELAYLWH +HLA-B5146,YYATYRNIFTNTYENIAYITYNYYTWAELAYLWH +HLA-B5147,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH +HLA-B5148,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5149,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:01,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:02,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY +HLA-B51:03,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLGH +HLA-B51:04,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH +HLA-B51:05,YYATYRNIFTNTYENIAYWTYNYYTWAVRAYLWY +HLA-B51:06,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWH +HLA-B51:07,YYATYRNISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:08,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYLWH +HLA-B51:09,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH +HLA-B51:12,YYATYRNIFTNTYENIADWTYNYYTWAELAYLWH +HLA-B51:13,YYATYRNIFTNTYENIAYWTYNFYTWAELAYLWH +HLA-B51:14,YYATYRNIFTNTYENIAYWTYKYYTWAELAYLWH +HLA-B51:15,YYATYRNIFTNTYENIAYWTYNLYTWAVLAYLWY +HLA-B51:16,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWH +HLA-B51:17,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:18,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:19,YYATYRNIFTNTYENIAYWTYNYYTWAVLTYLWH +HLA-B51:20,YYATYRNIFTNTDENIAYWTYNYYTWAVDAYLWH +HLA-B51:21,YYATYRNIFTNTYENIAYWTYNYYTWAELAYTWH +HLA-B51:22,YYATYRNICTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:23,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLSY +HLA-B51:24,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:26,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:28,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:29,YYATYRNIFTNTYENIAYWTYNYYTWAERAYLWH +HLA-B51:30,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:31,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWH +HLA-B51:32,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:33,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:34,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWY +HLA-B51:35,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:36,YYATYRNIFTNTYENIAYWTYNYYTWAEDAYTWY +HLA-B51:37,YYATYRNIFTNTYENIAYWTYDSYTWAELAYLWH +HLA-B51:38,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:39,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:40,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWY +HLA-B51:42,YYATYRNIFTNTYENIAYIRYDDYTWAVLAYLSY +HLA-B51:43,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:45,YYATYRNIFTNTYENIAYLRYDSYTWAELAYLWH +HLA-B51:46,YYATYRNIFTNTYENIAYITYNYYTWAELAYLWH +HLA-B51:48,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:49,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:50,YYATYRNIFTNTYENGLYWTYNYYTWAELAYLWH +HLA-B51:51,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:52,YYATYRNIFTNTHENIAYWTYNYYTWAELAYLWH +HLA-B51:53,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:54,YYATYRNIFTNTYENTAYWTYNYYTWAVRAYLWY +HLA-B51:55,YYATYRNIFTNTYENIAYWTYNYYTWAEQAYLWH +HLA-B51:56,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH +HLA-B51:57,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:58,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:59,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWY +HLA-B51:60,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:61,YYATYRNIFTNTYENIAYWTYNYYTWAEWAYLWH +HLA-B51:62,YYATYRNIFTNTYENIAYLRYNLYTWAELAYLWH +HLA-B51:63,YYATYRNIFTNTYENIAYWTYNSYTWAELAYLWH +HLA-B51:64,YYATYRNIFTNTYENIAYLSYNYYTWAELAYLWH +HLA-B51:65,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:66,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:67,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:68,YDATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:69,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:70,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:71,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:72,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:73,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH +HLA-B51:74,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:75,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:76,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:77,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:78,YYATYRNIFTNTYENTAYWTYNYYTWAELAYLWH +HLA-B51:79,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:80,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:81,YYATYRNIFTNTYENIAYLSYNYYTWAVLAYEWY +HLA-B51:82,YYATYRNIFTNTYENIAYWTYNYYTWAERAYEWH +HLA-B51:83,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:84,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:85,YYATYRNIFTNTYENIAYWTYHDYTWAELAYLWH +HLA-B51:86,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:87,YYATYRNIFTNTYENIAYWTYNYYTWADLAYLWH +HLA-B51:88,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:89,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:90,YYATYRNIFTNTYENIAYWTYDYYTWAELAYLWH +HLA-B51:91,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:92,YYATYRNIFTNTYENIAYWTYDFYTWAELAYLWH +HLA-B51:93,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWY +HLA-B51:94,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:95,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B51:96,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5201,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5202,YYAMYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5203,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWY +HLA-B5204,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5205,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5206,YYATYREIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5207,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B5208,YYATYREISTNTYENIAYWTYNYYTWAELAYEWH +HLA-B5209,YYATYREISTNTYESIAYWTYNYYTWAELAYLWH +HLA-B5210,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWH +HLA-B5211,YYATYREISTNTYENIAYWTYNYYTWAELAYLWY +HLA-B52:01,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:02,YYAMYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:03,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWY +HLA-B52:04,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:05,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:06,YYATYREIFTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:07,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:08,YYATYREISTNTYENIAYWTYNYYTWAELAYEWH +HLA-B52:09,YYATYREISTNTYESIAYWTYNYYTWAELAYLWH +HLA-B52:10,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWH +HLA-B52:11,YYATYREISTNTYENIAYWTYNYYTWAELAYLWY +HLA-B52:12,YYATYREISTNTYENIAYWTYDYYTWAELAYLWH +HLA-B52:13,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:14,YYATYREISTNTYENIAYWTYNFYTWAELAYLWH +HLA-B52:15,YYATYREISTNTYENIAYWTYNYYTWAELAYLSH +HLA-B52:16,YYSEYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:17,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:18,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH +HLA-B52:19,YYATYREISTNTYENIAYWTYNYYTWAVDAYLWH +HLA-B52:20,YYATYREISTNTYENTAYWTYNYYTWAELAYLWH +HLA-B52:21,YYATYREISTNTYENIAYWTYNYYTWAEWAYLWH +HLA-B5301,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY +HLA-B5302,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWH +HLA-B5303,YYATYRNIFTNTYEDTLYIRYDSYTWAVLAYLWY +HLA-B5304,YYATYRNIFTNTYENIAYIRYDFYTWAVLAYLWY +HLA-B5305,YYATYRNIFTNTYESIAYIRYDSYTWAVLAYLWY +HLA-B5306,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWH +HLA-B5307,YYATYRNIFTNTYENIAYIRSNFYTWAVLAYLWY +HLA-B5308,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWY +HLA-B5309,YYATYRNISTNTYENTAYIRYDSYTWAVLAYLWY +HLA-B5310,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY +HLA-B5311,YYATYRNIFTNTYENTAYIRYDSYTWAVRAYLWY +HLA-B5312,YYATYRNIFTNTYESTAYIRYDSYTWAVLAYLWY +HLA-B5313,YYATYRNIFTNTYENTAYIRYDSYTWAVLAYLWY +HLA-B53:01,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY +HLA-B53:02,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWH +HLA-B53:03,YYATYRNIFTNTYEDTLYIRYDSYTWAVLAYLWY +HLA-B53:04,YYATYRNIFTNTYENIAYIRYDFYTWAVLAYLWY +HLA-B53:05,YYATYRNIFTNTYESIAYIRYDSYTWAVLAYLWY +HLA-B53:06,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWH +HLA-B53:07,YYATYRNIFTNTYENIAYIRSNFYTWAVLAYLWY +HLA-B53:08,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWY +HLA-B53:09,YYATYRNISTNTYENTAYIRYDSYTWAVLAYLWY +HLA-B53:10,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY +HLA-B53:11,YYATYRNIFTNTYENTAYIRYDSYTWAVRAYLWY +HLA-B53:12,YYATYRNIFTNTYESTAYIRYDSYTWAVLAYLWY +HLA-B53:13,YYATYRNIFTNTYENTAYIRYDSYTWAVLAYLWY +HLA-B53:14,YYATYRNIFTNTYENIAYLSYDSYTWAVLAYLWY +HLA-B53:15,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY +HLA-B53:16,YYATYRNIFTNTYESIAYIRYDSYTWAVRAYLWY +HLA-B53:17,YYATYREISTNTYENIAYIRYDSYTWAVLAYLWY +HLA-B53:18,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY +HLA-B53:19,YYATYRNIFTNTYENIAYIRYNYYTWAVLAYLWY +HLA-B53:20,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY +HLA-B53:21,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY +HLA-B53:22,YYATYRNIFTNTYENIAYIRYDSYTWAVDAYLSY +HLA-B53:23,YYATYRNIFTNTDENIAYIRYDSYTWAVLAYLWY +HLA-B5401,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5402,YHAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5403,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B5404,YYAGYRNIYAQTDESNLYWTYNYYTWAVLAYTWY +HLA-B5405,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5406,YYAGYRNIYAQTDESNLYLRYDSYTWAEWAYLWY +HLA-B5407,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5409,YYAGYRNIYAQTDESNLYLRYDSYTWAVLAYTWY +HLA-B5410,YYAGYRNIYAQTDESNLYWTYNLYTWAVRAYTWY +HLA-B5411,YYAGYRNIYAQTDESNLYWTYNYYSWAVLAYTWY +HLA-B5412,YYAGYRNIYAQTDENIAYWTYNLYTWAVLAYTWY +HLA-B5413,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B54:01,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B54:02,YHAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B54:03,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B54:04,YYAGYRNIYAQTDESNLYWTYNYYTWAVLAYTWY +HLA-B54:06,YYAGYRNIYAQTDESNLYLRYDSYTWAEWAYLWY +HLA-B54:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B54:09,YYAGYRNIYAQTDESNLYLRYDSYTWAVLAYTWY +HLA-B54:10,YYAGYRNIYAQTDESNLYWTYNLYTWAVRAYTWY +HLA-B54:11,YYAGYRNIYAQTDESNLYWTYNYYSWAVLAYTWY +HLA-B54:12,YYAGYRNIYAQTDENIAYWTYNLYTWAVLAYTWY +HLA-B54:13,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B54:14,YYAGYRNIYAQTDESNLYWTYDSYTWAVLAYTWY +HLA-B54:15,YYAGYRNIYAQTDESNLYWTYDYYTWAVLAYTWY +HLA-B54:16,YYAGYRNIYAQTDESNLYWTYDLYTWAVLAYTWY +HLA-B54:17,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B54:18,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B54:19,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B54:20,YYAGYRNIYAQTDESNLYWTYNLYTWAERAYTWY +HLA-B54:21,YYSGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B54:22,YYAGYRNIYAQTDESNLYWTYNLYSWAVLAYTWY +HLA-B54:23,YYAGYRNIYAQTEESNLYWTYNLYTWAVLAYTWY +HLA-B5501,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B5502,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5503,YYAEYRNIYAQTDVSNLYWTYNLYTWAELAYTWY +HLA-B5504,YYAEYRNIYAQTDESNLYLSYNYYTWAVLAYTWY +HLA-B5505,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B5507,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5508,YYAEYRNIYAQTDESNLYLRYNYYTWAVLAYLWY +HLA-B5509,YYAEYRNIYAQTDESNLYWTYNLYTWAERAYEWY +HLA-B5510,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5511,YYAEYRNIYAQTDESNLYWMYNLYTWAELAYTWY +HLA-B5512,YYAEYRNIYAQTDENNLYWTYNLYTWAVLAYTWY +HLA-B5513,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYTWY +HLA-B5514,YYAEYRNIYAQTDESNLYIVYDSYTWAELAYTWY +HLA-B5515,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B5516,YHAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5517,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY +HLA-B5518,YYAEYREISTNTYESNLYWTYNLYTWAVLAYTWY +HLA-B5519,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5520,YYAEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY +HLA-B5521,YYAEYRNIYAQTDESNLYWTYNLYTWAEWAYTWY +HLA-B5522,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYEWY +HLA-B5523,YYAEYRNIYAQTDESNLYWTYDSYTWAVLAYTWY +HLA-B5524,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYEWY +HLA-B5525,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B5526,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5527,YYAEYRNIYAQTDESNLYWTYDYYTWAVLAYTWY +HLA-B55:01,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B55:02,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:03,YYAEYRNIYAQTDVSNLYWTYNLYTWAELAYTWY +HLA-B55:04,YYAEYRNIYAQTDESNLYLSYNYYTWAVLAYTWY +HLA-B55:05,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B55:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:08,YYAEYRNIYAQTDESNLYLRYNYYTWAVLAYLWY +HLA-B55:09,YYAEYRNIYAQTDESNLYWTYNLYTWAERAYEWY +HLA-B55:10,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:11,YYAEYRNIYAQTDESNLYWMYNLYTWAELAYTWY +HLA-B55:12,YYAEYRNIYAQTDENNLYWTYNLYTWAVLAYTWY +HLA-B55:13,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYTWY +HLA-B55:14,YYAEYRNIYAQTDESNLYIVYDSYTWAELAYTWY +HLA-B55:15,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B55:16,YHAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:17,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY +HLA-B55:18,YYAEYREISTNTYESNLYWTYNLYTWAVLAYTWY +HLA-B55:19,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:20,YYAEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY +HLA-B55:21,YYAEYRNIYAQTDESNLYWTYNLYTWAEWAYTWY +HLA-B55:22,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYEWY +HLA-B55:23,YYAEYRNIYAQTDESNLYWTYDSYTWAVLAYTWY +HLA-B55:24,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYEWY +HLA-B55:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B55:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:27,YYAEYRNIYAQTDESNLYWTYDYYTWAVLAYTWY +HLA-B55:28,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY +HLA-B55:29,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B55:30,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:31,YYAEYRNIYAQTYESNLYWTYNLYTWAELAYTWY +HLA-B55:32,YYAEYRNIYAQTDESNLYWTYNSYTWAVLAYTWY +HLA-B55:33,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B55:34,YYAEYREISAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:35,YYAMYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:36,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B55:37,YYAEYRNIYAQTDESNLYWTYNLYTWAVRAYTWY +HLA-B55:38,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B55:39,YYAEYRNIYAQTDESNLYWTYNLHTWAVLAYTWY +HLA-B55:40,YYAEYREIYAQTDESNLYWTYNLYTWAELAYTWY +HLA-B55:41,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:42,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B55:43,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY +HLA-B5601,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B5602,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY +HLA-B5603,YYAEYRNIYAQTDESNLYLRYDSYTWAEWAYLWY +HLA-B5604,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY +HLA-B5605,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYLWH +HLA-B5606,YYATYRNIYAQTDESNLYWTYNYYTWAELAYLWH +HLA-B5607,YYAEYRNIYAQTDENTAYWTYNLYTWAVLAYLWY +HLA-B5608,YYAEYREKYGQTDESNLYWTYNLYTWAVLAYLWY +HLA-B5609,YYAEYRNIYAQTDESNLYIRYDSYTWAVLAYLWY +HLA-B5610,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYTWY +HLA-B5611,YYAEYRNIYAQTDESNLYIRYDFYTWAVLAYLWY +HLA-B5612,YYAEYRNIYAQTDESNLYIRYNYYTWAVLAYTWY +HLA-B5613,YYAEYRNIYAQTDESNLYWTYNLYTWAVDAYLWY +HLA-B5614,YYAEYREKYRQTDESNLYWTYNLYTWAVLAYLWY +HLA-B5615,YYAEYRNIYAQTDESNLYWTYNYYTWAVLAYLWY +HLA-B5616,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B5617,YYAEYRNIYANTDESNLYWTYNLYTWAVLAYLWY +HLA-B5618,YYAEYRNIYAQTDESNLYLRYDSYTWAVLAYTWY +HLA-B5620,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:01,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:02,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY +HLA-B56:03,YYAEYRNIYAQTDESNLYLRYDSYTWAEWAYLWY +HLA-B56:04,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY +HLA-B56:05,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYLWH +HLA-B56:06,YYATYRNIYAQTDESNLYWTYNYYTWAELAYLWH +HLA-B56:07,YYAEYRNIYAQTDENTAYWTYNLYTWAVLAYLWY +HLA-B56:08,YYAEYREKYGQTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:09,YYAEYRNIYAQTDESNLYIRYDSYTWAVLAYLWY +HLA-B56:10,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYTWY +HLA-B56:11,YYAEYRNIYAQTDESNLYIRYDFYTWAVLAYLWY +HLA-B56:12,YYAEYRNIYAQTDESNLYIRYNYYTWAVLAYTWY +HLA-B56:13,YYAEYRNIYAQTDESNLYWTYNLYTWAVDAYLWY +HLA-B56:14,YYAEYREKYRQTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:15,YYAEYRNIYAQTDESNLYWTYNYYTWAVLAYLWY +HLA-B56:16,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:17,YYAEYRNIYANTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:18,YYAEYRNIYAQTDESNLYLRYDSYTWAVLAYTWY +HLA-B56:20,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:21,YYAEYRNIYAQTDENIAYWTYNYYTWAELAYLWH +HLA-B56:22,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYLWY +HLA-B56:23,YYAEYRNIYANTYESNLYWTYNLYTWAVLAYTWY +HLA-B56:24,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYLWY +HLA-B56:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:27,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B56:29,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY +HLA-B5701,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B5702,YYAMYGENMASTYENIAYIVYNYYTWAVRAYLWY +HLA-B5703,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY +HLA-B5704,YYAMYGENMASTYENIAYIVYDDYTWAVRAYLWY +HLA-B5705,YYAMYGENMASTYENIAYIRYNYYTWAVRAYLWY +HLA-B5706,YYAMYGENMASTYENIAYIVYDSYIWAVLAYLWY +HLA-B5707,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLSY +HLA-B5708,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B5709,YYAMYGENMASTYENIAYIVYNYYTWAEDAYLWY +HLA-B5710,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B5711,YYAMYGENMASTYENIAYLWYDSYTWAVLAYLWY +HLA-B5712,YYAMYGENMASTYESNLYIVYNYYTWAVRAYLWY +HLA-B5713,YYAMYGENMASTYENIAYIVYDSYTWAERAYEWY +HLA-B57:01,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:02,YYAMYGENMASTYENIAYIVYNYYTWAVRAYLWY +HLA-B57:03,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY +HLA-B57:04,YYAMYGENMASTYENIAYIVYDDYTWAVRAYLWY +HLA-B57:05,YYAMYGENMASTYENIAYIRYNYYTWAVRAYLWY +HLA-B57:06,YYAMYGENMASTYENIAYIVYDSYIWAVLAYLWY +HLA-B57:07,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLSY +HLA-B57:08,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:09,YYAMYGENMASTYENIAYIVYNYYTWAEDAYLWY +HLA-B57:10,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:11,YYAMYGENMASTYENIAYLWYDSYTWAVLAYLWY +HLA-B57:12,YYAMYGENMASTYESNLYIVYNYYTWAVRAYLWY +HLA-B57:13,YYAMYGENMASTYENIAYIVYDSYTWAERAYEWY +HLA-B57:14,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWH +HLA-B57:15,YYAMYGENVASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:16,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:17,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY +HLA-B57:18,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:19,YYAMYGENMASTYENIAYIVYDSYTWAVRAYLWY +HLA-B57:20,YYAMYGKNMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:21,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:22,YYAMYGENMASTYENIAYIVYDSYTWAELAYLWY +HLA-B57:23,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:24,YYAMYGENMASTYENIAYIVYDSYTWAVDAYLWY +HLA-B57:25,YYAMYGENMASTYENIAYIVYDSYTWAVLAYEWY +HLA-B57:26,YYAMYGENMASTYENIAYIVYDSYTWAVLAYTWY +HLA-B57:27,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:29,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:30,YYAMYGENMASTYENIAYIVYDSYTWAARAYLWY +HLA-B57:31,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B57:32,YYAMYGENMASTYENIAYIVYHDYTWAVLAYLWY +HLA-B5801,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B5802,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY +HLA-B5804,YYATYEENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B5805,YYATYGENMASTYENIAYIRYDSYTLAALAYTWY +HLA-B5806,YYATYGENMASTYENIAYLWYDSYTWAELAYLWY +HLA-B5807,YYATYGENMASTYENIAYLWYDSYTWAVLAYLSY +HLA-B5808,YYATYGENMASTYENIAYWTYNYYTWAELAYLWH +HLA-B5809,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWH +HLA-B5811,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B5812,YYSTYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B5813,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B5814,YYATYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B5815,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:01,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:02,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY +HLA-B58:04,YYATYEENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:05,YYATYGENMASTYENIAYIRYDSYTLAALAYTWY +HLA-B58:06,YYATYGENMASTYENIAYLWYDSYTWAELAYLWY +HLA-B58:07,YYATYGENMASTYENIAYLWYDSYTWAVLAYLSY +HLA-B58:08,YYATYGENMASTYENIAYWTYNYYTWAELAYLWH +HLA-B58:09,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWH +HLA-B58:11,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:12,YYSTYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:13,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:14,YYATYGENMASTYENIAYIVYDSYTWAVLAYLWY +HLA-B58:15,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:16,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY +HLA-B58:18,YYATYGENMASTYENIAYLSYDSYTWAVLAYLWY +HLA-B58:19,YYATYGENMASTYENIAYIRYDSYTWAELAYLWY +HLA-B58:20,YYATYGENMASTYENIAYLRYNFYTWAVLTYTWY +HLA-B58:21,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:22,YYATYGENMASTYENIAYIRYDSYTWAVRAYLWY +HLA-B58:23,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:24,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:25,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY +HLA-B58:26,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY +HLA-B58:27,YYATYGENMASTYENIAYLSYNYYTWAVLAYEWY +HLA-B58:28,YYATYGENMASTYENIAYIRYNYYTWAVLAYLWY +HLA-B58:29,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B58:30,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY +HLA-B5901,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY +HLA-B5902,YYAEYRNIFTNTYENIAYWTYNYYTWAVLAYTWY +HLA-B59:01,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY +HLA-B59:02,YYAEYRNIFTNTYENIAYWTYNYYTWAVLAYTWY +HLA-B59:03,YYAEYRNIFTNTYENIAYWTYNFYTWAVLAYTWY +HLA-B59:04,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYLWY +HLA-B59:05,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY +HLA-B6701,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY +HLA-B6702,YYSGYREKYRQADVSNLYLRYNFYTWAVLTYTWY +HLA-B67:01,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY +HLA-B67:02,YYSGYREKYRQADVSNLYLRYNFYTWAVLTYTWY +HLA-B7301,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH +HLA-B73:01,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH +HLA-B73:02,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH +HLA-B7801,YYATYRNIFTNTDESNLYWTYNYYTWAELAYLWH +HLA-B7802,YYATYRNIFTNTYESNLYWTYNYYTWAELAYLWH +HLA-B7803,YYATYRNICTNTDESNLYWTYNYYTWAELAYLWH +HLA-B7804,YYATYRNIFTNTYESNLYWTYNYYTWAVLAYLWY +HLA-B7805,YYATYREISTNTYESNLYWTYNYYTWAELAYLWH +HLA-B78:01,YYATYRNIFTNTDESNLYWTYNYYTWAELAYLWH +HLA-B78:02,YYATYRNIFTNTYESNLYWTYNYYTWAELAYLWH +HLA-B78:03,YYATYRNICTNTDESNLYWTYNYYTWAELAYLWH +HLA-B78:04,YYATYRNIFTNTYESNLYWTYNYYTWAVLAYLWY +HLA-B78:05,YYATYREISTNTYESNLYWTYNYYTWAELAYLWH +HLA-B78:06,YYATYREISTNTYENNLYWTYNYYTWAELAYLWH +HLA-B78:07,YYATYRNIFTNTDESNLYWTYNYYTWAELAYTWH +HLA-B8101,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY +HLA-B8102,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY +HLA-B81:01,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY +HLA-B81:02,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY +HLA-B81:03,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY +HLA-B81:05,YYSEYRNIFAQTDESNLYLSYNYYSLAVLAYEWY +HLA-B8201,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY +HLA-B8202,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY +HLA-B82:01,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY +HLA-B82:02,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY +HLA-B82:03,YYSEYRNIYAQTDESNLYLRYNLYTWAVDAYLSY +HLA-B8301,YYSEYRNIYAQTDESNLYIRYDDYTWAVDAYLSY +HLA-B83:01,YYSEYRNIYAQTDESNLYIRYDDYTWAVDAYLSY +HLA-B9501,YYAMYREIYAQTDESNLYLRYDSYTWAEWAYLWY +HLA-B9502,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B9503,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B9504,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B9505,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B9506,YYAKYREISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B9507,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B9508,YYSEYRNICTNTYESNLYLRYDSYTWAELTYLWY +HLA-B9509,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY +HLA-B9510,YYAMYREISTNTYESNLYLRCDSYTWAEWAYLWY +HLA-B9512,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY +HLA-B9513,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B9514,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY +HLA-B9515,YYSEYRNICTNTYESTAYLRYDSYTWAELAYLWY +HLA-B9516,YYAMYREISTNTYESNLYLRYDSYSLAEWAYLWY +HLA-B9517,YYAMYREISTNTYESNLYLRYDSYTWAEWAYEWY +HLA-B9518,YYAMYREISTNTYESNLYLMYDSYTWAEWAYLWY +HLA-B9519,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY +HLA-B9520,YYAMYRDISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B9521,YYAMYRNISTNTYESNLYIRYDSYTWAELAYTWY +HLA-B9522,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B9523,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY +HLA-B9524,YYSEYRNICTNTYESNLYLRYDSYSLAVLAYEWY +HLA-B9525,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B9526,YYAMYREISTNTYESNLYLSYDSCTWAEWAYLWY +HLA-B9527,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-B9528,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY +HLA-B9529,YYAMYREISTNTYESNLYLNYDSYTWAEWAYLWY +HLA-B9530,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY +HLA-B9532,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY +HLA-C0102,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C0103,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY +HLA-C0104,YFSGYREKYRQTDVSNLYLWCDSYTWAEWAYTWY +HLA-C0105,YFSGYREKYRQTDVSNLYLRSDYYTWAERAYTWY +HLA-C0106,YFSGYREKYRQTDVSNLYLWCDYYTWAVRAYTWY +HLA-C0107,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C0108,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C0109,YFSGYREKYRQTDVSNLYLWCDYYTWAEWAYTWY +HLA-C0110,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYEWY +HLA-C0111,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C0112,YFSGYREKYRQTDVSNLYLWYDYYTWAERAYTWY +HLA-C0113,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:02,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:03,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY +HLA-C01:04,YFSGYREKYRQTDVSNLYLWCDSYTWAEWAYTWY +HLA-C01:05,YFSGYREKYRQTDVSNLYLRSDYYTWAERAYTWY +HLA-C01:06,YFSGYREKYRQTDVSNLYLWCDYYTWAVRAYTWY +HLA-C01:07,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:08,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:09,YFSGYREKYRQTDVSNLYLWCDYYTWAEWAYTWY +HLA-C01:10,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYEWY +HLA-C01:11,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:12,YFSGYREKYRQTDVSNLYLWYDYYTWAERAYTWY +HLA-C01:13,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:14,YFSGYREKYRQTDVNKLYLWCDYYTWAERAYTWY +HLA-C01:15,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:16,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:17,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY +HLA-C01:18,YFSGYREKYHQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:19,YFSGYREKYRQTDVCNLYLWCDYYTWAERAYTWY +HLA-C01:20,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:21,YFSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C01:22,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYTWY +HLA-C01:23,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY +HLA-C01:24,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY +HLA-C01:25,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:26,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:27,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:28,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:29,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTCY +HLA-C01:30,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWH +HLA-C01:31,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYMWY +HLA-C01:32,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:33,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:34,YFSGYREKYRQTDVSNLYLWYNFYTWAERAYTWY +HLA-C01:35,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYLWY +HLA-C01:36,YFSGYREKYRQTDVSNLYLRFDYYTWAERAYTWY +HLA-C01:38,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:39,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C01:40,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C0202,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C0203,YYAGYREKYRQTDVNKLYLRYDSYTWAVLAYEWY +HLA-C0204,CYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C0205,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYEWY +HLA-C0206,YYAGYREKYRQTDVNKLYLRYDLYTWAEWAYEWY +HLA-C0207,YYAGYREKYRQTDVNKLYLRYHDYTWAEWAYEWY +HLA-C0208,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C0209,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C0210,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C0211,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C0212,YYAGYREKYRQADVSKLYLRYDSYTWAEWAYEWY +HLA-C0213,YYAGYREKYRQTDVNKLYLRYDSYTWAAWAYEWY +HLA-C0214,YDAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:02,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:03,YYAGYREKYRQTDVNKLYLRYDSYTWAVLAYEWY +HLA-C02:04,CYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYEWY +HLA-C02:06,YYAGYREKYRQTDVNKLYLRYDLYTWAEWAYEWY +HLA-C02:07,YYAGYREKYRQTDVNKLYLRYHDYTWAEWAYEWY +HLA-C02:08,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:09,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:10,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:11,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:12,YYAGYREKYRQADVSKLYLRYDSYTWAEWAYEWY +HLA-C02:13,YYAGYREKYRQTDVNKLYLRYDSYTWAAWAYEWY +HLA-C02:14,YDAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:15,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:16,YYAGYREKYRQTDVNKLYLRYDSYTWAELAYEWY +HLA-C02:17,YYAGYREKYRQTDVNKLYLWFDSYTWAEWAYEWY +HLA-C02:18,YYAGYREKYRQTDVNKLYLRYDSYTWAALAYEWY +HLA-C02:19,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY +HLA-C02:20,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:22,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYEWY +HLA-C02:23,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY +HLA-C02:24,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:26,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:27,YYAGYREKYRQTDVSNLYLRYDSYTWAEWAYEWY +HLA-C02:28,YYAGYREKYRQTDVNKLYLRYDSYTWAVWAYEWY +HLA-C02:29,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:30,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:31,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:32,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYEWY +HLA-C02:33,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:34,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:35,YYAGYREKYRQTDVNKLHLRYDSYTWAEWAYEWY +HLA-C02:36,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:37,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:39,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C02:40,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY +HLA-C0301,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY +HLA-C0302,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY +HLA-C0303,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C0304,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C0305,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY +HLA-C0306,YYAGYREKYRQTDVSNLYIRYVYYTWAELAYLWY +HLA-C0307,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY +HLA-C0308,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C0309,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C0310,YYAGYREKYRQTDVSKLYIRYDYYTWAELAYLWY +HLA-C0311,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C0312,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY +HLA-C0313,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY +HLA-C0314,YYAGYREKYRQTDVSNLYIRYDSYTLAALAYTWY +HLA-C0315,YYAGYREKYRQADVNKLYLRYDSYTWAELAYLWY +HLA-C0316,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYTWY +HLA-C0317,YYAGYREKYRQTDVSNLYLWYDYYTWAELAYLWY +HLA-C0318,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C0319,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY +HLA-C0321,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY +HLA-C0322,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C0323,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C0324,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C0325,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY +HLA-C03:01,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY +HLA-C03:02,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY +HLA-C03:03,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:04,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:05,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY +HLA-C03:06,YYAGYREKYRQTDVSNLYIRYVYYTWAELAYLWY +HLA-C03:07,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY +HLA-C03:08,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:09,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:10,YYAGYREKYRQTDVSKLYIRYDYYTWAELAYLWY +HLA-C03:11,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:12,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY +HLA-C03:13,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY +HLA-C03:14,YYAGYREKYRQTDVSNLYIRYDSYTLAALAYTWY +HLA-C03:15,YYAGYREKYRQADVNKLYLRYDSYTWAELAYLWY +HLA-C03:16,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYTWY +HLA-C03:17,YYAGYREKYRQTDVSNLYLWYDYYTWAELAYLWY +HLA-C03:18,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:19,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY +HLA-C03:21,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY +HLA-C03:23,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:24,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:25,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY +HLA-C03:26,YYAGYREKYRQTDVSNLYIRYDFYTWAELAYLWY +HLA-C03:27,YYAGYREKYRQADVSNLYLSYDYYTWAELAYLWY +HLA-C03:28,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY +HLA-C03:29,YYAGYRENYRQTDVSKLYIRYDYYTWAELAYLWY +HLA-C03:30,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:31,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:32,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:33,YYAGYREKYRQTDVSNLCLRYDSYTWAELAYLWY +HLA-C03:34,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYEWY +HLA-C03:35,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY +HLA-C03:36,YYAGYREKYRQTDVSNLYLRYDSYTWAVLAYLWY +HLA-C03:37,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:38,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY +HLA-C03:39,YDSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:40,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY +HLA-C03:41,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:42,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY +HLA-C03:43,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY +HLA-C03:44,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:45,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY +HLA-C03:46,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:47,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:48,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:49,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY +HLA-C03:50,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:51,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWH +HLA-C03:52,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:53,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:54,YYAGYREKYRQTDVSNLYIRYDYYTWAELPYLWY +HLA-C03:55,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY +HLA-C03:56,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:57,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:58,YYAGYREKYRQTDVSNLYLWCNFYTWAERAYTWY +HLA-C03:59,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:60,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY +HLA-C03:61,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:62,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:63,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:64,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:65,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:66,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:67,YDAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:68,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:69,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY +HLA-C03:70,YYAGYREKYRQTDESNLYIRYDYYTWAELAYLWY +HLA-C03:71,YYAGYREKYRQTDVSNLYLWYDSYTWAELAYLWY +HLA-C03:72,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:73,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:74,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:75,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:76,HYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:77,YYAGYREKYRQTDVSNLYIRYDYYTWAVLAYLWY +HLA-C03:78,YYAGYREKYRQTDVSNLYIRYDYYTWAEMAYLWY +HLA-C03:79,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:80,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY +HLA-C03:81,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:82,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:83,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:84,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY +HLA-C03:85,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:86,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C03:87,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:88,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:89,YYAGYREKYRQTDVSNLYLRFDSYTWAELAYLWY +HLA-C03:90,YYAGYREKYRQTDVSNLYIRSDYYTWAELAYLWY +HLA-C03:91,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:92,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY +HLA-C03:93,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY +HLA-C03:94,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY +HLA-C0401,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C0403,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C0404,YSAGYREKYRQADVNKLYLRFNFYTWAELAYTWY +HLA-C0405,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C0406,YYAGYREKYRQADVNKLYLRFNFYTWAELAYTWY +HLA-C0407,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C0408,YSAGYREKYRQADVNKLYLRFNFYTWAERAYLWY +HLA-C0409,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C0410,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY +HLA-C0411,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY +HLA-C0412,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C0413,YSAGYREKYRQADVNKLYLRFNFYTWAALAYTWY +HLA-C0414,YSAGYREKYRQADVNKLYLRFNFYTWAEQAYTWY +HLA-C0415,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY +HLA-C0416,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C0417,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY +HLA-C0418,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:01,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:03,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:04,YSAGYREKYRQADVNKLYLRFNFYTWAELAYTWY +HLA-C04:05,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:06,YYAGYREKYRQADVNKLYLRFNFYTWAELAYTWY +HLA-C04:07,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:08,YSAGYREKYRQADVNKLYLRFNFYTWAERAYLWY +HLA-C04:10,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY +HLA-C04:11,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY +HLA-C04:12,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:13,YSAGYREKYRQADVNKLYLRFNFYTWAALAYTWY +HLA-C04:14,YSAGYREKYRQADVNKLYLRFNFYTWAEQAYTWY +HLA-C04:15,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY +HLA-C04:16,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:17,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY +HLA-C04:18,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:19,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:20,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:23,YSAGYREKYRQADVNKLYLRFDFYTWAERAYTWY +HLA-C04:24,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:25,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:26,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:27,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:28,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:29,YSAGYREKYRQADVSNLYLRFNFYTWAERAYTWY +HLA-C04:30,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:31,YSAGYREKYRQADVNKLYLRFNFYTWVERAYTWY +HLA-C04:32,YSAGYREKYRQADVNKLYLRFNFYTWAERAYEWY +HLA-C04:33,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:34,YSAGYREKYRQADVNKLYLRFNFYTWAVLAYLWY +HLA-C04:35,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:36,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY +HLA-C04:37,YSAGYREKYRQADVNKLYLWCNFYTWAERAYTWY +HLA-C04:38,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:39,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:40,YSAGYREKYRQADVNKLYFRFNFYTWAERAYTWY +HLA-C04:41,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:42,YDAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:43,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:44,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:45,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:46,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:47,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:48,YSAGYREKYRQADVNKLYLRFNFYTWAERPYTWY +HLA-C04:49,YSAGYWEKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:50,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:51,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:52,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:53,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:54,YSAGYREKYRQADVNKLYLRFDSYTWAERAYTWY +HLA-C04:55,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY +HLA-C04:56,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:57,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:58,YSAGYREKYRQADVNKLYLRFNFYTLAALAYTWY +HLA-C04:60,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:61,YSAGYREKYRQADVNKLYLRFNFYTWAARAYTWY +HLA-C04:62,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:63,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:64,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:65,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:66,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:67,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:68,YSAGYREKYRQADVNKLYLRFNFYTWAAQAYTWY +HLA-C04:69,YSAGYGEKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C04:70,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C0501,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C0502,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYMWY +HLA-C0503,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C0504,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYTWY +HLA-C0505,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C0506,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C0508,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY +HLA-C0509,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C0510,YYAGYREKYRQTDVNKLYIRYNFYTWAERAYTWY +HLA-C0511,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYTWY +HLA-C0512,YYAGYREKYRQTDVNKLYLRYNFYTWAVRAYTWY +HLA-C0513,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:01,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:03,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:04,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYTWY +HLA-C05:05,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:06,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:08,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY +HLA-C05:09,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:10,YYAGYREKYRQTDVNKLYIRYNFYTWAERAYTWY +HLA-C05:11,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYTWY +HLA-C05:12,YYAGYREKYRQTDVNKLYLRYNFYTWAVRAYTWY +HLA-C05:13,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:14,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:15,YYAGYWEKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:16,YYAGYREKYRQTDVNKLYLWYNFYTWAERAYTWY +HLA-C05:17,YYAGYREKYRQTDVNKLYLRYNFYTWAALAYTWY +HLA-C05:18,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:19,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:20,YYAGYREKYRQTDVNNLYLRYNFYTWAERAYTWY +HLA-C05:21,YYAGYREKYRQTDVNKLHLRYNFYTWAERAYTWY +HLA-C05:22,YYAGYREKYRQTDVNKLYLRYDFYTWAERAYTWY +HLA-C05:23,YYAGYREKYRQTDVNKLYLRYNFYTLAERAYTWY +HLA-C05:24,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:25,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:26,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:27,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYLWY +HLA-C05:28,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:29,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:30,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:31,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:32,YYAGYREKYRQTDVNRLYLRYNFYTWAERAYTWY +HLA-C05:33,YYAGCREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:34,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:35,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:36,YYAGYRENYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:37,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:38,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:39,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYLWY +HLA-C05:40,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:41,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:42,YYAGYREKYRQADVNKLYLRYNFYTWAERAYTWY +HLA-C05:43,YDAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:44,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C05:45,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY +HLA-C0602,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C0603,YYSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C0604,YDSGYREKYRQADVNKLYLWYDSYTWAELAYTWY +HLA-C0605,YDSGYREKYRQTDVNKLYLWYDSYTWAERAYTWY +HLA-C0606,YDSGYREKYRQADVNKLYLWYDSYTWAERAYTWY +HLA-C0607,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C0608,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYEWY +HLA-C0609,YDSGYREKYRQADVNKLYLWYNFYTWAEWAYTWY +HLA-C0610,YDPGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C0611,YDSGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C0612,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C0613,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:02,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:03,YYSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:04,YDSGYREKYRQADVNKLYLWYDSYTWAELAYTWY +HLA-C06:05,YDSGYREKYRQTDVNKLYLWYDSYTWAERAYTWY +HLA-C06:06,YDSGYREKYRQADVNKLYLWYDSYTWAERAYTWY +HLA-C06:07,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:08,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYEWY +HLA-C06:09,YDSGYREKYRQADVNKLYLWYNFYTWAEWAYTWY +HLA-C06:10,YDPGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:11,YDSGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C06:12,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:13,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:14,YDSGYREKYRQADVNKLYIWYDSYTWAEWAYTWY +HLA-C06:15,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:17,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:18,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:19,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:20,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:21,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:22,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:23,YDSGYREKYRQADVNKLYLWCDSYTWAEWAYTWY +HLA-C06:24,YDSGYREKYRQADVNKLYLWYDSYTWAEWAHTWY +HLA-C06:25,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:26,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:27,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:28,YDAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:29,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:30,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:31,YDSGYREKYRQADVNKLYLWYDSYTWAAWAYTWY +HLA-C06:32,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:33,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:34,YDSGYREKYRQADVNKLYLWYDFYTWAEWAYTWY +HLA-C06:35,YDSGYREKYRQADVNKLYIRSDSYTWAEWAYTWY +HLA-C06:36,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:37,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:38,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:39,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:40,YDSGYREKYRQADVNKLYLWYDSYTWAEWTYTWY +HLA-C06:41,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:42,YDSGYREKYRQADVNKLYLWYDSYTRAEWAYTWY +HLA-C06:43,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C06:44,YDSGYRENYRQTDVNKLYLWYDSYTWAEWAYTWY +HLA-C06:45,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C0701,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0702,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C0703,YDSGYREKYRQADVSNLYLRSDSYTWAALAYLWY +HLA-C0704,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY +HLA-C0705,YDSGYREKYRQADVSNLYLNYDSYTLAALAYTWY +HLA-C0706,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0707,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY +HLA-C0708,YDSGYREKYRQADVSNLYLRFDSYTLAALAYTWY +HLA-C0709,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY +HLA-C0710,YDSGYREKYRQADVSNLYIRSDSYTLAALAYTWY +HLA-C0711,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY +HLA-C0712,YDSGYREKYRQADVSNLYFRYDFYTWAADAYTWY +HLA-C0713,YDSGYREKYRQADVSNLYLRSDFYTLAALAYTWY +HLA-C0714,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0715,YDSGYREKYRQADVSNLYLRSDSYTLAALAYEWY +HLA-C0716,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0717,YDSGYREKYRQADVSNLYLRSDSYTWAALAYTWY +HLA-C0718,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0719,YDSGYRENYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C0720,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0721,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0722,YDSGYRENYRQADVSNLYLRYDSYTLAAWAYTWY +HLA-C0723,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C0724,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0725,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C0726,YYSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0727,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0728,YDSGYRENYRQADVSNLYLRYNFYTLAALAYTWY +HLA-C0729,YDSGYREKYRQADVSNLYLRSDYYTLAALAYTWY +HLA-C0730,YDSGYRENYRQADVSNLYLRYDSYTLAGLAYTWY +HLA-C0731,YDSGYREKYRQADVSNLYLWYDSYTLAALAYTWY +HLA-C0732,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTAP +HLA-C0734,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0735,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0736,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C0737,YDSGYREKYRQADVSNLYLRSDSYTLAARAYTWY +HLA-C0738,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:01,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:02,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:03,YDSGYREKYRQADVSNLYLRSDSYTWAALAYLWY +HLA-C07:04,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY +HLA-C07:05,YDSGYREKYRQADVSNLYLNYDSYTLAALAYTWY +HLA-C07:06,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:07,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY +HLA-C07:08,YDSGYREKYRQADVSNLYLRFDSYTLAALAYTWY +HLA-C07:09,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY +HLA-C07:10,YDSGYREKYRQADVSNLYIRSDSYTLAALAYTWY +HLA-C07:100,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:101,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY +HLA-C07:102,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:103,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:105,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:106,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:107,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:108,YDSGYRENYRQADVSNLYLRFDSYTLAALAYTWY +HLA-C07:109,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:11,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY +HLA-C07:110,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:111,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:112,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:113,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:114,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:115,YDSGYRENYRQADVSDLYLRYDSYTLAALAYTWY +HLA-C07:116,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:117,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:118,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:119,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:12,YDSGYREKYRQADVSNLYFRYDFYTWAADAYTWY +HLA-C07:120,YDSGYRENYRQADVSNLYLRYDSYTLAALAYPWY +HLA-C07:122,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:123,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:124,YDSGYRENYRQADESNLYLRYDSYTLAALAYTWY +HLA-C07:125,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:126,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:127,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:128,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:129,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:13,YDSGYREKYRQADVSNLYLRSDFYTLAALAYTWY +HLA-C07:130,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:131,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:132,DDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:133,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:134,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:135,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:136,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:137,YDSGYREKYRQADVSNLYLRSDSYTLAALTYTWY +HLA-C07:138,YDSGYREKYRQADVSNLYLRSDSYTLAAWAYTWY +HLA-C07:139,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY +HLA-C07:14,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:140,YDSGYRENYRQADVSNLYLRYDSYTWAVDAYTWY +HLA-C07:141,YDSGYRENYRQADVSNLYLRYDSYTWAALAYTWY +HLA-C07:142,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY +HLA-C07:143,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:144,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:145,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:146,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:147,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:148,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:149,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:15,YDSGYREKYRQADVSNLYLRSDSYTLAALAYEWY +HLA-C07:16,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:17,YDSGYREKYRQADVSNLYLRSDSYTWAALAYTWY +HLA-C07:18,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:19,YDSGYRENYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:20,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:21,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:22,YDSGYRENYRQADVSNLYLRYDSYTLAAWAYTWY +HLA-C07:23,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:24,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:25,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:26,YYSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:27,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:28,YDSGYRENYRQADVSNLYLRYNFYTLAALAYTWY +HLA-C07:29,YDSGYREKYRQADVSNLYLRSDYYTLAALAYTWY +HLA-C07:30,YDSGYRENYRQADVSNLYLRYDSYTLAGLAYTWY +HLA-C07:31,YDSGYREKYRQADVSNLYLWYDSYTLAALAYTWY +HLA-C07:35,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:36,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:37,YDSGYREKYRQADVSNLYLRSDSYTLAARAYTWY +HLA-C07:38,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:39,YDSGYREKYRQTDVSNLYLRSDSYTLAALAYTWY +HLA-C07:40,YDSGYRENYRQTDVSNLYLRYDSYTLAALAYTWY +HLA-C07:41,YDSGYREKYRQADVSNLYLRYNFYTWAERAYTWY +HLA-C07:42,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:43,YDSGYREKYRQADVSNLYIRYDSYTLAALAYTWY +HLA-C07:44,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:45,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY +HLA-C07:46,YDSEYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:47,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:48,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:49,YDSGYREKYRQADVNNLYLRSDSYTLAALAYTWY +HLA-C07:50,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:51,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:52,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:53,YDSGYRENYRQADVSNLYLRYDSYTLAAQAYTWY +HLA-C07:54,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:56,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:57,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:58,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:59,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:60,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:62,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:63,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY +HLA-C07:64,YSAGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:65,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:66,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:67,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:68,YDSGYREKYRQADVSNLYLRSDSYTLAADAYTWY +HLA-C07:69,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:70,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:71,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:72,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:73,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:74,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:75,YDSGYREKYRQADVSNLHLRSDSYTLAALAYTWY +HLA-C07:76,YDSGYREKYRQADVNKLYLRSDSYTLAALAYTWY +HLA-C07:77,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:78,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:79,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:80,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:81,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:82,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:83,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:84,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:85,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:86,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:87,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:88,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:89,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:90,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:91,YDSGYRENYRQADVSNLYLRYDSYTLTALAYTWY +HLA-C07:92,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:93,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:94,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:95,YDSGYRENYRQADVSNLYLRYDSYTLAVLAYTWY +HLA-C07:96,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C07:97,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C07:99,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY +HLA-C0801,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C0802,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C0803,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C0804,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY +HLA-C0805,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY +HLA-C0806,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYAWY +HLA-C0807,YYAGYREKYRQTDVSNLYLRYNFYTLAERAYTWY +HLA-C0808,YYAGYREKYRQTDVSNLYLSYNFYTWATLAYTWY +HLA-C0809,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY +HLA-C0810,YYAGYREKYRQTDVNKLYLRYNFYTWATLAYTWY +HLA-C0811,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY +HLA-C0812,YYAGYREKYRQTDVSNLYLWYNFYTWAERAYTWY +HLA-C0813,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY +HLA-C0814,YYSGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C08:01,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C08:02,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C08:03,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C08:04,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY +HLA-C08:05,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY +HLA-C08:06,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYAWY +HLA-C08:07,YYAGYREKYRQTDVSNLYLRYNFYTLAERAYTWY +HLA-C08:08,YYAGYREKYRQTDVSNLYLSYNFYTWATLAYTWY +HLA-C08:09,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY +HLA-C08:10,YYAGYREKYRQTDVNKLYLRYNFYTWATLAYTWY +HLA-C08:11,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY +HLA-C08:12,YYAGYREKYRQTDVSNLYLWYNFYTWAERAYTWY +HLA-C08:13,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY +HLA-C08:14,YYSGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C08:15,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C08:16,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C08:17,YYAGYREKYCQTDVSNLYLRYNFYTWAERAYTWY +HLA-C08:18,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C08:19,YYAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY +HLA-C08:20,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C08:21,YYAGYREKYRQADVSNLYLRYNFYTWATLAYTWY +HLA-C08:22,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C08:23,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C08:24,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY +HLA-C08:25,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY +HLA-C08:27,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY +HLA-C08:28,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C08:29,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY +HLA-C08:30,YYAGYREKYRQTDVSNLYLRYNFYTWPERAYTWY +HLA-C08:31,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYEWY +HLA-C08:32,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C08:33,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C08:34,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C08:35,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY +HLA-C1202,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C1203,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C1204,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C1205,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY +HLA-C1206,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C1207,YYAGYREKYRQADVGNLYLWYDSYTWAEWAYTWY +HLA-C1208,YYAGYRENYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C1209,YYAGYREKYRQTDVNKLYLWYDSYTWAERAYTWY +HLA-C1210,YYAGYREKYRQADVSNLYLRFDSYTWAEWAYTWY +HLA-C1211,YYAGYREKYRQADVSNLYLWSDSYTWAEWAYTWY +HLA-C1212,YYAGYREKYRQADESNLYLWYDSYTWAEWAYTWY +HLA-C1213,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C1214,YYAGYREKYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C1215,YYAGYREKYRQADVSNLYLWYDLYTWAEWAYTWY +HLA-C1216,YDSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C1217,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:02,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:03,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:04,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY +HLA-C12:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY +HLA-C12:06,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:07,YYAGYREKYRQADVGNLYLWYDSYTWAEWAYTWY +HLA-C12:08,YYAGYRENYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:09,YYAGYREKYRQTDVNKLYLWYDSYTWAERAYTWY +HLA-C12:10,YYAGYREKYRQADVSNLYLRFDSYTWAEWAYTWY +HLA-C12:11,YYAGYREKYRQADVSNLYLWSDSYTWAEWAYTWY +HLA-C12:12,YYAGYREKYRQADESNLYLWYDSYTWAEWAYTWY +HLA-C12:13,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:14,YYAGYREKYRQADVSNLYLRYDSYTLAALAYTWY +HLA-C12:15,YYAGYREKYRQADVSNLYLWYDLYTWAEWAYTWY +HLA-C12:16,YDSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:17,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:18,YYAGYREKYRQADVSNLYLRYDSYTWAELAYTWY +HLA-C12:19,YYAGYREKYRQADVSNLYLWYDSYTWAECAYTWY +HLA-C12:20,YYAGYREKYRQADVSNLYLWYDSYTWAELAYTWY +HLA-C12:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYTWY +HLA-C12:22,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:23,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:24,YYAGYREKYRQADVSNLYLWYDSYTWAERAYTWY +HLA-C12:25,YYAGYPEKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:26,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:27,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:28,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:29,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:30,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:31,YYAGYREKYRQADVSNLYLWYNFYTWAEWAYTWY +HLA-C12:32,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:33,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY +HLA-C12:34,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:35,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:36,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:37,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:38,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:40,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY +HLA-C12:41,YYAGYREKYRQADVNKLYLRYDSYTWAEWAYTWY +HLA-C12:43,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY +HLA-C12:44,YYAGYREKYRQADVSNLYIRYDSYTWAEWAYTWY +HLA-C1402,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C1403,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C1404,YSAGYREKYRQADVNNLYLWFDSYTWAERAYTWY +HLA-C1405,YSAGYREKYRQTDVSNLYLWYDSYTWAERAYTWY +HLA-C1406,YSAGYREKYRQTDVSNLYLWFDSYTWAELAYTWY +HLA-C1407,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C14:02,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C14:03,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C14:04,YSAGYREKYRQADVNNLYLWFDSYTWAERAYTWY +HLA-C14:05,YSAGYREKYRQTDVSNLYLWYDSYTWAERAYTWY +HLA-C14:06,YSAGYREKYRQTDVSNLYLWFDSYTWAELAYTWY +HLA-C14:08,YSAGYREKYRQTDVSNLYPWFDSYTWAERAYTWY +HLA-C14:09,YSAGYREKYRQTDVSNLYLRYDSYTWAERAYTWY +HLA-C14:10,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C14:11,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C14:12,YSAGYREKYRQTDVNKLYLWFDSYTWAERAYTWY +HLA-C14:13,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C14:14,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C14:15,YSAGYREKYRQTDVSNLYLWFDSYTWAALAYTWY +HLA-C14:16,YSAGYREKYRQTDVSNLYLWFDSYTWAEWAYTWY +HLA-C14:17,YSAGYREKYRQTDVSNLYLWFDSYTLAARAYTWY +HLA-C14:18,YSSGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C14:19,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY +HLA-C14:20,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYLWY +HLA-C1502,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C1503,YYAGYRENYRQADVNKLYIRYDLYTWAELAYTWY +HLA-C1504,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY +HLA-C1505,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY +HLA-C1506,YYAGYRENYRQTDVNKLYIRYDYYTWAELAYTWY +HLA-C1507,YYAGYRENYRQTDVSNLYIRYDLYTWAELAYTWY +HLA-C1508,YYAGYRENYRQTDVNKLYIRYDLYTWAERAYTWY +HLA-C1509,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY +HLA-C1510,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C1511,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C1512,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C1513,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C1514,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C1515,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYLWY +HLA-C1516,YYAGYREKYRQADVNKLYIRYDLYTWAELAYTWY +HLA-C1517,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:02,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:03,YYAGYRENYRQADVNKLYIRYDLYTWAELAYTWY +HLA-C15:04,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY +HLA-C15:05,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY +HLA-C15:06,YYAGYRENYRQTDVNKLYIRYDYYTWAELAYTWY +HLA-C15:07,YYAGYRENYRQTDVSNLYIRYDLYTWAELAYTWY +HLA-C15:08,YYAGYRENYRQTDVNKLYIRYDLYTWAERAYTWY +HLA-C15:09,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY +HLA-C15:10,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:11,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:12,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:13,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:15,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYLWY +HLA-C15:16,YYAGYREKYRQADVNKLYIRYDLYTWAELAYTWY +HLA-C15:17,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:18,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:19,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY +HLA-C15:20,YYAGYREKYRQTDVNKLYIRYDSYTWAELAYTWY +HLA-C15:21,YYAGYRENYRQTDVSKLYIRYDLYTWAELAYTWY +HLA-C15:22,YYAGYRENYRQTDVNKLYLRYDFYTWAELAYTWY +HLA-C15:23,YDAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY +HLA-C15:24,YYAGYRENYRQTDVNKLYIRYNYYTWAELAYTWY +HLA-C15:25,YYAGYREKYRQADVSNLYIRYNFYTWAEDAYTSY +HLA-C15:26,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:27,YYAGYRNKYRQTDVNKLYIRYDSYTWAELAYTWY +HLA-C15:28,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:29,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY +HLA-C15:30,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY +HLA-C15:31,YYAGYRENYRQTDVNKLYIRYDLYTWAALAYTWY +HLA-C15:33,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:34,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY +HLA-C15:35,YYAGYRENYRQTDVNKLHIRYDLYTWAELAYTWY +HLA-C1601,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C1602,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY +HLA-C1604,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY +HLA-C1606,YYAGYREKYRQTDVSNLYLRSDSYTWAAQAYTWY +HLA-C1607,YYAGYREKYRQTDVSNLYLRYDSYTWAAQAYTWY +HLA-C1608,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:01,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:02,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY +HLA-C16:04,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY +HLA-C16:06,YYAGYREKYRQTDVSNLYLRSDSYTWAAQAYTWY +HLA-C16:07,YYAGYREKYRQTDVSNLYLRYDSYTWAAQAYTWY +HLA-C16:08,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:09,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY +HLA-C16:10,YYAGYREKYRQTDVSNLYLWYDDYTWAAQAYTWY +HLA-C16:11,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:12,YYAGYGEKYRQTDVNKLYLWYDSYTWAAQAYTWY +HLA-C16:13,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:14,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:15,YYAGYREKYRQADVSNLYLWYDSYTWAAQAYTWY +HLA-C16:17,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:18,YYAGYREKYRQTDVSNLYLWCDSYTWAAQAYTWY +HLA-C16:19,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY +HLA-C16:20,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:21,YDAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:22,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:23,YYAGYREKYRQTDVSNLYLWFDSYTWAAQAYTWY +HLA-C16:24,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C16:25,YYAGYREKYRQADVNKLYLWYDSYTWAAQAYTWY +HLA-C16:26,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY +HLA-C1701,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C1702,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C1703,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C1704,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C17:01,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C17:02,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C17:03,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C17:04,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C17:05,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C17:06,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY +HLA-C17:07,YYAGYREKYRQADVNKLYIRYNFYSLAELAYLWY +HLA-C1801,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C1802,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C18:01,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C18:02,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY +HLA-C18:03,YDSGYREKYRQADVNKLYLRFNFYTWAEWAYEWY +HLA-E0101,YHSMYRESADTIFVNTLYLWHEFYSSAEQAYTWY +HLA-E0103,YHSMYRESADTIFVNTLYLWHEFYSSAEQAYTWY +HLA-E01:01,YHSMYRESADTIFVNTLYLWHEFYSSAEQAYTWY +HLA-E01:03,YHSMYRESADTIFVNTLYLWHEFYSSAEQAYTWY +HLA-G0101,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G0102,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G0103,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G0104,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G0106,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G0107,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G0108,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G0109,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAHTWY +HLA-G01:01,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G01:02,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G01:03,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G01:04,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G01:06,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G01:07,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G01:08,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY +HLA-G01:09,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAHTWY +Mamu-A01,YYAMYRENMTENAVNTLYLRVEYYTWAVMAYQWY +Mamu-A01,YYAMYRENMTENAVNTLYLRVEYYTWAVMAYQWY +Mamu-A02,YYAMYRENMAENAVNNLYIRYHSYTWAEHTYEWY +Mamu-A02,YYAMYRENMAENAVNNLYIRYHSYTWAEHTYEWY +Mamu-A03,YYSEYRNIYAENAVANLYFRVEYYTWAEIAYEWY +Mamu-A04,YYAMYREIMTENAVANLYYVYEFYTWAVHTYEWY +Mamu-A0505,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWY +Mamu-A0506,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A0507,YYSEYQNICADTLENTLYLTYDSYTWAAWAYQSY +Mamu-A0509,YYSEYQNICADTLENTLYLTYDSYTWAVWAYQSY +Mamu-A0510,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A0511,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH +Mamu-A06,YYSEYQNICADTYESNLYLRYEYYTWAEIAYEWY +Mamu-A0602,YYSEYRNIYANTYESNLYLRYEYYTWAEIAYEWY +Mamu-A07,YYSEYRNICANTYESNLYIRYEFYTWAAMAYEWH +Mamu-A07,YYSEYRNICANTYESNLYIRYEFYTWAAMAYEWH +Mamu-A0703,YYSEYRNICANTYESNLYIRYDSYTWAAMAYEWH +Mamu-A11,YHTKYREISANTYENTAYFTYDYYTWAVHTYEWY +Mamu-A11,YHTKYREISANTYENTAYFTYDYYTWAVHTYEWY +Mamu-A1305,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY +Mamu-A1306,YYAMYRENMTANAVANLYFRYEYYTWAVMAYEWY +Mamu-A1602,YYAMYRNYIAENAVNTLYIRYEFYTWAVLAYEWH +Mamu-A19,YSSEYRNICAETYESNLYFNYEFYTWAAHTYRSY +Mamu-A1:00101,YYAMYRENMTENAVNTLYLRVEYYTWAVMAYQWY +Mamu-A1:00102,YYAMYRENMTENAVNTLYVRVEYYTWAVMAYQWY +Mamu-A1:00103,YYAMYRENMTENAVNTLYLRVEYYTWAVMAYEWY +Mamu-A1:00104,YYAMYRENMTENAVNTLYLRVEYYTWAVMAYEWY +Mamu-A1:00105,YYAMYRENMAENAVNNLYLRVESYTWAVMAYKSY +Mamu-A1:00201,YYAMYRENMAENAVNNLYIRYHSYTWAEHTYEWY +Mamu-A1:00301,YYSEYRNIYAENAVANLYFRVEYYTWAEIAYEWY +Mamu-A1:00302,YYSEYRNIYAENAVNNLYFRYEYYTWAEMAYEWY +Mamu-A1:00303,YSSEYRNICAANAVANLYYRYDFYTWAAMAYLWY +Mamu-A1:00304,YYSEYRNICAENAVANLYFRVEYYTWAEIAYEWY +Mamu-A1:00305,YYSEYRNIYAENAVANLYYRYYSYTWAVIAYEWY +Mamu-A1:00306,YYSEYRNIYAENAVANLYFRVEYYTWAVMAYRSY +Mamu-A1:00307,YYSEYRNIYAENAVANLYFRYEYYTWAVMAYRSY +Mamu-A1:00308,YYSEYRNIYAENAVANLYYRYYDYTWAWIAYEWY +Mamu-A1:00310,YYAEYRNIYAENAVANLYYRYYDYTWAWIAYEWY +Mamu-A1:00401,YYAMYREIMTENAVANLYYVYEFYTWAVHTYEWY +Mamu-A1:00402,YYAMYREIMTENAVANLYYVYEFYTWAAHTYEWY +Mamu-A1:00403,YYAMYRENMTERAVATLYYVYEFYTWAVWAYQWY +Mamu-A1:00601,YYSEYQNICADTYESNLYLRYEYYTWAEIAYEWY +Mamu-A1:00602,YYSEYRNIYANTYESNLYLRYEYYTWAEIAYEWY +Mamu-A1:00701,YYSEYRNICANTYESNLYIRYEFYTWAAMAYEWH +Mamu-A1:00702,YYSEYRNICADTYESNLYIRYEFYTWAAMAYEWH +Mamu-A1:00703,YYSEYRNICANTYESNLYIRYDSYTWAAMAYEWH +Mamu-A1:00704,YYSEYRNIAADTYENTLYIRYEYYTWAAMAYEWH +Mamu-A1:00705,YYSEYRNICADTYENTLYIRYESYTWAAMAYEWH +Mamu-A1:00801,YYSEYRNIYAANYEGNLYYTYDSYTWAEFTYEWY +Mamu-A1:01001,YYSMYREKMTETYGNTLYITYEYYTWAVWAYEWY +Mamu-A1:01002,YYSMYREKMTEIYGNNLYITYEFYTWAAWAYEWY +Mamu-A1:01101,YHTKYREISANTYENTAYFTYDYYTWAVHTYEWY +Mamu-A1:01102,YYTKYREISANTYENTAYFKYEFYTWAAMAYQSY +Mamu-A1:01103,YHTKYREISANTYENTAYFTYDYYTWAVHAYEWY +Mamu-A1:01104,YHTKYREISANTYENTAYFTYDYYTWAVHTYEWY +Mamu-A1:01201,YYAMYRENMTATYESNLYFRYSYYTWAEFTYRWY +Mamu-A1:01601,YYAMYRNYIAENAVNTLYIRYEFYTWAVLAYEWH +Mamu-A1:01801,YYAMYEEISANTYESNLYFRFSHYTWAWIAYEWY +Mamu-A1:01802,YYSEYEEISANTYESNLYFRYSHYTWAWFAYEWY +Mamu-A1:01803,YYATYEEISANTYESNLYFRYSYYTWAAYIYQWY +Mamu-A1:01804,YYATYEQIAANTYESNLYFRYSYYTWAAYIYQWY +Mamu-A1:01805,YYAMYEEISANTYESNLYFRFSHYTWAWIAYEWY +Mamu-A1:01806,YYATYEEISANTYESNLYFRYSYYTWAAYIYQWY +Mamu-A1:01807,YYSEYEEISANTYESNLYFRYSHYTWAWFAYEWY +Mamu-A1:01808,YYSMYEEISANTYESNLYFRYSHYTWAWIAYEWY +Mamu-A1:01901,YSSEYRNICAETYESNLYFNYEFYTWAAHTYRSY +Mamu-A1:01902,YSSEYRNICAETYESNLYFNYSYYTWAAHTYEWY +Mamu-A1:01903,YSSEYQNICADTLESNLYVKYSYYTWAVWAYEWY +Mamu-A1:01904,YSSEYRNICAENAVANLYFNYEFYTWAAHTYEWY +Mamu-A1:01905,YSSEYRNICAETYESNLYFNYDYYTWAAHTYEWY +Mamu-A1:01906,YSSEYRNICAENAVANLYFNYEFYTWAAHTYEWY +Mamu-A1:01907,YSSEYRNICAETYESNLYFNYSYYTWAAHTYEWY +Mamu-A1:02201,YYSEYRNIYAETYESNLYLRYDSYTWAARAYEWY +Mamu-A1:02202,YYSEYRNIYAETYESNLYLRYDSYTWAARAYEWY +Mamu-A1:02203,YYSEYRNIYANTYESNLYLTYDSYTWAARAYEWY +Mamu-A1:02301,YYSMYREIMAENAVANLYFRYNFYTWAERAYRWY +Mamu-A1:02302,YYSMYREIMAENAVANLYFRYNFYTWAERAYRWY +Mamu-A1:02501,YYAMYRENMTETYGNTLYIKYEYYTWAVHTYRWY +Mamu-A1:02502,YYAMYRENMTENAVDNLYIKYEYYTWAVHTYRWY +Mamu-A1:02601,YYAMYSQIMADSYESNLYIRLHHYTWAAWAYEWY +Mamu-A1:02602,YYAMYSQIMADSYESNLYIRLHHYTWAAWAYPWY +Mamu-A1:02603,YYAMYSQIMADSYESNLYLKYHHYTWAAWAYPWY +Mamu-A1:02801,YYAMYRENMTATYENTLYFRYEYYTWAVDAYEWY +Mamu-A1:02802,YYAMYRENMTATYENTAYVKYEYYTWAAMAYEWY +Mamu-A1:02803,YYAMYRENMTATYENTAYFRYEYYTWAVDAYEWY +Mamu-A1:02804,YYAMYREIMTATYENTAYVKYEYYTWAAMAYEWY +Mamu-A1:02805,YYAMYREIMTATYENTAYFKYEFYTWAADVYRSY +Mamu-A1:02806,YYAMYRNIMTATYENTAYFRVEYYTWAAMAYEWY +Mamu-A1:03201,YHTKYEEISANTYESNLYYRYSYYTWAVFTYRWY +Mamu-A1:03202,YHTKYEEISANTYESNLYYRYSYYTWAVFTYRWY +Mamu-A1:03203,YHTKYEEISANTYESNLYFRFSYYTWAEFTYRWY +Mamu-A1:03301,YYAMYSQIMADTYESNLYIWYHHYTWAVWAYRWY +Mamu-A1:04001,YYAMYRSIMAENAVANLYITYDSYTWAVDVYKWH +Mamu-A1:04002,YYAMYRSIMAGNAVANLYITYDSYTWAVDVYKWH +Mamu-A1:04003,YYAMYRSIMAENAVANLYITYDSYTWAVDVYKWH +Mamu-A1:04101,YYAMYSQIMTATYESNLYVTYESYTWAWMAYEWY +Mamu-A1:04102,YYAMYSQNMTATYESNLYVTYVYYTWAVMAYEWY +Mamu-A1:04201,YYAMYRNIMAENAVANLYYMYEFYTWEWDTYEWY +Mamu-A1:04301,YYAMYRNIMTANAVANLYFRYSYYTWAVFTYRSY +Mamu-A1:04501,YYAMYSQIMADTYVNTLYVRYEFYTWAADVYEWY +Mamu-A1:04801,YYAMYRNIMAEDAADTLYLKYYYYTWEWDTYLSY +Mamu-A1:04901,YYAMYRSYMTAMAVDNLYLTYFDYTWAVLAYTWH +Mamu-A1:04902,YYAMYRSYMTAMAVDNLYLTYFDYTWAVLAYTWH +Mamu-A1:04903,YYAMYRSYMTAMAVDNLYLTYFDYTWAVLAYTWH +Mamu-A1:04904,YYAMYRSYMTAMAVDNLYLTYFDYTWAVLAYTWH +Mamu-A1:05001,YYAEYREISANTYESNLYITYEFYTWAEQAYRSY +Mamu-A1:05101,YYAEYRNIYAENYEGILYIKYEFYTWAAHTYEWY +Mamu-A1:05201,YYAEYQNSYADNYEGTLYLTYDFYTWAELTYRSY +Mamu-A1:05301,YYSEYQNIYAENYEGNLYLTYESYTWAEWTYRSY +Mamu-A1:05302,YYSEYQNIYAENYEGNLYLTYESYTWAEWTYRSY +Mamu-A1:05401,YYSEYQNICAATYEGILYYRYSYYTWAVFTYLSY +Mamu-A1:05402,YYSEYQNIYAATYEGILYYRYSYYTWAVFTYLSY +Mamu-A1:05501,YHTKYREISANTYESILYYRYEFYTWAVIAYEWY +Mamu-A1:05601,YHTKYREISTNTYEGILYFRFSYYTWAEFTYRWY +Mamu-A1:05602,YHTKYREISTNTYEGILYYRYSYYTWAVFTYLWY +Mamu-A1:05603,YHTKYREISTNTYENTAYFRFSYYTWAEFTYRWY +Mamu-A1:05701,YYAMYSQIMADTYESNLYVRYHHYTWAVDVYRSY +Mamu-A1:05702,YYAMYSQIMADTYENTAYVRYHHYTWAVDVYRSY +Mamu-A1:05901,YYAMYRENMTATYVNTLYIWHNHYTWAVFAYEWH +Mamu-A1:06001,YYAMYRSYMTANAVNNLYIRVDHYTWAVMAYTWH +Mamu-A1:06101,YYAMYRENMTANAVNNLYIRYESYTWAWMVYEWY +Mamu-A1:06301,YYAEYQNIYAENYEGILYLTYEFYTWAEQAYRSY +Mamu-A1:06501,YYAMYQEKADTNYVNTAYIKYDSYTWAWMAYEWY +Mamu-A1:06601,YHTKYEEISANNYENTLYIKYDDYTWAVHAYESY +Mamu-A1:07301,YYAMYEEIMADTYENTAYFTYDSYTWAVDVYEWY +Mamu-A1:07401,YYALYRNICAENYENTLYIKYEFYTWAVQTYTWH +Mamu-A1:07402,YYALYRNICAETYENTAYIKYEFYTWAVHTYTWH +Mamu-A1:07403,YYALYRNICAETYENTAYIKYEFYTWAVHTYTWH +Mamu-A1:08101,YYAEYREKMTATYVNNLYVTYEYYTWAVDTYEWY +Mamu-A1:08501,YYAEYRNIYAENYESNLYVTYEYYTWAVDTYEWY +Mamu-A1:09101,YYSEYREISAETLENTLYIKYDSYTWAAMAYEWY +Mamu-A1:09201,YYAMYRNICADTYESNLYIRYHHYTWAVWAYRSY +Mamu-A1:10501,YYSEYRNIYAANYEGNLYFRYEYYTWAAMAYTWY +Mamu-A1:10502,YYSEYRNICAANYEGNLYFRYEYYTWAAMAYTWY +Mamu-A1:10503,YYSEYRNICAANYEGNLYFRYEFYTWAAMAYTWY +Mamu-A1:10504,YHSEYRNICAANYEGNLYFRYEYYTWAAMAYTWY +Mamu-A1:10601,YYSMYREIMAENAVANLYLTYDFYTWAELTYRSY +Mamu-A1:10701,YYSMYEEISANTYGNTLYITYEFYTWAVDVYRSY +Mamu-A1:10801,YYAMYRENMTATYENTLYIWYDSYTWAWIAYEWY +Mamu-A1:10901,YYSEYREISAETYEGILYYTYDYYTWAVMAYRWY +Mamu-A1:11001,YTAMYREKMTETSGNTLYIRVEFYTWAVMAYTWY +Mamu-A1:11101,YYSMYREKMTETSGNTLYIRVEFYTWAVMAYTWY +Mamu-A1:11201,YYSMYRNIMTANAVANLYIRYSHYTWAWFAYEWY +Mamu-A1:11301,YYSMYREICADTLENTLYITYDSYTWAVDVYRSY +Mamu-A20101,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYESY +Mamu-A20102,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYESY +Mamu-A21,YYSEYRNIYAENAVANLYFRVEYYTWAVMAYRSY +Mamu-A2201,YYSEYRNIYAETYESNLYLRYDSYTWAARAYEWY +Mamu-A23,YYSMYREIMAENAVANLYFRYNFYTWAERAYRWY +Mamu-A24,YYSEYRNISADTLADTLYITYYYYTWAEFAYEWY +Mamu-A25,YYAMYRENMTETYGNTLYIKYEYYTWAVHTYRWY +Mamu-A26,YYAMYSQIMADSYESNLYIRLHHYTWAAWAYEWY +Mamu-A2601,YYAMYSQIMADSYESNLYIRLHHYTWAAWAYEWY +Mamu-A28,YYAMYRENMTATYENTLYFRYEYYTWAVDAYEWY +Mamu-A2:0101,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYESY +Mamu-A2:0102,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYESY +Mamu-A2:0103,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYEWY +Mamu-A2:0501,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH +Mamu-A2:05020,YYSEYQNICADTLENTLYLTYDSYTWAVWAYQSY +Mamu-A2:05030,YYSEYQNICADTLENTLYLTYDSYTWAVWAYQSY +Mamu-A2:05040,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0505,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWY +Mamu-A2:0506,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0507,YYSEYQNICADTLENTLYLTYDSYTWAAWAYQSY +Mamu-A2:0509,YYSEYQNICADTLENTLYLTYDSYTWAVWAYQSY +Mamu-A2:0510,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0511,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH +Mamu-A2:0512,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0513,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0514,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:05150,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:05160,YYSEYQNICADTLENTLYLTYDSYTWAVHTYQSY +Mamu-A2:0517,YYSEYQNICADTLENTLYLTYDSYTWAVHAYQSY +Mamu-A2:0518,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0519,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0520,YYSEYQNICADTLENTLYLTYDSYTWAVWAYESY +Mamu-A2:0521,YYSEYQNICADTLENTLYLTYDSYTWAVWAYESY +Mamu-A2:0522,YYSEYQNICADTLENTLYLTYDSYTWAVWAYESY +Mamu-A2:0523,YYSEYREICADTLENTLYITYDSYTWAVRAYEWH +Mamu-A2:0524,YYSEYQNICADTLENTLYITYDSYTWAVWTYEWH +Mamu-A2:0525,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0526,YYSEYQNIAANTFENTAYITYDSYTWAAHTYEWY +Mamu-A2:0527,YYSEYQNICADTLENTLYLTYDSYTWAVWVYQSY +Mamu-A2:0528,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH +Mamu-A2:0529,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0531,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:05320,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH +Mamu-A2:0533,YYSEYQNICADTLENTLYLTYDSYTWAAHTYQSY +Mamu-A2:0534,YYSEYQNICADTLENTLYITYDSYTWAAHTYEWH +Mamu-A2:0535,YYSEYQNICADTLENTLYITYDSYTWAVMAYEWH +Mamu-A2:0536,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0537,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0538,YYSEYQNICADTLENTLYLTYDSYTWAVWAYESY +Mamu-A2:0539,YYSEYQNICADTLENTLYLTYDSYTWAVHAYQSY +Mamu-A2:0540,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0541,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWY +Mamu-A2:0542,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0543,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH +Mamu-A2:0544,YYSEYREICADTLEDTLYITYDSYTWAVWAYESY +Mamu-A2:0545,YYAEYQNICADTLENTLYITYDSYTWAVWAYESH +Mamu-A2:0546,YYSEYREICADTLENTLYITYDSYTWAVWAYESY +Mamu-A2:0547,YYSEYREICADTLENTLYITYEFYTWAVDVYRSY +Mamu-A2:2401,YYSEYRNISADTLADTLYITYYYYTWAEFAYEWY +Mamu-A2:2402,YYSEYREISAETYEDTLYITYYDYTWAEFAYEWH +Mamu-A2:2403,YYSEYRNISADTYENTLYITYYYYTWAEFAYEWY +Mamu-A3:1301,YYAMYRENMTANAVANLYFRYEFYTWAVMAYEWY +Mamu-A3:1302,YYAMYRENMTANAVANLYFRVEYYTWAVMAYRSY +Mamu-A3:1303,YYAMYRENMTENAVANLYFRVEYYTWAVMAYEWY +Mamu-A3:1304,YYAMYRENMTANAVANLYFRVEYYTWAVMAYRSY +Mamu-A3:1305,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY +Mamu-A3:1306,YYAMYRENMTANAVANLYFRYEYYTWAVMAYEWY +Mamu-A3:1307,YYAMYRENMTANAVANLYFRVEFYTWAVMTYRSY +Mamu-A3:1308,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY +Mamu-A3:1309,YYAMYRENMTANAVANLYVKYEYYTWAVMAYEWY +Mamu-A3:1310,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY +Mamu-A3:1311,YYAMYRENMTENAVANLYFRVEYYTWAVMAYEWY +Mamu-A3:1312,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY +Mamu-A3:1313,YYSMYRENMTANAVANLYFRVEFYTWAVMAYRSY +Mamu-A4:0101,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY +Mamu-A4:01020,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY +Mamu-A4:0103,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY +Mamu-A4:0202,YYTMYRENMTANAVANLYIRVEYYTWAVMAYTWH +Mamu-A4:0203,YYTMYRENMTANAVANLYFRVEFYTWAVMAYTWH +Mamu-A4:0205,YYTMYRENMTANAVANLYFRVEYYTWAVMAYTWH +Mamu-A4:0301,YYAMYRENMTANAVANLYFTYEYYTWAAMAYTWH +Mamu-A4:0302,YYAMYRENMTANAVANLYFRVEYYTWAAMAYTWH +Mamu-A4:1402,YYAMYRENMTENAVANLYFRVEFYTWAVDVYRWY +Mamu-A4:14030,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY +Mamu-A4:1404,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRSY +Mamu-A4:1405,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY +Mamu-A4:1406,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY +Mamu-A4:1407,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY +Mamu-A4:1408,YYAMYLENMTANAVANLYFRVEFYTWAVDVYRWY +Mamu-A4:1409,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY +Mamu-A5:30010,YYAMYEEIMAEDAVDTLYFVYGFYTWSRHAYEWY +Mamu-A5:3002,YYAMYEEIMAEDAVDTLYFVYEFYTWSRHTYEWY +Mamu-A5:3003,YYAMYEEIMAEDAVDTLYFVYGFYTWSRHAYEWY +Mamu-A5:3004,YYAMYEEIMAEDAVDTLYFVYGFYTWSRHAYEWY +Mamu-A5:3005,YYAMYEEIMAEDAVDTLYFVYGYYTWSRHAYEWY +Mamu-A5:3006,YYAMYEEIMAEDAVDTLYFVYGFYTWSRHAYEWY +Mamu-A6:0101,YHAMYREKMTEMAVANLYIVYSYYTLAAHAYLSY +Mamu-A6:0102,YHAMYREKMTEMAVANLYIVYSYYTLAAHAYLSY +Mamu-A6:0103,YHAMYREKMTEMAVANLYIVYSYYTLAAHAYLSY +Mamu-A6:0104,YHAMYREKMTEMAVANLYIVYSYYTLAAMAYLSY +Mamu-A6:0105,YHAMYREKMTEMAVANLYIVYSYYTLAAMAYLSY +Mamu-A70103,YYAMYREIMTATYGNTAYFKYEFYTWAAHTYEWY +Mamu-A7:0101,YYAMYRENMTATYGNTAYFTYEFYTWAAWAYEWY +Mamu-A7:0102,YYAMYRENMTATYENTAYFTYEFYTWAAWAYEWY +Mamu-A7:0103,YYAMYREIMTATYGNTAYFKYEFYTWAAHTYEWY +Mamu-A7:0201,YTSEYRNICAATYENTLYLKYEFYTWAAHTYEWY +Mamu-AG:01,YYAMYRENMTPTYVNTLYIKYEFYTWAAHTYEWY +Mamu-AG:02011,YYAMYRENMTATYENTLYIKYEFYTWAAHTYEWY +Mamu-AG:02012,YYAMYRENMTATYENTLYIKYEFYTWAAHTYEWY +Mamu-AG:0202,YYAMYRENMTATYENTLYIKYEFYTWAAHTYEWY +Mamu-AG:03011,YYAMYRENMTATYANTLYFKYEFYTWAAHTYEWY +Mamu-AG:0302,YYAMYRENMTATYANTLYFKYEFYTWAAHTYEWY +Mamu-B008:01,YSSEYEERAGHTDADTLYLTYHYYTWAEVAYTWY +Mamu-B01,YHSMYREKAGNTDENIAYLMHYRYTWAVRAYRWY +Mamu-B01,YHSMYREKAGNTDENIAYLMHYRYTWAVRAYRWY +Mamu-B02,YSEMYRNNSVTTFVGNLYLWYHFYTWAEMAYTWH +Mamu-B03,YSSEYEENAGHTDADNLYLTYHYYTWAEVAYTWY +Mamu-B03,YSSEYEENAGHTDADNLYLTYHYYTWAEVAYTWY +Mamu-B03901,YTELYEERAETTFVSTAYIWYDYYTWAEMAYRWY +Mamu-B04,YSEMYEERAGNTFVGNLYYWYDFYTWAEQAYTWY +Mamu-B04,YSEMYEERAGNTFVGNLYYWYDFYTWAEQAYTWY +Mamu-B05,YYAMYEQRVGHTFVSNLYLRSDYYTWAVLAYEWY +Mamu-B07,YSEMYEARAGNTHGNTAYLWYEFYTWAALAYKWY +Mamu-B08,YSSEYEERAGHTDADTLYLTYHYYTWAEVAYTWY +Mamu-B08,YSSEYEERAGHTDADTLYLTYHYYTWAEVAYTWY +Mamu-B1001,YTEMYEQNSANTHVDTAYLTYHYYTWAERAYRWY +Mamu-B12,YSEMYEQNAANTDVSNLYVIYHFYTWDYFAYRWY +Mamu-B17,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY +Mamu-B17,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY +Mamu-B19,YTEMYRNRAGNTEGNTLYVRYHSYTWAEMAYEWH +Mamu-B20,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY +Mamu-B21,YHSMYRNISAHTHGNTLYITYNHYTWDYFADASY +Mamu-B22,YTEMYRNRAANTDGNTAYIWYHFYTWAEQAYEWH +Mamu-B24,YSSMYRERAGNTFVSNLYLWYDSYTWAVQAYTWH +Mamu-B27,YHSEYEQNAAHSHVSNLYLKYDYYTWAALAYTWY +Mamu-B28,YGYMYDVRAARTDVDTLYIIYRDYTWAVMAYEWY +Mamu-B3002,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH +Mamu-B36,YYAMYQENMTATDADTLYITYEFYTWAEWAYEWY +Mamu-B37,YYAMYEQRVARTDVDTLYIIYRDYTWAVRAYTWY +Mamu-B38,YHEMYRNRAANTDGNTAYIWYYDYTWAALAYTWY +Mamu-B39,YTELYEERAETTFVSTAYIWYDYYTWAEMAYRWY +Mamu-B3901,YTELYEERAETTFVSTAYIWYDYYTWAEMAYRWY +Mamu-B40,YTEMYEQNSGHTHVNTAYIRYDFYTWAVMAYRWY +Mamu-B41,YSEMYEQIAGHTEGNTAYIWYHLYTWAEWAYEWY +Mamu-B43,YSEMYRNRAGNTEGSTLYFRYDSYTWAERAYTWH +Mamu-B44,YHAEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY +Mamu-B45,YHSEYEEIAANTHGNTLYIKYDYYTWAAQAYEWY +Mamu-B46,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B47,YHSEYREKAAQTDVDTLYIWSRDYTWDYLAYTWY +Mamu-B48,YSAMYEEIADATFVGILYYWYHFYTWVEFAYRWY +Mamu-B48,YSAMYEEIADATFVGILYYWYHFYTWVEFAYRWY +Mamu-B49,YGVMYEEKADNTHVSNLYFRYYFYTWAVLAHPWY +Mamu-B5002,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY +Mamu-B52,YSEMYEERAGNTFVNTAYIGYHHYTWAVLAYRWY +Mamu-B53,YGAMYEQLAARTDVGTLYYWLHSYTWDYFAYEWY +Mamu-B55,YSAMYEEKADISFVSNLYYWVHYYTWVGFAYRSY +Mamu-B57,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY +Mamu-B5802,YSEMYRNNAGHTFGNTAYLWYHFYTWAEQAYEWY +Mamu-B6002,YSSMYEQLADFSFVGNLYLWYHFYTWAEVAHTWH +Mamu-B61,YSAMYRESAANTDVNTLYLMHHQYTWDYFAYEWY +Mamu-B63,YSAMYEQLADISFVGNLYLWYHFYTWAEMAYTWH +Mamu-B64,YGYVYEQIAARTDADTLYIWFHSYTWDYQAYEWY +Mamu-B65,YSEMYEERAGHTEGNTAYLWYDLYTWAEWAYEWY +Mamu-B66,YSYMYEEKAARTDVDTLYIIYRDYTWAVWAYTWY +Mamu-B6601,YSYMYEEKAARTDVDTLYIIYRDYTWAVWAYTWY +Mamu-B67,YSEMYEEIAANTDGNTLYVISHHYTWAERAYGWY +Mamu-B69,YTSMYEERAGHTDGGILYYRSHRYTWAVKAYEWY +Mamu-B70,YGYVYEQLAARTDADTLYIWFHSYTWDYMAYEWY +Mamu-B71,YSSMYRNKAAHTDVDTLYIMYRDYTWAVRAYLSY +Mamu-B8301,YSEMYEQNSARTDVDTLYITYRDYTWAAQAYRSY +Mamu-B8701,YSAMYEEKAGHTDENTLYLRSYRYTWAARAYRWY +Mamu-B:00101,YHSMYREKAGNTDENIAYLMHYRYTWAVRAYRWY +Mamu-B:00102,YHSMYREKAGNTDENIAYLMHYRYTWAVRAYRWY +Mamu-B:00201,YSEMYRNNSVTTFVGNLYLWYHFYTWAEMAYTWH +Mamu-B:00202,YSEMYRNNSVTTFVGNLYLWYHFYTWAEMAYTWH +Mamu-B:00301,YSSEYEENAGHTDADNLYLTYHYYTWAEVAYTWY +Mamu-B:00302,YSSEYEENAGHTDADNLYLTYHYYTWAEVAYTWY +Mamu-B:00401,YSEMYEERAGNTFVGNLYYWYDFYTWAEQAYTWY +Mamu-B:00501,YYAMYEQRVGHTFVSNLYLRSDYYTWAVLAYEWY +Mamu-B:00502,YYAMYEQRVGHTFVSNLYLRSDYYTWAVLAYEWY +Mamu-B:00601,YHAMYEEIAGHTEGNTLYVWHYFYTWAERAYQWY +Mamu-B:00602,YHAMYEEIAGHTEGNTLYVWHHLYTWAERAYQWY +Mamu-B:00701,YSEMYEARAGNTHGNTAYLWYEFYTWAALAYKWY +Mamu-B:00702,YSEMYEARAGNTHGNTAYLWYEFYTWAALAYKWY +Mamu-B:00703,YSEMYEARAGNTHGNTAYLWYEFYTWAALAYKWY +Mamu-B:00704,YSEMYEARAANTHGNTAYLWYEFYTWAALAYKWY +Mamu-B:00801,YSSEYEERAGHTDADTLYLTYHYYTWAEVAYTWY +Mamu-B:01001,YTEMYEQNSANTHVDTAYLTYHYYTWAERAYRWY +Mamu-B:01101,YHAEYEQIAGNAHGNNLYVTYEFYTWAADAYPWY +Mamu-B:01201,YSEMYEQNAANTDVSNLYVIYHFYTWDYFAYRWY +Mamu-B:01301,YGSEYEQIAANTDVDTLYIWYRDYTWDYFAYTWY +Mamu-B:01401,YYAMYEQRVGHTFVSNLYFRSDYYTWASLAYEWY +Mamu-B:01501,YTEMYEQNSGHTEENTLYIWYDSYTWAVLAYRWY +Mamu-B:01502,YTEMYEQNSGHTEENTLYIWYDSYTWAVLAYRWY +Mamu-B:01601,YTAMYEERAAHTDGGILYYKSYRYTWAALAYEWY +Mamu-B:01701,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY +Mamu-B:01702,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY +Mamu-B:01703,YYAEYEQRAEATHENTAYIKYHSYTWNYFAYEWY +Mamu-B:01801,YHEMYRNNAAHTDVDTLYIWYRDYTWDYFAYTWY +Mamu-B:01901,YTEMYRNRAGNTEGNTLYVRYHSYTWAEMAYEWH +Mamu-B:01902,YTEMYRNSAGNTEGNTLYVRYHSYTWAEMAYEWH +Mamu-B:01903,YTEMYRNRAGNTEGNTLYVRYHSYTWAEMAYEWY +Mamu-B:02001,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY +Mamu-B:02101,YHSMYRNISAHTHGNTLYITYNHYTWDYFADASY +Mamu-B:02102,YHSMYRNISAHTHGNTLYITYNHYTWDYFADASY +Mamu-B:02103,YHSMYRNISAHTHGNTLYITYNHYTWDYFADASY +Mamu-B:02201,YTEMYRNRAANTDGNTAYIWYHFYTWAEQAYEWH +Mamu-B:02301,YTEMYRNNSGHTHADTLYLKYHYYTWAERAYTWY +Mamu-B:02401,YSSMYRERAGNTFVSNLYLWYDSYTWAVQAYTWH +Mamu-B:02501,YYSEYEQRVETADMCTVYFRFYSYTWAYFAYESY +Mamu-B:02601,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY +Mamu-B:02602,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY +Mamu-B:02701,YHSEYEQNAAHSHVSNLYLKYDYYTWAALAYTWY +Mamu-B:02702,YHSEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY +Mamu-B:02703,YHSEYEQNAAHSHVSNLYLKYDYYTWAALAYTWY +Mamu-B:02801,YGYMYDVRAARTDVDTLYIIYRDYTWAVMAYEWY +Mamu-B:02802,YGYMYDVIAAQTDVDTLYIIYRDYTWAVMAYEWY +Mamu-B:02803,YGYMYDVIAAQTDVDTLYIIYRDYTWAVMAYEWY +Mamu-B:02901,YSEMYEERAANTDVDTLYIWYHSYTWDYFAYTWY +Mamu-B:02902,YSEMYEERAANTDVDTLYIWYHSYTWDYFAYTSH +Mamu-B:03001,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH +Mamu-B:03002,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH +Mamu-B:03003,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH +Mamu-B:03004,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH +Mamu-B:03005,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH +Mamu-B:03101,YSSMYEQIADLTFVDTAYFWFHFYTWAEWADTWY +Mamu-B:03102,YSSMYEQIADLTFVDTAYFWFHFHTWAEWAHTWY +Mamu-B:03103,YSSVYEQIADLTFVDTAYFWFHFHTWAEWAHTWY +Mamu-B:03201,YSEMYEERAGTTFVCTAYIWYNHYTWAEFAYKSY +Mamu-B:03301,YSEMYRNRAGNTFGNTAYIWYHFYTWAEQAYEWY +Mamu-B:03401,YSEMYEQIAANTEGNTAYLRYHLYTWAEWAYRWY +Mamu-B:03501,YHVMYEEKADNTHVSNLYLRYYFYTWAVLAHPWY +Mamu-B:03601,YYAMYQENMTATDADTLYITYEFYTWAEWAYEWY +Mamu-B:03602,YYAMYQENMTATDADTLYITYEFYTWAEWAYEWY +Mamu-B:03701,YYAMYEQRVARTDVDTLYIIYRDYTWAVRAYTWY +Mamu-B:03801,YHEMYRNRAANTDGNTAYIWYYDYTWAALAYTWY +Mamu-B:03802,YSEMYRNRAANTHGNTAYIKYYDYTWAALAYTWY +Mamu-B:03901,YTELYEERAETTFVSTAYIWYDYYTWAEMAYRWY +Mamu-B:04001,YTEMYEQNSGHTHVNTAYIRYDFYTWAVMAYRWY +Mamu-B:04002,YTEMYEQNSGHTHVNTAYIRYDFYTWAVLAYRWY +Mamu-B:04101,YSEMYEQIAGHTEGNTAYIWYHLYTWAEWAYEWY +Mamu-B:04201,YYAMYEQIADTTFVSNLYLEYDFYTWAVLAYEWY +Mamu-B:04301,YSEMYRNRAGNTEGSTLYFRYDSYTWAERAYTWH +Mamu-B:04401,YHAEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY +Mamu-B:04402,YHAEYEQNAAHTHVSNLYIKYDYYTWAALAYTWY +Mamu-B:04403,YHAEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY +Mamu-B:04404,YHSEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY +Mamu-B:04405,YHAEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY +Mamu-B:04501,YHSEYEEIAANTHGNTLYIKYDYYTWAAQAYEWY +Mamu-B:04502,YHSEYEHIAANTHGNTLYIKYDYYTWAAQAYEWY +Mamu-B:04503,YHSEYEQIAANTHGNTLYIKYDYYTWAAQAYEWY +Mamu-B:04504,YHSEYEQIAANTHGNTLYIKYDYYTWAAQAYEWY +Mamu-B:04601,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04602,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04603,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04604,YSSMYEQLADVTFVGNLYLWSHFYTWAEWAHTWH +Mamu-B:04605,YSAMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04607,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04608,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04609,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04610,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04611,YSSMYEQLAEAIFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04612,YSSMYEQIAEATFVSNLYLWYHFYTWAEWAHTWH +Mamu-B:04613,YSSMYEQLADVTFVGNLYLWSHFYTWAEWAHTWH +Mamu-B:04614,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04615,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04616,YSSMYEQLADVTFVGNLYLWSHFYTWAEWAHTWH +Mamu-B:04617,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH +Mamu-B:04701,YHSEYREKAAQTDVDTLYIWSRDYTWDYLAYTWY +Mamu-B:04702,YHSMYRNKAAHTDVDTLYIWSRDYTWDYLAYTWY +Mamu-B:04703,YHSMYRNKAAQTDVDTLYIWSRDYTWDYLAYTWY +Mamu-B:04704,YHSMYRNKAAHTDVDTLYIWSRDYTWDYLAYTWY +Mamu-B:04705,YHSEYREKAAQTDVDTLYIWSRDYTWAERAYTWY +Mamu-B:04801,YSAMYEEIADATFVGILYYWYHFYTWVEFAYRWY +Mamu-B:04802,YSSMYEQIADATFVGILYYWVHFYTWVEFAYRWY +Mamu-B:04901,YGVMYEEKADNTHVSNLYFRYYFYTWAVLAHPWY +Mamu-B:05002,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY +Mamu-B:05101,YGYTYEERAARTDADILYLWAHSYTWTYFAYPWY +Mamu-B:05102,YGYTYEERAARTDADTLYLWAHSYTWTYFAYPWY +Mamu-B:05103,YGYTYEERAARTDADILYLWAHSYTWTYFAYPWY +Mamu-B:05104,YGYTYEERAARTDADTLYLWAHSYTWTYFAYPWY +Mamu-B:05105,YGSTYEERAARTDADTLYVWAHSYTWTYFAYPWY +Mamu-B:05201,YSEMYEERAGNTFVNTAYIGYHHYTWAVLAYRWY +Mamu-B:05301,YGAMYEQLAARTDVGTLYYWLHSYTWDYFAYEWY +Mamu-B:05302,YGAMYEQLAARTDVGTLYYWLHSYTWDYFAYEWY +Mamu-B:05401,YSSMYEQLADISFVGNLYLWYHFYTWAEMAHTWH +Mamu-B:05501,YSAMYEEKADISFVSNLYYWVHYYTWVGFAYRSY +Mamu-B:05601,YSAMYEQRVEATFGNTAYFWFEYYTWAEMAYEWY +Mamu-B:05602,YSAMYEQRVEATFGNTAYFWFDSYTWAELAYEWY +Mamu-B:05701,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY +Mamu-B:05702,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY +Mamu-B:05802,YSEMYRNNAGHTFGNTAYLWYHFYTWAEQAYEWY +Mamu-B:05901,YGAMYEQIAANTDVDTLYIWYHDYTWDYFAYTWY +Mamu-B:06001,YSSMYEQLADFSFVGNLYLWYHFYTWAEVAHTWH +Mamu-B:06002,YSSMYEQLADFSFVGNLYLWYHFYTWAEVAHTWH +Mamu-B:06003,YSSMYEQLADISFVGNLYIWYHFYTWAEMAHTWH +Mamu-B:06101,YSAMYRESAANTDVNTLYLMHHQYTWDYFAYEWY +Mamu-B:06102,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY +Mamu-B:06103,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY +Mamu-B:06301,YSAMYEQLADISFVGNLYLWYHFYTWAEMAYTWH +Mamu-B:06302,YSAMYEQLADISFVGNLYLWYHFYTWAEMAYTWH +Mamu-B:06401,YGYVYEQIAARTDADTLYIWFHSYTWDYQAYEWY +Mamu-B:06402,YGYVYEQIAARADADTLYIWFHSYTWDYQAYEWY +Mamu-B:06501,YSEMYEERAGHTEGNTAYLWYDLYTWAEWAYEWY +Mamu-B:06502,YSEMYEQRAGHTEGNTAYLWYDLYTWAEWAYEWY +Mamu-B:06503,YSEMYEQRAGHTEGNTAYLWYDLYTWAEWAYEWY +Mamu-B:06601,YSYMYEEKAARTDVDTLYIIYRDYTWAVWAYTWY +Mamu-B:06701,YSEMYEEIAANTDGNTLYVISHHYTWAERAYGWY +Mamu-B:06702,YSEMYEEIAANTDGNTLYVISHHYTWAERAYGWY +Mamu-B:06801,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY +Mamu-B:06802,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY +Mamu-B:06803,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY +Mamu-B:06804,YSEMYRNSAGHTHGNTLYVISHHYTWAEWAYGWY +Mamu-B:06805,YSEMYRNRAGHTHGNTLYVICHHYTWAEWAYGWY +Mamu-B:06901,YTSMYEERAGHTDGGILYYRSHRYTWAVKAYEWY +Mamu-B:06902,YTAMYEQRAGHTDGGNLYYRSYRYTWAVKAYEWY +Mamu-B:06903,YTAMYEARVGHTDGGILYYKSHRYTWAVKAYEWH +Mamu-B:06904,YTSMYEARAGHTDGGNLYYRSHRYTWAVWAYEWH +Mamu-B:07001,YGYVYEQLAARTDADTLYIWFHSYTWDYMAYEWY +Mamu-B:07002,YGYVYEQIAARTDADTLYIWFHSYTWDYMAYEWY +Mamu-B:07101,YSSMYRNKAAHTDVDTLYIMYRDYTWAVRAYLSY +Mamu-B:07201,YIAMYEEKVETTFVSNLYYWYHFYTWAVMAYQCY +Mamu-B:07202,YIAMYEEKVETTFVSNLYYWYHFYTWAVMAYQCY +Mamu-B:07301,YSEMYEETAANTEVNTAYIRYRDYTWDYMVYRWY +Mamu-B:07401,YGYAYEQLAARTDVDTLYIWSRDYTWAEWAYEWH +Mamu-B:07402,YGYAYEQLAARTDVDTLYIWSRDYTWAEWAYEWH +Mamu-B:07501,YSSMYEEKADVSFVGTLYYWVHYYTWAEFAYPWY +Mamu-B:07502,YSSMYEEKADVSFVGTLYYWVHYYTWVEFAYPWY +Mamu-B:07601,YHSMYEQIAANTDVDTLYITYRDYTWAEWAYEWY +Mamu-B:07602,YHSMYEQIAGNTHVDTLYITYRDYTWAEWAYEWY +Mamu-B:07701,YHSEYEQIAGNTDADTLYLWYRDYTWAEWAYEWH +Mamu-B:07702,YHSEYEQIADTTDANTLYLWYRDYTWAEWAYEWH +Mamu-B:07801,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY +Mamu-B:07901,YSSMYEQLANIFFVGNLYLWYHFYTWAEMAHTWY +Mamu-B:07902,YSSMYEQLANIFFVGTLYLWYHFYTWAEMAHTWY +Mamu-B:07903,YSSMYEQLADISFVGNLYLWYHFYTWAEMAHTWY +Mamu-B:08001,YHYMYEEIAANTDADTLYYWSRDYTWAYFAYEWY +Mamu-B:08101,YHEMYRNRAGNTEGNTLYIWYDSYTWAEMAYEWH +Mamu-B:08102,YHEMYRNRAGNTEGNTLYIWYDSYTWAEMAYEWH +Mamu-B:08201,YHSMYEQIAEATEGNTLYLWYDSYTWAAQAYEWY +Mamu-B:08202,YHSMYEQIAEATFGNTLYLWYDSYTWAAQAYEWY +Mamu-B:08301,YSEMYEQNSARTDVDTLYITYRDYTWAAQAYRSY +Mamu-B:08401,YYAMYEQNAAHSHVSNLYLKYDYYTWAALAYTWY +Mamu-B:08501,YGAMYEQIAANTFVGTLYLRYESYTWDYLAYTWY +Mamu-B:08502,YGAMYEQIAETTFVGTLYLRYESYTWDYLAYTWY +Mamu-B:08601,YFAMYEQRAAHTDESNLYIWYRDYTWAEWAYEWY +Mamu-B:08602,YFAMYEQRAAHTDESNLYIWYRDYTWAEWAYEWY +Mamu-B:08603,YFAMYEQRAAHTDESNLYIWYRDYTWAEWAYEWY +Mamu-B:08701,YSAMYEEKAGHTDENTLYLRSYRYTWAARAYRWY +Mamu-B:08801,YYAMYEEKVETTFVSILYYWYHSYTWAVMAYQCY +Mamu-B:08901,YHSEYEQIAGNTDENTLYIWYDSYTWAAQAYEWY +Mamu-B:09001,YHYMYEERAANTDVDTLYIWSRDYTWTYFAYTWY +Mamu-B:09101,YGYMYEEKAARTDVNTLYIIYDYYTWAERAYTWY +Mamu-B:09102,YGYMYEEKAARTDVNTLYIIYRDYTWAERAYTWY +Mamu-B:09201,YGAAYEQIAANTDVGTLYIWFHSYTWDYFAYEWY +Mamu-B:09301,YHSMYRNTAGNTDGSNLYLTYEYYTWAEWAYTWY +Mamu-B:09401,YHEMYEANAARTDVDTLYIWARDYTWDYLAYTWY +Mamu-B:09501,YSSMYEAIAARTDVDTLYITYRDYTWDYFAYRWY +Mamu-B:09601,YSSMYEQLADISFVGNLYLWYHFYTWAEMAYTWH +Mamu-B:09701,YSAMYEQLADNSFVSNLYLWSHFYTWAEMAYTWH +Mamu-B:09801,YSVMYEQRVDATFVSNLYLTSYQYTWAVWAYECY +Mamu-B:09901,YSTMYEQLADISFVSNLYITYRDYTWDYFADRWY +Mamu-B:10001,YSEMYRNNAGNTFGNTVYLWYHLYTWAEQAYEWH +Mamu-B:10101,YSYMYEEKAGHTDVDTLYIIYRDYTWAVDAYPWY +Patr-A0101,YFAMYQESAAHTDVDTLYIIYRDYTWAAQAYTWY +Patr-A0201,YFAMYEESAAHTDVDTLYIIYRDYTWAARAYTWY +Patr-A0301,YYAMYQENMASTDVDTLYIIYRDYTWAALAYRWY +Patr-A0302,YYAMYQENMASTDVDTLYIIYRDYTWAALAYRGY +Patr-A0401,YSAMYEESVASTDVDTLYILFRDYTWAALAYTWY +Patr-A0402,YSAMYEESVASTDVDTLYILFRDYTWAAWAYTGY +Patr-A0404,YSAMYEESVAQTDVDTLYILFRDYTWAAWAYTGY +Patr-A0501,YSAMYEESVAFTDVDTLYILFRDYTWAAWAYTGY +Patr-A0601,YSAMYQESVASTDANTLYIIYRDYTWAAWAYTGY +Patr-A0602,YSAMYQESVAFTDANTLYIIYRDYTWAAWAYTGY +Patr-A0701,YSAMYRESVAGIYANTLYILFELYTWVAQAYRSY +Patr-A0801,YSAMYQESVAGIYANTLYIIFELYTWAARAYTWY +Patr-A0802,YSAMYQESVAGIYANTLYILFELYTWAARAYTWY +Patr-A0803,YSAMYQESVAGIYANTLYIIFELYTWAARAYTWY +Patr-A0901,YSAMYEESVASTDVDTLYIIYRYYTWAALAYTWY +Patr-A0902,YSAMYEESVASTDVDTLYIIYRDYTWAALAYTWY +Patr-A1001,YSAMYQENMAFIYANTLYILFEHYTWAAWAYRGY +Patr-A1101,YYAMYQENMASTDANTLYIIYRDYTWAARAYTGY +Patr-A1201,YSAMYEESVASTDANTLYILFEHYTWAALAYTWY +Patr-A1301,YSAMYEESVAFTDANTLYILFRYYTWAAQAYTWY +Patr-A1401,YSAMYEESVAFTDANTLYILFEHYTCAALAYTWY +Patr-A1501,YSAMYEESVAFTDANTLYILFEHYTWAAQAYTWY +Patr-A1502,YSAMYEESVAFTDANTLYILFEHYTWAADAYTWY +Patr-A1601,YYAMYEESAAHTDVDTLYILYRDYTWAVLAYLGY +Patr-A1701,YYAMYEESTASTNVDTLYIIYRDYTWAVDAYTWY +Patr-A1702,YYAMYEESAASTNVDTLYIIYRDYTWAVDAYTWY +Patr-A1703,YYAMYQENMASTDVDTLYIIYRDYTWAVDAYTWY +Patr-A1801,YSAMYEESVAFTDVDTLYILFELYTWAEWAYRWY +Patr-A2301,YSAMYRESVASTDANTLYILFRDYTWVAQAYRSY +Patr-A2401,YSAMYRESVAGTDANTLYIIYRDYTWAAWAYTGY +Patr-B0101,YYTMYRENMASTDENIAYWTYGYYTWAERAYTWY +Patr-B0102,YYTMYRENMASTDENIAYWTYGYYTWAERAYTWY +Patr-B0201,YYSEYREISTNTYESNLYIRYEYYTWAWLAYTWY +Patr-B0203,YYSEYREISTNTYESNLYIRYEYYTWAWLAYTWY +Patr-B0301,YDTMYRENVASTDENIAYWTFYYYTWAALAYTWY +Patr-B0302,YDTMYRENVASTDENIAYWTFYYYTWAALAYTWY +Patr-B0401,YYTKYREISTNTYVGNLYWTFRYYTWAVLAYTWY +Patr-B0402,YYTKYREISTNTYVGNLYWTFRYYTWAVLAYTWY +Patr-B0501,YYSEYREISTNTYESNLYIRYEYYTWAWLAYTWY +Patr-B0502,YYSEYREISTNTYESNLYIRYEYYTWARLAYTWY +Patr-B0601,YYSMYRENVASTDGSNLYWTYDYYTWAVWAYLWY +Patr-B0701,YLTMYRENVASTYENIAYLTYRFYTWAVHAYLWY +Patr-B0702,YLTMYRENVAFTYENIAYITFRYYTWAVHAYLWY +Patr-B0801,YYAMYREISTNTYVGNLYWTYRFYTWAWLAYTWY +Patr-B0802,YYAMYREISTNTYVGNLYWTYRFYTWAWLAYTWY +Patr-B0901,YYTMYRENMASTDENIAYIRYYYYTWAARAYTWY +Patr-B1001,YYTMYRENMASTDENIAYWTYGYYTWAERAYTWY +Patr-B1101,YYSEYRNIYAQTDVGNLYWTYDYYTWAERAYLWY +Patr-B1102,YYSEYRNIYAQTDVGNLYWTYDYYTWAVWAYLWY +Patr-B1202,YYSEYRNICAQTDGSNLYLRYYDYTWAVHAYLWY +Patr-B1301,YYSEYRNIYAQTDVSNLYLSYEYYTWAVRAYTWY +Patr-B1401,YYAMYRNGITQTDENTLYLSYDYYTWAVLAYTWY +Patr-B1601,YYTKYREISTNTDVSNLYWTFRYYTWAVLAYTWY +Patr-B1602,YYTKYREISTNTDESNLYWTFRYYTWAVLAYTWY +Patr-B1701,YYSVYREIFTNTDVSNLYLTYYYYSFAALAYTWY +Patr-B1702,YYSVYREIFTNTDGSNLYLTYYYYSFAALAYTWY +Patr-B1703,YFTVYRQISTNTDGSNLYLTYYYYSFAALAYTWY +Patr-B1801,YFTMYRENVASTDENIAYIRYYSYTWAERAYTWY +Patr-B1901,YYSEYRNIYAQTDENIAYLTYYDYTWAELAYTWY +Patr-B2001,YYTMYRENVASTDENIAYWTYGFYTWAVLAYTWY +Patr-B2101,YYTMYRQISTNTYESNLYITYRFYTWAWLAYLWY +Patr-B2201,YYTKYREISTNTYESNLYLTFDYYTWAALAYEWY +Patr-B2202,YYTKYREISTNTYENIAYLTFDYYTWAALAYEWY +Patr-B2301,YYSEYREISTNTYENIAYLTYRFYTWAWWAYTWY +Patr-B2302,YYSEYREISTNTYENIAYLTYRFYTWAWLAYLWY +Patr-B2303,YYSEYREISTNTYENTLYLTYRYYTWAWLAYLWY +Patr-B2401,YYTKYREISTNTDENTLYWTFRFYTWAVRAYTWY +Patr-B2402,YYTKYREISTNTDENTLYWTFRYYTWAVRAYTWY +Patr-B2501,YLAMYRENMAFTYENIAYLTYRFYTWAERAYLWY +Patr-B2601,YYTMYRENVAFTDENTLYLTYEFYTWAEHAYLGY +Patr-B2701,YYTMYRENVASTDGSNLYLTYYYYTWAVWAYLWY +Patr-B2801,YYTEYRNIFAQTDVGNLYWTYYHYTWAARAYTWY +Patr-B2901,YYAMYGNGVTQTDESNLYWTYGYYTWAVLAYTWY +Patr-B3001,YYTKYREISTNTYENIAYIRYDYYTWAWHAYEWY +Patr-B3501,YYAMYRNIYAQTDESNLYIRYEYYTWAWLAYTWY +Patr-B3601,YYAMYRNGVAQTDENIAYIRYEYYTWAWLAYTWY +Patr-B3701,YYAMYRNGVAQTDENIAYIRYYYYTWAARAYTWY +Patr-C0201,YDSGYREKYRQADVSNLYLWYGSYTWAELAYKSY +Patr-C0202,YDSGYREKYRQADVSNLYLWYGSYTWAELAYKWY +Patr-C0203,YDSGYREKYRQADVNKLYLRSGYYTWAELAYKWY +Patr-C0204,YDSGYREKYRQADVSNLYLRSGSYTWAELAYKWY +Patr-C0205,YDSGYREKYRQADVSNLYLRSGSYTWAELAYKWY +Patr-C0206,YDSGYREKYRQADVSNLYLWYGSYTWAELAYKWY +Patr-C0301,YYAGYREKYRQADVNKLYLSYGYYTWAERAYLWY +Patr-C0302,YYAGYREKYRQADVNKLYLSYELYTWAERAYLWY +Patr-C0303,YYAGYREKYRQADVNKLYLSYELYTWAERAYLWY +Patr-C0304,YYAGYREKYRQADVSNLYLKYEFYTWAERAYLWY +Patr-C0401,YYAGYREKYRQADVNKLYLKYEFYTWAALAYLWY +Patr-C0501,YYAGYREKYRQADVSNLYLWYDYYTLAALAYTWY +Patr-C0502,YYAGYREKYRQADVSNLYLSYDYYTLAALAYTWY +Patr-C0601,YYAGYREKYRQADVSNLYLSYDYYTLAALAYLWY +Patr-C0701,YYAGYREKYRQADVSNLYLSYDYYTWAAHAYLWY +Patr-C0801,YYAGYREKYRQADVSNLYLSYDYYTLAALAYLWY +Patr-C0901,YYAGYREKYRQADVNKLYLKYEFYTLAAWAYLWY +Patr-C0902,YYAGYRENYRQADVNKLYLKYEFYTLAAWAYLWY +Patr-C0903,YYAGYRENYRQADVNKLYLKYEFYTLAAWAYLWY +Patr-C0904,YYAGYREIYRQADVNKLYLKYEFYTLAAWAYLWY +Patr-C0905,YYAGYRQIYRQADVNKLYLKYEFYTLAALAYTWY +Patr-C1001,YDSGYRQIYRQADVNKLYIRFSSYTWAALAYTWH +Patr-C1101,YYAGYREKYRQADVSNLYLSYDYYTLAARAYLWY +Patr-C1201,YYAGYREKYRQADVNKLYLSYDYYTLAALAYLWY +Patr-C1301,YDSGYQEKYRQADVNKLYLRSEFYTWAALAYLWY +Patr-C1302,YDSGYQEKYRQADVNKLYLRSEFYTWAALAYLWY +Patr-C1501,YYAGYREKYRQADVSNLYLWYDYYTLAALAYLWY +Patr-C1601,YYAGYREKYRQADVSNLYLWYDYYTWAERAYLWY +SLA-1-CHANGDA,YSAMYRNNVGSINVNTLCLWYDFYPWAAWSYTSY +SLA-1-HB01,YYAMYREIQDTTYGNTLYLSYSDYTWAVESYLSY +SLA-1-HB02,YYAMYREIQDTTYGTTLYLSYSDYTWAVESYLSY +SLA-1-HB03,YYAMYREIQDTTYGTTLYLSYSDYTWAVESYLSY +SLA-1-HB04,YYAMYREIQDTTYGNTLYLSYSDYTWAVESYLSY +SLA-1-LWH,YYEMYRERVEETFVNTAYLRYRDYSWAEMSYLGY +SLA-1-TPK,HYIMYREISETTYVSNLYYNYSYYSWAAWSYRWY +SLA-1-YC,YSAMYEEKVDNTYVNTLYLSFRDYTWAAMSYLSY +SLA-1-YDL01,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY +SLA-1-YTH,YSAMYEEKVDTTYVNTLYLSSHYYSWAVRSYLSY +SLA-10101,YYAMYREKQDTTYVGNLYYSYRYYTWAVRSYLSY +SLA-10201,YYAMYEEKVDNTLVGTLYLSFRDYSWAEMSYRGY +SLA-10202,YYAMYEEKVDNTLVGTLYLSFRDYSWAEMSYRGY +SLA-10401,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY +SLA-10501,YSAMYREKQDTTFVNTAYLSYSDYTWAVMSYLSY +SLA-10601,YYAMYEEKVDNTYVGTLYLSYRDYSRAAESYLSY +SLA-10701,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY +SLA-10702,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY +SLA-10801,YYIMYREISETTYVGTLYLRYRDYSWAEMSYLGY +SLA-11101,YSEMYRERVGNTFGSNLYLWYSFYSWAARSYTWY +SLA-11201,YYEMYEEKVETINVDTLYLSFRDYTWAEWSYLSY +SLA-11301,YYAMYEEKVDNTYVGTLYLSFRDYTWAVRSYLSY +SLA-1:0101,YYAMYREKQDTTYVGNLYYSYRYYTWAVRSYLSY +SLA-1:0201,YYAMYEEKVDNTLVGTLYLSFRDYSWAEMSYRGY +SLA-1:0202,YYAMYEEKVDNTLVGTLYLSFRDYSWAEMSYRGY +SLA-1:0401,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY +SLA-1:0501,YSAMYREKQDTTFVNTAYLSYSDYTWAVMSYLSY +SLA-1:0601,YYAMYEEKVDNTYVGTLYLSYRDYSRAAESYLSY +SLA-1:0701,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY +SLA-1:0702,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY +SLA-1:0801,YYIMYREISETTYVGTLYLRYRDYSWAEMSYLGY +SLA-1:1101,YSEMYRERVGNTFGSNLYLWYSFYSWAARSYTWY +SLA-1:1201,YYEMYEEKVETINVDTLYLSFRDYTWAEWSYLSY +SLA-1:1301,YYAMYEEKVDNTYVGTLYLSFRDYTWAVRSYLSY +SLA-1:es11,YSAMYRNNVGSINVNTLYLWYDFYSWAAWSYTSY +SLA-2-YDL02,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY +SLA-20101,YSAMYRENVGSTDVNTLYISYSDYTWAVMSYLGY +SLA-20102,YSAMYRENVGSTDVNTLYISYRDYTWAVESYTWY +SLA-20201,YYTEYREISETTYVNTLYLRYSFYSFAVESYLGY +SLA-20202,YYTEYREISETTYVNTLYLRYSFYSFAVESYLGY +SLA-20301,YYAMYREIQDTTYVDTLYLSYRFYSWAAESYRWY +SLA-20302,YYAMYREIQDTTYVDTLYLRYHDYSWAVLSYRSY +SLA-20401,YDEMYRNNAGNIYGNTAYIIYSDYTWAERSYTWY +SLA-20401,YDEMYRNNAGNIYGNTAYIIYSDYTWAERSYTWY +SLA-20402,YDEMYRNNAGNIYGNTAYLIYSDYTWAVWSYTWY +SLA-20501,YYAMYEENAGSTFVNTAYFWYSYYTWAVRSYLWY +SLA-20502,YYAMYRNNARSTFVNTAYFSYRYYTWAVESYLSY +SLA-20601,YHTKYREISDYRYVGTLYYRYDFYTWAAESYTWY +SLA-20701,YSAMYRENVGSTDVSNLYLVYRFYSFAVESYLGY +SLA-21001,YYIMYREISDNINVNTLYLRYDDYSRAEMSYRWY +SLA-21002,YYIMYREISETNYVDTLYLRYRDYTWAVESYRWY +SLA-21201,YYAMYRENVGSTDVNTLYFWYSFYSWAVWSYLSY +SLA-2:0101,YSAMYRENVGSTDVNTLYISYSDYTWAVMSYLGY +SLA-2:0102,YSAMYRENVGSTDVNTLYISYRDYTWAVESYTWY +SLA-2:0201,YYTEYREISETTYVNTLYLRYSFYSFAVESYLGY +SLA-2:0202,YYTEYREISETTYVNTLYLRYSFYSFAVESYLGY +SLA-2:0301,YYAMYREIQDTTYVDTLYLSYRFYSWAAESYRWY +SLA-2:0302,YYAMYREIQDTTYVDTLYLRYHDYSWAVLSYRSY +SLA-2:0401,YDEMYRNNAGNIYGNTAYIIYSDYTWAERSYTWY +SLA-2:0402,YDEMYRNNAGNIYGNTAYLIYSDYTWAVWSYTWY +SLA-2:0501,YYAMYEENAGSTFVNTAYFWYSYYTWAVRSYLWY +SLA-2:0502,YYAMYRNNARSTFVNTAYFSYRYYTWAVESYLSY +SLA-2:0601,YHTKYREISDYRYVGTLYYRYDFYTWAAESYTWY +SLA-2:0701,YSAMYRENVGSTDVSNLYLVYRFYSFAVESYLGY +SLA-2:1001,YYIMYREISDNINVNTLYLRYDDYSRAEMSYRWY +SLA-2:1002,YYIMYREISETNYVDTLYLRYRDYTWAVESYRWY +SLA-2:1101,YYAEYRNIYETIYGNTAYFSYSFYTWAARSYLSY +SLA-2:1201,YYAMYRENVGSTDVNTLYFWYSFYSWAVWSYLSY +SLA-2:CDY.AA,YYAMYREIQDNTFVNTAYFSYSYYTWAEWSYLGY +SLA-2:HB01,YYIMYREISETNYVDTLYIRYRDYTWVEESYRWY +SLA-2:LWH.AA,YYTMYREKVETTYVGTLYISFHDYTWAAWSYLGY +SLA-2:TPK.AA,YYTEYRNIYETIYVGNLYFSYSDYTRAAWSYTGY +SLA-2:YC.AA,YYAMYEEKVGSTFVNTAYFWYSYYSWAVESYLSY +SLA-2:YDL.AA,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY +SLA-2:YDY.AA,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY +SLA-2:YTH.AA,YSSEYEEKAGSTFVGNLCLSYHDYSRAVWSYLSC +SLA-2:es22,YYAMYREIQDNTFVNTAYFSYSYYTWAEWSYLGY +SLA-3-CDY,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY +SLA-3-HB01,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY +SLA-3-LWH,YYAMYREIQDTTYGNTLYLSYSDYTWAVESYLSY +SLA-3-TPK,YDEMYREIGDNTYVNNLYLSYSFYTRAAMSYAGY +SLA-3-YC,YDEMYEENAGSTFVNTLYLSYSDYTKAAMSYAWY +SLA-3-YDL,YDEMYREIGDNTYVNNLYLSYSFYTRAAMSYAGY +SLA-3-YDY01,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY +SLA-3-YDY02,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY +SLA-3-YTH,YDSMYEENAGSTFVNNLYLSYSDYTRAAMSYAWY +SLA-30101,YDSMYEENAGSTFVNNLYFSYSFYTRAAMSYAWY +SLA-30301,YDSMYEENAGSTFVNNLYLSYHDYAWAVWSYAWY +SLA-30302,YDSMYRENSDNRYVNNLYIRYHDYSWAAWSYAGY +SLA-30303,YDSMYEENAGSTFVNNLYLSYHDYAWAVWSYAWY +SLA-30304,YDSMYEENAGSTFVNNLYLSYHDYAWAAWSYAWY +SLA-30401,YDEMYKENAGSTFVNNLYLSYSDYTRAAMSYAWY +SLA-30401,YDEMYKENAGSTFVNNLYLSYSDYTRAAMSYAWY +SLA-30402,YDEMYEENAGSTFVNKLYLSYSDYTRDAMSYAWY +SLA-30501,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY +SLA-30502,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY +SLA-30503,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY +SLA-30601,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY +SLA-30602,YDSMYEENAGSTFVNNLYYWYSDYTRAAMSYAWY +SLA-3:0101,YDSMYEENAGSTFVNNLYFSYSFYTRAAMSYAWY +SLA-3:0301,YDSMYEENAGSTFVNNLYLSYHDYAWAVWSYAWY +SLA-3:0302,YDSMYRENSDNRYVNNLYIRYHDYSWAAWSYAGY +SLA-3:0303,YDSMYEENAGSTFVNNLYLSYHDYAWAVWSYAWY +SLA-3:0304,YDSMYEENAGSTFVNNLYLSYHDYAWAAWSYAWY +SLA-3:0401,YDEMYKENAGSTFVNNLYLSYSDYTRAAMSYAWY +SLA-3:0501,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY +SLA-3:0502,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY +SLA-3:0503,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY +SLA-3:0601,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY +SLA-3:0602,YDSMYEENAGSTFVNNLYYWYSDYTRAAMSYAWY +SLA-3:0701,YDSMYEENAGSTFVNNLYLSYSDYTRAAMSYAWY +SLA-6:0101,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWY +SLA-6:0102,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWY +SLA-6:0103,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWY +SLA-6:0104,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWY +SLA-6:0105,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWY diff --git a/downloads-generation/allele_sequences/filter_sequences.py b/downloads-generation/allele_sequences/filter_sequences.py new file mode 100644 index 0000000000000000000000000000000000000000..2d92a0b9747d6e40aaa9364ae429dc440d014651 --- /dev/null +++ b/downloads-generation/allele_sequences/filter_sequences.py @@ -0,0 +1,98 @@ +""" +Filter and combine class I sequence fastas. +""" +from __future__ import print_function + +import sys +import argparse + +import mhcnames + +import Bio.SeqIO # pylint: disable=import-error + + +def normalize(s, disallowed=["MIC", "HFE"]): + if any(item in s for item in disallowed): + return None + try: + return mhcnames.normalize_allele_name(s) + except: + while s: + s = ":".join(s.split(":")[:-1]) + try: + return mhcnames.normalize_allele_name(s) + except: + pass + return None + + +parser = argparse.ArgumentParser(usage=__doc__) + +parser.add_argument( + "fastas", + nargs="+", + help="Unaligned fastas") + +parser.add_argument( + "--out", + required=True, + help="Fasta output") + +class_ii_names = { + "DRA", + "DRB", + "DPA", + "DPB", + "DQA", + "DQB", + "DMA", + "DMB", + "DOA", + "DOB", +} + + +def run(): + args = parser.parse_args(sys.argv[1:]) + print(args) + + records = [] + total = 0 + seen = set() + for fasta in args.fastas: + reader = Bio.SeqIO.parse(fasta, "fasta") + for record in reader: + total += 1 + name = record.description.split()[1] + normalized = normalize(name) + if not normalized and "," in record.description: + # Try parsing uniprot-style sequence description + if "MOUSE MHC class I L-q alpha-chain" in record.description: + # Special case. + name = "H2-Lq" + else: + name = ( + record.description.split()[1].replace("-", "") + + "-" + + record.description.split(",")[-1].split()[0].replace("-","")) + normalized = normalize(name) + if not normalized: + print("Couldn't parse: ", name) + continue + if normalized in seen: + continue + if any(n in name for n in class_ii_names): + print("Dropping", name) + continue + seen.add(normalized) + record.description = normalized + " " + record.description + records.append(record) + + with open(args.out, "w") as fd: + Bio.SeqIO.write(records, fd, "fasta") + + print("Wrote %d / %d sequences: %s" % (len(records), total, args.out)) + + +if __name__ == '__main__': + run() diff --git a/downloads-generation/allele_sequences/make_allele_sequences.py b/downloads-generation/allele_sequences/make_allele_sequences.py new file mode 100644 index 0000000000000000000000000000000000000000..d984dd34af3bb56d836b2e1a1c968cad9ff492a1 --- /dev/null +++ b/downloads-generation/allele_sequences/make_allele_sequences.py @@ -0,0 +1,179 @@ +""" +Generate allele sequences for pan-class I models. + +Additional dependency: biopython +""" +from __future__ import print_function + +import sys +import argparse + +import numpy +import pandas + +import mhcnames + +import Bio.SeqIO # pylint: disable=import-error + + +def normalize_simple(s): + return mhcnames.normalize_allele_name(s) + + +def normalize_complex(s, disallowed=["MIC", "HFE"]): + if any(item in s for item in disallowed): + return None + try: + return normalize_simple(s) + except: + while s: + s = ":".join(s.split(":")[:-1]) + try: + return normalize_simple(s) + except: + pass + return None + + +parser = argparse.ArgumentParser(usage=__doc__) + +parser.add_argument( + "aligned_fasta", + help="Aligned sequences") + +parser.add_argument( + "--recapitulate-sequences", + required=True, + help="CSV giving sequences to recapitulate") + +parser.add_argument( + "--differentiate-alleles", + help="File listing alleles to differentiate using additional positions") + +parser.add_argument( + "--out-csv", + help="Result file") + + +def run(): + args = parser.parse_args(sys.argv[1:]) + print(args) + + allele_to_sequence = {} + reader = Bio.SeqIO.parse(args.aligned_fasta, "fasta") + for record in reader: + name = record.description.split()[1] + print(record.name, record.description) + allele_to_sequence[name] = str(record.seq) + + print("Read %d aligned sequences" % len(allele_to_sequence)) + + allele_sequences = pandas.Series(allele_to_sequence).to_frame() + allele_sequences.columns = ['aligned'] + allele_sequences['aligned'] = allele_sequences['aligned'].str.replace( + "-", "X") + + allele_sequences['normalized_allele'] = allele_sequences.index.map(normalize_complex) + allele_sequences = allele_sequences.set_index("normalized_allele", drop=True) + + selected_positions = [] + + recapitulate_df = pandas.read_csv(args.recapitulate_sequences) + recapitulate_df["normalized_allele"] = recapitulate_df.allele.map( + normalize_complex) + recapitulate_df = ( + recapitulate_df + .dropna() + .drop_duplicates("normalized_allele") + .set_index("normalized_allele", drop=True)) + + allele_sequences["recapitulate_target"] = recapitulate_df.iloc[:,-1] + + print("Sequences in recapitulate CSV that are not in aligned fasta:") + print(recapitulate_df.index[ + ~recapitulate_df.index.isin(allele_sequences.index) + ].tolist()) + + allele_sequences_with_target = allele_sequences.loc[ + ~allele_sequences.recapitulate_target.isnull() + ] + + position_identities = [] + target_length = int( + allele_sequences_with_target.recapitulate_target.str.len().max()) + for i in range(target_length): + series_i = allele_sequences_with_target.recapitulate_target.str.get(i) + row = [] + full_length_sequence_length = int( + allele_sequences_with_target.aligned.str.len().max()) + for k in range(full_length_sequence_length): + series_k = allele_sequences_with_target.aligned.str.get(k) + row.append((series_i == series_k).mean()) + position_identities.append(row) + + position_identities = pandas.DataFrame(numpy.array(position_identities)) + selected_positions = position_identities.idxmax(1).tolist() + fractions = position_identities.max(1) + print("Selected positions: ", *selected_positions) + print("Lowest concordance fraction: %0.5f" % fractions.min()) + assert fractions.min() > 0.99 + + allele_sequences["recapitulated"] = allele_sequences.aligned.map( + lambda s: "".join(s[p] for p in selected_positions)) + + allele_sequences_with_target = allele_sequences.loc[ + ~allele_sequences.recapitulate_target.isnull() + ] + + agreement = ( + allele_sequences_with_target.recapitulated == + allele_sequences_with_target.recapitulate_target).mean() + + print("Overall agreement: %0.5f" % agreement) + assert agreement > 0.9 + + # Add additional positions + if args.differentiate_alleles: + differentiate_alleles = pandas.read_csv( + args.differentiate_alleles).iloc[:,0].values + print( + "Read %d alleles to differentiate:" % len(differentiate_alleles), + differentiate_alleles) + + allele_sequences_to_differentiate = allele_sequences.loc[ + allele_sequences.index.isin(differentiate_alleles) + ] + print(allele_sequences_to_differentiate.shape) + + additional_positions = [] + for (_, sub_df) in allele_sequences_to_differentiate.groupby("recapitulated"): + if sub_df.aligned.nunique() > 1: + differing = pandas.DataFrame( + dict([(pos, chars) for (pos, chars) in + enumerate(zip(*sub_df.aligned.values)) if + any(c != chars[0] for c in chars) and "X" not in chars])).T + print(sub_df) + print(differing) + print() + additional_positions.extend(differing.index) + + additional_positions = sorted(set(additional_positions)) + print( + "Selected %d additional positions: " % len(additional_positions), + additional_positions) + + extended_selected_positions = sorted( + set(selected_positions).union(set(additional_positions))) + print( + "Extended selected positions (%d)" % len(extended_selected_positions), + *extended_selected_positions) + + allele_sequences["sequence"] = allele_sequences.aligned.map( + lambda s: "".join(s[p] for p in extended_selected_positions)) + + allele_sequences[["sequence"]].to_csv(args.out_csv, index=True) + print("Wrote: %s" % args.out_csv) + + +if __name__ == '__main__': + run() diff --git a/downloads-generation/data_curated/GENERATE.sh b/downloads-generation/data_curated/GENERATE.sh index e2ba91875a7c6c645cf7a7c4c1264cfccfa47cd6..30a17bd016126ddf992c28ed0d39216c1ebfb520 100755 --- a/downloads-generation/data_curated/GENERATE.sh +++ b/downloads-generation/data_curated/GENERATE.sh @@ -46,8 +46,6 @@ time python curate.py \ "$(mhcflurry-downloads path data_published)/bdata.20130222.mhci.public.1.txt" \ --data-systemhc-atlas \ "$(mhcflurry-downloads path data_systemhcatlas)/data.csv.bz2" \ - --data-abelin-mass-spec \ - "$(mhcflurry-downloads path data_published)/abelin2017.hits.csv.bz2" \ --include-iedb-mass-spec \ --out-csv curated_training_data.with_mass_spec.csv diff --git a/downloads-generation/data_curated/curate.py b/downloads-generation/data_curated/curate.py index bb35f489a66f258e1f201961fc37bd09fc388310..08994ee36ed1040faa3e76acb3009e380572418c 100755 --- a/downloads-generation/data_curated/curate.py +++ b/downloads-generation/data_curated/curate.py @@ -34,11 +34,6 @@ parser.add_argument( action="append", default=[], help="Path to systemhc-atlas-style mass-spec data") -parser.add_argument( - "--data-abelin-mass-spec", - action="append", - default=[], - help="Path to Abelin Immunity 2017 mass-spec hits") parser.add_argument( "--include-iedb-mass-spec", action="store_true", @@ -85,8 +80,8 @@ def load_data_kim2014(filename): df["peptide"] = df.sequence df["allele"] = df.mhc.map(normalize_allele_name) print("Dropping un-parseable alleles: %s" % ", ".join( - df.ix[df.allele == "UNKNOWN"]["mhc"].unique())) - df = df.ix[df.allele != "UNKNOWN"] + df.loc[df.allele == "UNKNOWN"]["mhc"].unique())) + df = df.loc[df.allele != "UNKNOWN"] print("Loaded kim2014 data: %s" % str(df.shape)) return df @@ -105,7 +100,7 @@ def load_data_systemhc_atlas(filename, min_probability=0.99): df["allele"] = df.top_allele.map(normalize_allele_name) print("Dropping un-parseable alleles: %s" % ", ".join( - str(x) for x in df.ix[df.allele == "UNKNOWN"]["top_allele"].unique())) + str(x) for x in df.loc[df.allele == "UNKNOWN"]["top_allele"].unique())) df = df.loc[df.allele != "UNKNOWN"] print("Systemhc atlas data now: %s" % str(df.shape)) @@ -120,65 +115,44 @@ def load_data_systemhc_atlas(filename, min_probability=0.99): return df -def load_data_abelin_mass_spec(filename): - df = pandas.read_csv(filename) - print("Loaded Abelin mass-spec data: %s" % str(df.shape)) - - df["measurement_source"] = "abelin-mass-spec" - df["measurement_value"] = QUALITATIVE_TO_AFFINITY["Positive"] - df["measurement_inequality"] = "<" - df["measurement_type"] = "qualitative" - df["original_allele"] = df.allele - df["allele"] = df.original_allele.map(normalize_allele_name) - - print("Dropping un-parseable alleles: %s" % ", ".join( - str(x) for x in df.ix[df.allele == "UNKNOWN"]["allele"].unique())) - df = df.loc[df.allele != "UNKNOWN"] - print("Abelin mass-spec data now: %s" % str(df.shape)) - - print("Removing duplicates") - df = df.drop_duplicates(["allele", "peptide"]) - print("Abelin mass-spec data now: %s" % str(df.shape)) - - return df - - def load_data_iedb(iedb_csv, include_qualitative=True, include_mass_spec=False): iedb_df = pandas.read_csv(iedb_csv, skiprows=1, low_memory=False) print("Loaded iedb data: %s" % str(iedb_df.shape)) print("Selecting only class I") - iedb_df = iedb_df.ix[ + iedb_df = iedb_df.loc[ iedb_df["MHC allele class"].str.strip().str.upper() == "I" ] print("New shape: %s" % str(iedb_df.shape)) print("Dropping known unusuable alleles") - iedb_df = iedb_df.ix[ + iedb_df = iedb_df.loc[ ~iedb_df["Allele Name"].isin(EXCLUDE_IEDB_ALLELES) ] - iedb_df = iedb_df.ix[ + iedb_df = iedb_df.loc[ (~iedb_df["Allele Name"].str.contains("mutant")) & (~iedb_df["Allele Name"].str.contains("CD1")) ] iedb_df["allele"] = iedb_df["Allele Name"].map(normalize_allele_name) print("Dropping un-parseable alleles: %s" % ", ".join( - iedb_df.ix[iedb_df.allele == "UNKNOWN"]["Allele Name"].unique())) - iedb_df = iedb_df.ix[iedb_df.allele != "UNKNOWN"] + iedb_df.loc[iedb_df.allele == "UNKNOWN"]["Allele Name"].unique())) + iedb_df = iedb_df.loc[iedb_df.allele != "UNKNOWN"] print("IEDB measurements per allele:\n%s" % iedb_df.allele.value_counts()) - quantitative = iedb_df.ix[iedb_df["Units"] == "nM"].copy() + quantitative = iedb_df.loc[iedb_df["Units"] == "nM"].copy() quantitative["measurement_type"] = "quantitative" - quantitative["measurement_inequality"] = "=" + quantitative["measurement_inequality"] = quantitative[ + "Measurement Inequality" + ].fillna("=").map(lambda s: {">=": ">", "<=": "<"}.get(s, s)) print("Quantitative measurements: %d" % len(quantitative)) - qualitative = iedb_df.ix[iedb_df["Units"] != "nM"].copy() + qualitative = iedb_df.loc[iedb_df["Units"].isnull()].copy() qualitative["measurement_type"] = "qualitative" print("Qualitative measurements: %d" % len(qualitative)) if not include_mass_spec: - qualitative = qualitative.ix[ + qualitative = qualitative.loc[ (~qualitative["Method/Technique"].str.contains("mass spec")) ].copy() @@ -200,7 +174,7 @@ def load_data_iedb(iedb_csv, include_qualitative=True, include_mass_spec=False): print("Subselecting to valid peptides. Starting with: %d" % len(iedb_df)) iedb_df["Description"] = iedb_df.Description.str.strip() - iedb_df = iedb_df.ix[ + iedb_df = iedb_df.loc[ iedb_df.Description.str.match("^[ACDEFGHIKLMNPQRSTVWY]+$") ] print("Now: %d" % len(iedb_df)) @@ -248,7 +222,7 @@ def run(): iedb_df = dfs[0] iedb_df["allele_peptide"] = iedb_df.allele + "_" + iedb_df.peptide print("Dropping kim2014 data present in IEDB.") - df = df.ix[ + df = df.loc[ ~df.allele_peptide.isin(iedb_df.allele_peptide) ] print("Kim2014 data now: %s" % str(df.shape)) @@ -256,9 +230,6 @@ def run(): for filename in args.data_systemhc_atlas: df = load_data_systemhc_atlas(filename) dfs.append(df) - for filename in args.data_abelin_mass_spec: - df = load_data_abelin_mass_spec(filename) - dfs.append(df) df = pandas.concat(dfs, ignore_index=True) print("Combined df: %s" % (str(df.shape))) diff --git a/downloads-generation/data_iedb/GENERATE.sh b/downloads-generation/data_iedb/GENERATE.sh index a6067a36eb10c18ad1b26a17edb38f656dd106ae..7165476b6337a4517f94fac3defbdf56f3211cbe 100755 --- a/downloads-generation/data_iedb/GENERATE.sh +++ b/downloads-generation/data_iedb/GENERATE.sh @@ -22,11 +22,17 @@ date cd $SCRATCH_DIR/$DOWNLOAD_NAME -wget --quiet http://www.iedb.org/doc/mhc_ligand_full.zip +wget -q http://www.iedb.org/doc/mhc_ligand_full.zip +wget -q http://www.iedb.org/downloader.php?file_name=doc/tcell_full_v3.zip -O tcell_full_v3.zip + unzip mhc_ligand_full.zip rm mhc_ligand_full.zip bzip2 mhc_ligand_full.csv +unzip tcell_full_v3.zip +rm tcell_full_v3.zip +bzip2 tcell_full_v3.csv + cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * diff --git a/downloads-generation/data_published/GENERATE.sh b/downloads-generation/data_published/GENERATE.sh index 916a901e160340f03f2039a640c44bf2460bff55..ba90457a126e9ca44770317c81a7c2366a3edb15 100755 --- a/downloads-generation/data_published/GENERATE.sh +++ b/downloads-generation/data_published/GENERATE.sh @@ -1,6 +1,7 @@ #!/bin/bash # -# Download some published MHC I ligand data +# Download published non-IEDB MHC I ligand data. Most data has made its way into +# IEDB but not all. Here we gather up the rest. # # set -e @@ -9,6 +10,7 @@ set -x DOWNLOAD_NAME=data_published SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" +SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" @@ -26,13 +28,10 @@ git status cd $SCRATCH_DIR/$DOWNLOAD_NAME -# Download kim2014 data -wget --quiet https://github.com/openvax/mhcflurry/releases/download/pre-1.1/bdata.2009.mhci.public.1.txt -wget --quiet https://github.com/openvax/mhcflurry/releases/download/pre-1.1/bdata.20130222.mhci.public.1.txt -wget --quiet https://github.com/openvax/mhcflurry/releases/download/pre-1.1/bdata.2013.mhci.public.blind.1.txt - -# Download abelin et al 2017 data -wget --quiet https://github.com/openvax/mhcflurry/releases/download/pre-1.1/abelin2017.hits.csv.bz2 +# Kim et al 2014 [PMID 25017736] +wget -q https://github.com/openvax/mhcflurry/releases/download/pre-1.1/bdata.2009.mhci.public.1.txt +wget -q https://github.com/openvax/mhcflurry/releases/download/pre-1.1/bdata.20130222.mhci.public.1.txt +wget -q https://github.com/openvax/mhcflurry/releases/download/pre-1.1/bdata.2013.mhci.public.blind.1.txt cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt diff --git a/downloads-generation/data_systemhcatlas/GENERATE.sh b/downloads-generation/data_systemhcatlas/GENERATE.sh index 1558409c2b981591681ae726a641e51283935ad9..d9a891eaf8398c2605acbbceb7352f36db400987 100755 --- a/downloads-generation/data_systemhcatlas/GENERATE.sh +++ b/downloads-generation/data_systemhcatlas/GENERATE.sh @@ -26,9 +26,22 @@ git status cd $SCRATCH_DIR/$DOWNLOAD_NAME -wget --quiet https://github.com/openvax/mhcflurry/releases/download/pre-1.1/systemhc.20171121.combined.csv.bz2 - -mv systemhc.20171121.combined.csv.bz2 data.csv.bz2 +wget -q https://systemhcatlas.org/Builds_for_download/180409_master_final.tgz +mkdir extracted +tar -xvzf *.tgz -C extracted +wc -l extracted/*/*.csv + +# Write header line +cat extracted/*/*.csv | head -n 1 > data.csv + +# Write concatenated data +grep -v SysteMHC_ID extracted/*/*.csv >> data.csv + +# Cleanup +rm -rf extracted *.tgz +ls -lh data.csv +wc -l data.csv +bzip2 data.csv cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt diff --git a/downloads-generation/data_systemhcatlas/README.md b/downloads-generation/data_systemhcatlas/README.md index 5e66d9af8c400d8cceeaa4762bbb43bbea0493f8..dc5119b84bed013a0b0675711b00e650c6f60bc6 100644 --- a/downloads-generation/data_systemhcatlas/README.md +++ b/downloads-generation/data_systemhcatlas/README.md @@ -1,10 +1,11 @@ # SysteMHC database dump -This is a data dump of the [SysteMHC Atlas](https://systemhcatlas.org/) provided -by personal communication. It is distributed under the ODC Open Database License. +This is a database export of the [SysteMHC Atlas](https://systemhcatlas.org/) +downloaded from [here](https://systemhcatlas.org/Builds_for_download/). It is +distributed under the ODC Open Database License. To generate this download run: ``` ./GENERATE.sh -``` \ No newline at end of file +``` diff --git a/downloads-generation/models_class1_pan/GENERATE.WITH_HPC_CLUSTER.sh b/downloads-generation/models_class1_pan/GENERATE.WITH_HPC_CLUSTER.sh new file mode 100755 index 0000000000000000000000000000000000000000..84e040cdd223494cbc39165b121ba06dc9d8a303 --- /dev/null +++ b/downloads-generation/models_class1_pan/GENERATE.WITH_HPC_CLUSTER.sh @@ -0,0 +1,88 @@ +#!/bin/bash +# +# Model select pan-allele MHCflurry Class I models and calibrate percentile ranks. +# +# Uses an HPC cluster (Mount Sinai chimera cluster, which uses lsf job +# scheduler). This would need to be modified for other sites. +# +set -e +set -x + +DOWNLOAD_NAME=models_class1_pan +SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation +SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" +SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") + +mkdir -p "$SCRATCH_DIR" +rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" +mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" + +# Send stdout and stderr to a logfile included with the archive. +exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") +exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) + +# Log some environment info +echo "Invocation: $0 $@" +date +pip freeze +git status + +cd $SCRATCH_DIR/$DOWNLOAD_NAME + +export OMP_NUM_THREADS=1 +export PYTHONUNBUFFERED=1 + +cp $SCRIPT_ABSOLUTE_PATH . + +GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 +echo "Detected GPUS: $GPUS" + +PROCESSORS=$(getconf _NPROCESSORS_ONLN) +echo "Detected processors: $PROCESSORS" + +if [ "$GPUS" -eq "0" ]; then + NUM_JOBS=${NUM_JOBS-1} +else + NUM_JOBS=${NUM_JOBS-$GPUS} +fi +echo "Num local jobs for model selection: $NUM_JOBS" + +UNSELECTED_PATH="$(mhcflurry-downloads path models_class1_pan_unselected)" + +for kind in with_mass_spec no_mass_spec +do + # Model selection is always done locally. It's fast enough that it + # doesn't make sense to put it on the cluster. + MODELS_DIR="$UNSELECTED_PATH/models.${kind}" + time mhcflurry-class1-select-pan-allele-models \ + --data "$MODELS_DIR/train_data.csv.bz2" \ + --models-dir "$MODELS_DIR" \ + --out-models-dir models.${kind} \ + --min-models 8 \ + --max-models 32 \ + --num-jobs $NUM_JOBS --max-tasks-per-worker 1 --gpus $GPUS --max-workers-per-gpu 1 + + # Percentile rank calibration is run on the cluster. + # For now we calibrate percentile ranks only for alleles for which there + # is training data. Calibrating all alleles would be too slow. + # This could be improved though. + time mhcflurry-calibrate-percentile-ranks \ + --models-dir models.${kind} \ + --match-amino-acid-distribution-data "$MODELS_DIR/train_data.csv.bz2" \ + --motif-summary \ + --num-peptides-per-length 1000000 \ + --allele $(bzcat "$MODELS_DIR/train_data.csv.bz2" | cut -f 1 -d , | grep -v allele | uniq | sort | uniq) \ + --verbosity 1 \ + --worker-log-dir "$SCRATCH_DIR/$DOWNLOAD_NAME" \ + --prediction-batch-size 524288 \ + --cluster-parallelism \ + --cluster-submit-command bsub \ + --cluster-results-workdir ~/mhcflurry-scratch \ + --cluster-script-prefix-path $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.lsf +done + +bzip2 LOG.txt +for i in $(ls LOG-worker.*.txt) ; do bzip2 $i ; done +RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" +tar -cjf "$RESULT" * +echo "Created archive: $RESULT" diff --git a/downloads-generation/models_class1_pan/GENERATE.sh b/downloads-generation/models_class1_pan/GENERATE.sh new file mode 100755 index 0000000000000000000000000000000000000000..216942dcb53c2bad47b17bcd8500daab226502fa --- /dev/null +++ b/downloads-generation/models_class1_pan/GENERATE.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# Model select pan-allele MHCflurry Class I models and calibrate percentile ranks. +# +set -e +set -x + +DOWNLOAD_NAME=models_class1_pan +SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation +SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" +SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") + +mkdir -p "$SCRATCH_DIR" +rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" +mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" + +# Send stdout and stderr to a logfile included with the archive. +exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") +exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) + +# Log some environment info +date +pip freeze +git status + +cd $SCRATCH_DIR/$DOWNLOAD_NAME + +cp $SCRIPT_ABSOLUTE_PATH . + +GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 +echo "Detected GPUS: $GPUS" + +PROCESSORS=$(getconf _NPROCESSORS_ONLN) +echo "Detected processors: $PROCESSORS" + +if [ "$GPUS" -eq "0" ]; then + NUM_JOBS=${NUM_JOBS-1} +else + NUM_JOBS=${NUM_JOBS-$GPUS} +fi +echo "Num jobs: $NUM_JOBS" + +export PYTHONUNBUFFERED=1 + +UNSELECTED_PATH="$(mhcflurry-downloads path models_class1_pan_unselected)" + +for kind in with_mass_spec no_mass_spec +do + MODELS_DIR="$UNSELECTED_PATH/models.${kind}" + time mhcflurry-class1-select-pan-allele-models \ + --data "$MODELS_DIR/train_data.csv.bz2" \ + --models-dir "$MODELS_DIR" \ + --out-models-dir models.${kind} \ + --min-models 8 \ + --max-models 32 \ + --num-jobs 0 \ + --num-jobs $NUM_JOBS --max-tasks-per-worker 1 --gpus $GPUS --max-workers-per-gpu 1 + + # For now we calibrate percentile ranks only for alleles for which there + # is training data. Calibrating all alleles would be too slow. + # This could be improved though. + time mhcflurry-calibrate-percentile-ranks \ + --models-dir models.${kind} \ + --match-amino-acid-distribution-data "$MODELS_DIR/train_data.csv.bz2" \ + --motif-summary \ + --num-peptides-per-length 1000000 \ + --allele $(bzcat "$MODELS_DIR/train_data.csv.bz2" | cut -f 1 -d , | grep -v allele | uniq | sort | uniq) \ + --verbosity 1 \ + --num-jobs $NUM_JOBS --max-tasks-per-worker 1 --gpus $GPUS --max-workers-per-gpu 1 +done + +bzip2 LOG.txt +for i in $(ls LOG-worker.*.txt) ; do bzip2 $i ; done +RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" +tar -cjf "$RESULT" * +echo "Created archive: $RESULT" diff --git a/downloads-generation/models_class1_pan/cluster_submit_script_header.mssm_hpc.lsf b/downloads-generation/models_class1_pan/cluster_submit_script_header.mssm_hpc.lsf new file mode 120000 index 0000000000000000000000000000000000000000..09aeb92dd5360f176c81b099917f0182d6c2575b --- /dev/null +++ b/downloads-generation/models_class1_pan/cluster_submit_script_header.mssm_hpc.lsf @@ -0,0 +1 @@ +../models_class1_pan_unselected/cluster_submit_script_header.mssm_hpc.lsf \ No newline at end of file diff --git a/downloads-generation/models_class1_pan_unselected/GENERATE.WITH_HPC_CLUSTER.sh b/downloads-generation/models_class1_pan_unselected/GENERATE.WITH_HPC_CLUSTER.sh new file mode 100755 index 0000000000000000000000000000000000000000..f3d651bdc28b27d29aae041e024e8495da911a07 --- /dev/null +++ b/downloads-generation/models_class1_pan_unselected/GENERATE.WITH_HPC_CLUSTER.sh @@ -0,0 +1,92 @@ +#!/bin/bash +# +# Train pan-allele MHCflurry Class I models. Supports re-starting a failed run. +# +# Uses an HPC cluster (Mount Sinai chimera cluster, which uses lsf job +# scheduler). This would need to be modified for other sites. +# +set -e +set -x + +DOWNLOAD_NAME=models_class1_pan_unselected +SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation +SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" +SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") + +mkdir -p "$SCRATCH_DIR" +if [ "$1" != "continue-incomplete" ] +then + echo "Fresh run" + rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" + mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" +else + echo "Continuing incomplete run" +fi + +# Send stdout and stderr to a logfile included with the archive. +LOG="$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.$(date +%s).txt" +exec > >(tee -ia "$LOG") +exec 2> >(tee -ia "$LOG" >&2) + +# Log some environment info +echo "Invocation: $0 $@" +date +pip freeze +git status + +cd $SCRATCH_DIR/$DOWNLOAD_NAME + +export OMP_NUM_THREADS=1 +export PYTHONUNBUFFERED=1 + +if [ "$1" != "continue-incomplete" ] +then + cp $SCRIPT_DIR/generate_hyperparameters.py . + python generate_hyperparameters.py > hyperparameters.yaml +fi + +for kind in with_mass_spec no_mass_spec +do + EXTRA_TRAIN_ARGS="" + if [ "$1" == "continue-incomplete" ] && [ -d "models.${kind}" ] + then + echo "Will continue existing run: $kind" + EXTRA_TRAIN_ARGS="--continue-incomplete" + fi + + mhcflurry-class1-train-pan-allele-models \ + --data "$(mhcflurry-downloads path data_curated)/curated_training_data.${kind}.csv.bz2" \ + --allele-sequences "$(mhcflurry-downloads path allele_sequences)/allele_sequences.csv" \ + --pretrain-data "$(mhcflurry-downloads path random_peptide_predictions)/predictions.csv.bz2" \ + --held-out-measurements-per-allele-fraction-and-max 0.25 100 \ + --ensemble-size 4 \ + --hyperparameters hyperparameters.yaml \ + --out-models-dir $(pwd)/models.${kind} \ + --worker-log-dir "$SCRATCH_DIR/$DOWNLOAD_NAME" \ + --verbosity 0 \ + --cluster-parallelism \ + --cluster-submit-command bsub \ + --cluster-results-workdir ~/mhcflurry-scratch \ + --cluster-script-prefix-path $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.lsf \ + $EXTRA_TRAIN_ARGS +done + +cp $SCRIPT_ABSOLUTE_PATH . +bzip2 -f "$LOG" +for i in $(ls LOG-worker.*.txt) ; do bzip2 -f $i ; done +RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" +tar -cjf "$RESULT" * +echo "Created archive: $RESULT" + +# Split into <2GB chunks for GitHub +PARTS="${RESULT}.part." +# Check for pre-existing part files and rename them. +for i in $(ls "${PARTS}"* ) +do + DEST="${i}.OLD.$(date +%s)" + echo "WARNING: already exists: $i . Moving to $DEST" + mv $i $DEST +done +split -b 2000M "$RESULT" "$PARTS" +echo "Split into parts:" +ls -lh "${PARTS}"* diff --git a/downloads-generation/models_class1_pan_unselected/GENERATE.sh b/downloads-generation/models_class1_pan_unselected/GENERATE.sh new file mode 100755 index 0000000000000000000000000000000000000000..73171a05821dae5f16b060894bec297446cdcf1d --- /dev/null +++ b/downloads-generation/models_class1_pan_unselected/GENERATE.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# +# Train pan-allele MHCflurry Class I models. Supports re-starting a failed run. +# +set -e +set -x + +DOWNLOAD_NAME=models_class1_pan_unselected +SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation +SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" +SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") + +mkdir -p "$SCRATCH_DIR" +if [ "$1" != "continue-incomplete" ] +then + echo "Fresh run" + rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" + mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" +else + echo "Continuing incomplete run" +fi + +# Send stdout and stderr to a logfile included with the archive. +LOG="$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.$(date +%s).txt" +exec > >(tee -ia "$LOG") +exec 2> >(tee -ia "$LOG" >&2) + +# Log some environment info +echo "Invocation: $0 $@" +date +pip freeze +git status + +cd $SCRATCH_DIR/$DOWNLOAD_NAME + +cp $SCRIPT_DIR/generate_hyperparameters.py . +python generate_hyperparameters.py > hyperparameters.yaml + +GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 +echo "Detected GPUS: $GPUS" + +PROCESSORS=$(getconf _NPROCESSORS_ONLN) +echo "Detected processors: $PROCESSORS" + +if [ "$GPUS" -eq "0" ]; then + NUM_JOBS=${NUM_JOBS-1} +else + NUM_JOBS=${NUM_JOBS-$GPUS} +fi +echo "Num jobs: $NUM_JOBS" + +export PYTHONUNBUFFERED=1 + +if [ "$1" != "continue-incomplete" ] +then + cp $SCRIPT_DIR/generate_hyperparameters.py . + python generate_hyperparameters.py > hyperparameters.yaml +fi + +for kind in with_mass_spec no_mass_spec +do + EXTRA_TRAIN_ARGS="" + if [ "$1" == "continue-incomplete" ] && [ -d "models.${kind}" ] + then + echo "Will continue existing run: $kind" + EXTRA_TRAIN_ARGS="--continue-incomplete" + fi + + mhcflurry-class1-train-pan-allele-models \ + --data "$(mhcflurry-downloads path data_curated)/curated_training_data.${kind}.csv.bz2" \ + --allele-sequences "$(mhcflurry-downloads path allele_sequences)/allele_sequences.csv" \ + --pretrain-data "$(mhcflurry-downloads path random_peptide_predictions)/predictions.csv.bz2" \ + --held-out-measurements-per-allele-fraction-and-max 0.25 100 \ + --ensemble-size 4 \ + --hyperparameters hyperparameters.yaml \ + --out-models-dir models.${kind} \ + --worker-log-dir "$SCRATCH_DIR/$DOWNLOAD_NAME" \ + --verbosity 0 \ + --num-jobs $NUM_JOBS --max-tasks-per-worker 1 --gpus $GPUS --max-workers-per-gpu 1 \ + $EXTRA_TRAIN_ARGS +done + +cp $SCRIPT_ABSOLUTE_PATH . +bzip2 -f "$LOG" +for i in $(ls LOG-worker.*.txt) ; do bzip2 -f $i ; done +RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" +tar -cjf "$RESULT" * +echo "Created archive: $RESULT" + +# Split into <2GB chunks for GitHub +PARTS="${RESULT}.part." +# Check for pre-existing part files and rename them. +for i in $(ls "${PARTS}"* ) +do + DEST="${i}.OLD.$(date +%s)" + echo "WARNING: already exists: $i . Moving to $DEST" + mv $i $DEST +done +split -b 2000M "$RESULT" "$PARTS" +echo "Split into parts:" +ls -lh "${PARTS}"* + diff --git a/downloads-generation/models_class1_pan_unselected/README.md b/downloads-generation/models_class1_pan_unselected/README.md new file mode 100644 index 0000000000000000000000000000000000000000..628d14d7ae833ead0f67856586d26b1f2aa015da --- /dev/null +++ b/downloads-generation/models_class1_pan_unselected/README.md @@ -0,0 +1,9 @@ +# Class I pan-allele models (ensemble) + +This download contains trained MHC Class I MHCflurry models before model selection. + +To generate this download run: + +``` +./GENERATE.sh +``` diff --git a/downloads-generation/models_class1_pan_unselected/cluster_submit_script_header.mssm_hpc.lsf b/downloads-generation/models_class1_pan_unselected/cluster_submit_script_header.mssm_hpc.lsf new file mode 100644 index 0000000000000000000000000000000000000000..6fb96c1fcd18ee0192c7980e993c746a5ec4156b --- /dev/null +++ b/downloads-generation/models_class1_pan_unselected/cluster_submit_script_header.mssm_hpc.lsf @@ -0,0 +1,32 @@ +#!/bin/bash +#BSUB -J MHCf-{work_item_num} # Job name +#BSUB -P acc_nkcancer # allocation account or Unix group +#BSUB -q gpu # queue +#BSUB -R rusage[ngpus_excl_p=1] # 1 exclusive GPU +#BSUB -R span[hosts=1] # one node +#BSUB -n 1 # number of compute cores +#BSUB -W 46:00 # walltime in HH:MM +#BSUB -R rusage[mem=30000] # mb memory requested +#BSUB -o {work_dir}/%J.stdout # output log (%J : JobID) +#BSUB -eo {work_dir}/%J.stderr # error log +#BSUB -L /bin/bash # Initialize the execution environment +# + +export TMPDIR=/local/JOBS/mhcflurry-{work_item_num} +export PATH=$HOME/.conda/envs/py36b/bin/:$PATH +export PYTHONUNBUFFERED=1 +export KMP_SETTINGS=1 + +set -e +set -x +free -m + +module add cuda/10.0.130 cudnn/7.1.1 +module list + +python -c 'import tensorflow as tf ; print("GPU AVAILABLE" if tf.test.is_gpu_available() else "GPU NOT AVAILABLE")' + +env + +cd {work_dir} + diff --git a/downloads-generation/models_class1_pan_unselected/generate_hyperparameters.py b/downloads-generation/models_class1_pan_unselected/generate_hyperparameters.py new file mode 100644 index 0000000000000000000000000000000000000000..8f8bf51880202a5161e9273bb0be0f4e6518ad3c --- /dev/null +++ b/downloads-generation/models_class1_pan_unselected/generate_hyperparameters.py @@ -0,0 +1,71 @@ +""" +Generate grid of hyperparameters +""" + +from sys import stdout +from copy import deepcopy +from yaml import dump + +base_hyperparameters = { + 'activation': 'tanh', + 'allele_dense_layer_sizes': [], + 'batch_normalization': False, + 'dense_layer_l1_regularization': 0.0, + 'dense_layer_l2_regularization': 0.0, + 'dropout_probability': 0.5, + 'early_stopping': True, + 'init': 'glorot_uniform', + 'layer_sizes': [1024, 512], + 'learning_rate': 0.001, + 'locally_connected_layers': [], + 'loss': 'custom:mse_with_inequalities', + 'max_epochs': 5000, + 'minibatch_size': 128, + 'optimizer': 'rmsprop', + 'output_activation': 'sigmoid', + "patience": 20, + "min_delta": 0.0, + 'peptide_encoding': { + 'vector_encoding_name': 'BLOSUM62', + 'alignment_method': 'left_pad_centered_right_pad', + 'max_length': 15, + }, + 'peptide_allele_merge_activation': '', + 'peptide_allele_merge_method': 'concatenate', + 'peptide_amino_acid_encoding': 'BLOSUM62', + 'peptide_dense_layer_sizes': [], + 'random_negative_affinity_max': 50000.0, + 'random_negative_affinity_min': 20000.0, + 'random_negative_constant': 1500, + 'random_negative_distribution_smoothing': 0.0, + 'random_negative_match_distribution': True, + 'random_negative_rate': 0.2, + 'train_data': { + 'pretrain': True, + 'pretrain_peptides_per_epoch': 64, + 'pretrain_steps_per_epoch': 256, + 'pretrain_patience': 2, + 'pretrain_min_delta': 0.0001, + 'pretrain_max_val_loss': 0.10, + 'pretrain_max_epochs': 50, + 'pretrain_min_epochs': 5, + }, + 'validation_split': 0.1, + 'data_dependent_initialization_method': "lsuv", +} + +grid = [] +for layer_sizes in [[512, 256], [512, 512], [1024, 512], [1024, 1024]]: + for pretrain in [True]: + l1_base = 0.0000001 + for l1 in [l1_base, l1_base / 10, l1_base / 100, l1_base / 1000, 0.0]: + for lr in [0.001, 0.01]: + new = deepcopy(base_hyperparameters) + new["layer_sizes"] = layer_sizes + new["dense_layer_l1_regularization"] = l1 + new["train_data"]["pretrain"] = pretrain + new["learning_rate"] = lr + if not grid or new not in grid: + grid.append(new) + +dump(grid, stdout) diff --git a/downloads-generation/random_peptide_predictions/GENERATE.sh b/downloads-generation/random_peptide_predictions/GENERATE.sh new file mode 100755 index 0000000000000000000000000000000000000000..c5ddcea91140eeff103d96b66a6157a28b6fd34a --- /dev/null +++ b/downloads-generation/random_peptide_predictions/GENERATE.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# +# Generate predictions for random peptides. Used for pre-training some models. +# +set -e +set -x + +DOWNLOAD_NAME=random_peptide_predictions +SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation +SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" +SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") +export PYTHONUNBUFFERED=1 + +mkdir -p "$SCRATCH_DIR" +rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" +mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" + +# Send stdout and stderr to a logfile included with the archive. +exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") +exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) + +# Log some environment info +date +pip freeze +git status + +cd $SCRATCH_DIR/$DOWNLOAD_NAME +cp $SCRIPT_DIR/random_predictions.py . +cp $SCRIPT_ABSOLUTE_PATH . + +time python random_predictions.py \ + --num-peptides 5000000 \ + --models "$(mhcflurry-downloads path models_class1_selected_no_mass_spec)/models" \ + --out predictions.csv + +bzip2 predictions.csv +bzip2 LOG.txt +tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * + +echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" diff --git a/downloads-generation/random_peptide_predictions/random_predictions.py b/downloads-generation/random_peptide_predictions/random_predictions.py new file mode 100644 index 0000000000000000000000000000000000000000..6ad7643508616330126f766b1b1f37ed5f011597 --- /dev/null +++ b/downloads-generation/random_peptide_predictions/random_predictions.py @@ -0,0 +1,67 @@ +""" +Generate predictions for random peptides. +""" +from __future__ import print_function + +import sys +import argparse +import time +import math + +import pandas + +import mhcflurry +from mhcflurry.common import random_peptides + + +parser = argparse.ArgumentParser(usage=__doc__) + +parser.add_argument("--models", required=True) +parser.add_argument("--num-peptides", type=int) +parser.add_argument("--out", required=True) +parser.add_argument("--chunksize", type=int, default=10000) + + +def run(): + args = parser.parse_args(sys.argv[1:]) + print(args) + + predictor = mhcflurry.Class1AffinityPredictor.load(args.models) + + alleles = pandas.Series(predictor.supported_alleles) + + # Clear the file + pandas.DataFrame(columns=alleles).to_csv(args.out, index=True) + + (min_length, max_length) = predictor.supported_peptide_lengths + + peptides_per_length = int( + math.ceil(args.chunksize / (max_length - min_length))) + + peptides_written = 0 + i = 0 + while peptides_written < args.num_peptides: + print("Chunk %d / %d" % ( + i + 1, math.ceil(args.num_peptides / args.chunksize))) + start = time.time() + peptides = [] + for l in range(8, 16): + peptides.extend(random_peptides(peptides_per_length, length=l)) + + peptides = pandas.Series(peptides).sample( + n=min(args.chunksize, args.num_peptides - peptides_written)).values + encodable_peptides = mhcflurry.encodable_sequences.EncodableSequences.create( + peptides) + df = pandas.DataFrame(index=peptides) + for allele in alleles: + df[allele] = predictor.predict(encodable_peptides, allele=allele) + df.to_csv( + args.out, index=True, mode='a', header=False, float_format='%.1f') + print("Wrote: %s [%0.2f sec]" % (args.out, time.time() - start)) + i += 1 + peptides_written += len(peptides) + + print("Done.") + +if __name__ == '__main__': + run() diff --git a/mhcflurry/__init__.py b/mhcflurry/__init__.py index 8538c4d3a9afb4f3b3b07b4de7c38c85f765be0a..5d7ceb0fedefd35efb370b702acaf6df0bf799cc 100644 --- a/mhcflurry/__init__.py +++ b/mhcflurry/__init__.py @@ -1,3 +1,7 @@ +""" +Class I MHC ligand prediction package +""" + from .class1_affinity_predictor import Class1AffinityPredictor from .class1_neural_network import Class1NeuralNetwork from .version import __version__ diff --git a/mhcflurry/allele_encoding.py b/mhcflurry/allele_encoding.py index 1fb7b1319f226b90a8c32bef513f049585bec46b..06355361dd337c5faaa5aa040932a62a733ece87 100644 --- a/mhcflurry/allele_encoding.py +++ b/mhcflurry/allele_encoding.py @@ -1,70 +1,140 @@ -import numpy import pandas -from .encodable_sequences import EncodableSequences from . import amino_acid + class AlleleEncoding(object): - def __init__( - self, - alleles, - allele_to_fixed_length_sequence=None): + def __init__(self, alleles=None, allele_to_sequence=None, borrow_from=None): """ - A place to cache encodings for a (potentially large) sequence of alleles. + A place to cache encodings for a sequence of alleles. + + We frequently work with alleles by integer indices, for example as + inputs to neural networks. This class is used to map allele names to + integer indices in a consistent way by keeping track of the universe + of alleles under use, i.e. a distinction is made between the universe + of supported alleles (what's in `allele_to_sequence`) and the actual + set of alleles used (what's in `alleles`). Parameters ---------- alleles : list of string Allele names - allele_to_fixed_length_sequence : dict of str -> str - Allele name to fixed lengths sequence ("pseudosequence") + allele_to_sequence : dict of str -> str + Allele name to amino acid sequence + + borrow_from : AlleleEncoding, optional + If specified, do not specify allele_to_sequence. The sequences from + the provided instance are used. This guarantees that the mappings + from allele to index and from allele to sequence are the same + between the instances. """ - alleles = pandas.Series(alleles) + if alleles is not None: + alleles = pandas.Series(alleles) + self.borrow_from = borrow_from + self.allele_to_sequence = allele_to_sequence - all_alleles = list(sorted(alleles.unique())) + if self.borrow_from is None: + assert allele_to_sequence is not None + all_alleles = ( + sorted(allele_to_sequence)) + self.allele_to_index = dict( + (allele, i) + for (i, allele) in enumerate(all_alleles)) + unpadded = pandas.Series( + [allele_to_sequence[a] for a in all_alleles], + index=all_alleles) + self.sequences = unpadded.str.pad( + unpadded.str.len().max(), fillchar="X") + else: + assert allele_to_sequence is None + self.allele_to_index = borrow_from.allele_to_index + self.sequences = borrow_from.sequences + self.allele_to_sequence = borrow_from.allele_to_sequence - self.allele_to_index = dict( - (allele, i) - for (i, allele) in enumerate(all_alleles)) + if alleles is not None: + assert all( + allele in self.allele_to_index for allele in alleles),\ + "Missing alleles: " + " ".join(set( + a for a in alleles if a not in self.allele_to_index)) + self.indices = alleles.map(self.allele_to_index) + assert not self.indices.isnull().any() + self.alleles = alleles + else: + self.indices = None + self.alleles = None - self.indices = alleles.map(self.allele_to_index) + self.encoding_cache = {} - self.fixed_length_sequences = pandas.Series( - [allele_to_fixed_length_sequence[a] for a in all_alleles], - index=all_alleles) + def compact(self): + """ + Return a new AlleleEncoding in which the universe of supported alleles + is only the alleles actually used. - self.encoding_cache = {} + Returns + ------- + AlleleEncoding + """ + return AlleleEncoding( + alleles=self.alleles, + allele_to_sequence=dict( + (allele, self.allele_to_sequence[allele]) + for allele in self.alleles.unique())) - def fixed_length_vector_encoded_sequences(self, vector_encoding_name): + def allele_representations(self, encoding_name): """ - Encode alleles. + Encode the universe of supported allele sequences to a matrix. Parameters ---------- - vector_encoding_name : string - How to represent amino acids. - One of "BLOSUM62", "one-hot", etc. Full list of supported vector - encodings is given by available_vector_encodings() in amino_acid. + encoding_name : string + How to represent amino acids. Valid names are "BLOSUM62" or + "one-hot". See `amino_acid.ENCODING_DATA_FRAMES`. Returns ------- - numpy.array with shape (num sequences, sequence length, m) where m is - vector_encoding_length(vector_encoding_name) + numpy.array of shape + (num alleles in universe, sequence length, vector size) + where vector size is usually 21 (20 amino acids + X character) """ + if self.borrow_from is not None: + return self.borrow_from.allele_representations(encoding_name) + cache_key = ( - "fixed_length_vector_encoding", - vector_encoding_name) + "allele_representations", + encoding_name) if cache_key not in self.encoding_cache: index_encoded_matrix = amino_acid.index_encoding( - self.fixed_length_sequences.values, + self.sequences.values, amino_acid.AMINO_ACID_INDEX) vector_encoded = amino_acid.fixed_vectors_encoding( index_encoded_matrix, - amino_acid.ENCODING_DATA_FRAMES[vector_encoding_name]) - result = vector_encoded[self.indices] - self.encoding_cache[cache_key] = result + amino_acid.ENCODING_DATA_FRAMES[encoding_name]) + self.encoding_cache[cache_key] = vector_encoded return self.encoding_cache[cache_key] + def fixed_length_vector_encoded_sequences(self, encoding_name): + """ + Encode allele sequences (not the universe of alleles) to a matrix. + + Parameters + ---------- + encoding_name : string + How to represent amino acids. Valid names are "BLOSUM62" or + "one-hot". See `amino_acid.ENCODING_DATA_FRAMES`. + Returns + ------- + numpy.array with shape: + (num alleles, sequence length, vector size) + where vector size is usually 21 (20 amino acids + X character) + """ + cache_key = ( + "fixed_length_vector_encoding", + encoding_name) + if cache_key not in self.encoding_cache: + vector_encoded = self.allele_representations(encoding_name) + result = vector_encoded[self.indices] + self.encoding_cache[cache_key] = result + return self.encoding_cache[cache_key] diff --git a/mhcflurry/amino_acid.py b/mhcflurry/amino_acid.py index 73845bba8dfbcf5dac4cbf7b76d4f1850e7675b3..e15e5b2a4747f9404b10e8918ce274ce44374148 100644 --- a/mhcflurry/amino_acid.py +++ b/mhcflurry/amino_acid.py @@ -68,7 +68,7 @@ W -3 -3 -4 -4 -2 -2 -3 -2 -2 -3 -2 -3 -1 1 -4 -3 -2 11 2 -3 0 Y -2 -2 -2 -3 -2 -1 -2 -3 2 -1 -1 -2 -1 3 -3 -2 -2 2 7 -1 0 V 0 -3 -3 -3 -1 -2 -2 -3 -3 3 1 -2 1 -1 -2 -2 0 -3 -1 4 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -"""), sep='\s+').loc[AMINO_ACIDS, AMINO_ACIDS] +"""), sep='\s+').loc[AMINO_ACIDS, AMINO_ACIDS].astype("int8") assert (BLOSUM62_MATRIX == BLOSUM62_MATRIX.T).all().all() ENCODING_DATA_FRAMES = { @@ -153,7 +153,7 @@ def fixed_vectors_encoding(index_encoded_sequences, letter_to_vector_df): target_shape = ( num_sequences, sequence_length, letter_to_vector_df.shape[0]) result = letter_to_vector_df.iloc[ - index_encoded_sequences.flatten() + index_encoded_sequences.reshape((-1,)) # reshape() avoids copy ].values.reshape(target_shape) return result diff --git a/mhcflurry/calibrate_percentile_ranks_command.py b/mhcflurry/calibrate_percentile_ranks_command.py index 4a986e5c603c2de1ca325370aca28df0f234a647..9ced4161ea4617a132ec94f677e5c92743ba04fc 100644 --- a/mhcflurry/calibrate_percentile_ranks_command.py +++ b/mhcflurry/calibrate_percentile_ranks_command.py @@ -7,23 +7,25 @@ import signal import sys import time import traceback -import random +import collections from functools import partial -import numpy import pandas -import yaml -from sklearn.metrics.pairwise import cosine_similarity + from mhcnames import normalize_allele_name import tqdm # progress bar tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 from .class1_affinity_predictor import Class1AffinityPredictor -from .common import configure_logging -from .parallelism import ( - add_worker_pool_args, +from .encodable_sequences import EncodableSequences +from .common import configure_logging, random_peptides, amino_acid_distribution +from .local_parallelism import ( + add_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, - call_wrapped) + call_wrapped_kwargs) +from .cluster_parallelism import ( + add_cluster_parallelism_args, + cluster_results_from_args) # To avoid pickling large matrices to send to child processes when running in @@ -44,8 +46,13 @@ parser.add_argument( "--allele", default=None, nargs="+", - help="Alleles to train models for. If not specified, all alleles with " - "enough measurements will be used.") + help="Alleles to calibrate percentile ranks for. If not specified all " + "alleles are used") +parser.add_argument( + "--match-amino-acid-distribution-data", + help="Sample random peptides from the amino acid distribution of the " + "peptides listed in the supplied CSV file, which must have a 'peptide' " + "column. If not specified a uniform distribution is used.") parser.add_argument( "--num-peptides-per-length", type=int, @@ -53,13 +60,40 @@ parser.add_argument( default=int(1e5), help="Number of peptides per length to use to calibrate percent ranks. " "Default: %(default)s.") +parser.add_argument( + "--motif-summary", + default=False, + action="store_true", + help="Calculate motifs and length preferences for each allele") +parser.add_argument( + "--summary-top-peptide-fraction", + default=[0.0001, 0.001, 0.01, 0.1, 1.0], + nargs="+", + type=float, + metavar="X", + help="The top X fraction of predictions (i.e. tightest binders) to use to " + "generate motifs and length preferences. Default: %(default)s") +parser.add_argument( + "--length-range", + default=(8, 15), + type=int, + nargs=2, + help="Min and max peptide length to calibrate, inclusive. " + "Default: %(default)s") +parser.add_argument( + "--prediction-batch-size", + type=int, + default=4096, + help="Keras batch size for predictions") parser.add_argument( "--verbosity", type=int, help="Keras verbosity. Default: %(default)s", default=0) -add_worker_pool_args(parser) +add_local_parallelism_args(parser) +add_cluster_parallelism_args(parser) + def run(argv=sys.argv[1:]): global GLOBAL_DATA @@ -81,49 +115,94 @@ def run(argv=sys.argv[1:]): else: alleles = predictor.supported_alleles + distribution = None + if args.match_amino_acid_distribution_data: + distribution_peptides = pandas.read_csv( + args.match_amino_acid_distribution_data).peptide.unique() + distribution = amino_acid_distribution(distribution_peptides) + print("Using amino acid distribution:") + print(distribution) + + start = time.time() + + print("Percent rank calibration for %d alleles. Generating peptides." % ( + len(alleles))) + peptides = [] + lengths = range(args.length_range[0], args.length_range[1] + 1) + for length in lengths: + peptides.extend( + random_peptides( + args.num_peptides_per_length, length, distribution=distribution)) + print("Done generating peptides in %0.2f sec." % (time.time() - start)) + print("Encoding %d peptides." % len(peptides)) start = time.time() - print("Performing percent rank calibration. Encoding peptides.") - encoded_peptides = predictor.calibrate_percentile_ranks( - alleles=[], # don't actually do any calibration, just return peptides - num_peptides_per_length=args.num_peptides_per_length) + encoded_peptides = EncodableSequences.create(peptides) + del peptides # Now we encode the peptides for each neural network, so the encoding # becomes cached. for network in predictor.neural_networks: network.peptides_to_network_input(encoded_peptides) assert encoded_peptides.encoding_cache # must have cached the encoding - print("Finished encoding peptides for percent ranks in %0.2f sec." % ( - time.time() - start)) - print("Calibrating percent rank calibration for %d alleles." % len(alleles)) + print("Finished encoding peptides in %0.2f sec." % (time.time() - start)) # Store peptides in global variable so they are in shared memory # after fork, instead of needing to be pickled (when doing a parallel run). GLOBAL_DATA["calibration_peptides"] = encoded_peptides + GLOBAL_DATA["predictor"] = predictor + GLOBAL_DATA["args"] = { + 'motif_summary': args.motif_summary, + 'summary_top_peptide_fractions': args.summary_top_peptide_fraction, + 'verbose': args.verbosity > 0, + 'model_kwargs': { + 'batch_size': args.prediction_batch_size, + } + } + del encoded_peptides - worker_pool = worker_pool_with_gpu_assignments_from_args(args) - - if worker_pool is None: + serial_run = not args.cluster_parallelism and args.num_jobs == 0 + worker_pool = None + start = time.time() + work_items = [{"allele": allele} for allele in alleles] + if serial_run: # Serial run print("Running in serial.") results = ( - calibrate_percentile_ranks( - allele=allele, - predictor=predictor, - peptides=encoded_peptides) - for allele in alleles) + do_calibrate_percentile_ranks(**item) for item in work_items) + elif args.cluster_parallelism: + # Run using separate processes HPC cluster. + print("Running on cluster.") + results = cluster_results_from_args( + args, + work_function=do_calibrate_percentile_ranks, + work_items=work_items, + constant_data=GLOBAL_DATA, + result_serialization_method="pickle", + clear_constant_data=True) else: - # Parallel run + worker_pool = worker_pool_with_gpu_assignments_from_args(args) + print("Worker pool", worker_pool) + assert worker_pool is not None results = worker_pool.imap_unordered( - partial( - partial(call_wrapped, calibrate_percentile_ranks), - predictor=predictor), - alleles, + partial(call_wrapped_kwargs, do_calibrate_percentile_ranks), + work_items, chunksize=1) - for result in tqdm.tqdm(results, total=len(alleles)): - predictor.allele_to_percent_rank_transform.update(result) - print("Done calibrating %d additional alleles." % len(alleles)) + summary_results_lists = collections.defaultdict(list) + for (transforms, summary_results) in tqdm.tqdm(results, total=len(work_items)): + predictor.allele_to_percent_rank_transform.update(transforms) + if summary_results is not None: + for (item, value) in summary_results.items(): + summary_results_lists[item].append(value) + print("Done calibrating %d alleles." % len(work_items)) + if summary_results_lists: + for (name, lst) in summary_results_lists.items(): + df = pandas.concat(lst, ignore_index=True) + predictor.metadata_dataframes[name] = df + print("Including summary result: %s" % name) + print(df) + predictor.save(args.models_dir, model_names_to_write=[]) percent_rank_calibration_time = time.time() - start @@ -133,23 +212,42 @@ def run(argv=sys.argv[1:]): worker_pool.join() print("Percent rank calibration time: %0.2f min." % ( - percent_rank_calibration_time / 60.0)) + percent_rank_calibration_time / 60.0)) print("Predictor written to: %s" % args.models_dir) -def calibrate_percentile_ranks(allele, predictor, peptides=None): - """ - Private helper function. - """ - global GLOBAL_DATA - if peptides is None: - peptides = GLOBAL_DATA["calibration_peptides"] - predictor.calibrate_percentile_ranks( +def do_calibrate_percentile_ranks(allele, constant_data=GLOBAL_DATA): + return calibrate_percentile_ranks( + allele, + constant_data['predictor'], + peptides=constant_data['calibration_peptides'], + **constant_data["args"]) + + +def calibrate_percentile_ranks( + allele, + predictor, + peptides=None, + motif_summary=False, + summary_top_peptide_fractions=[0.001], + verbose=False, + model_kwargs={}): + if verbose: + print("Calibrating", allele) + start = time.time() + summary_results = predictor.calibrate_percentile_ranks( peptides=peptides, - alleles=[allele]) - return { + alleles=[allele], + motif_summary=motif_summary, + summary_top_peptide_fractions=summary_top_peptide_fractions, + verbose=verbose, + model_kwargs=model_kwargs) + if verbose: + print("Done calibrating", allele, "in", time.time() - start, "sec") + transforms = { allele: predictor.allele_to_percent_rank_transform[allele], } + return (transforms, summary_results) if __name__ == '__main__': diff --git a/mhcflurry/class1_affinity_predictor.py b/mhcflurry/class1_affinity_predictor.py index 85ecc1a1dc023b16f32810e2d988f3f7a0d1a257..d464a3728219589de70400e1b22c9b2bb0767c40 100644 --- a/mhcflurry/class1_affinity_predictor.py +++ b/mhcflurry/class1_affinity_predictor.py @@ -5,19 +5,20 @@ import logging import time import warnings from os.path import join, exists, abspath -from os import mkdir +from os import mkdir, environ from socket import gethostname from getpass import getuser from functools import partial +from six import string_types -import mhcnames import numpy -import pandas from numpy.testing import assert_equal -from six import string_types +import pandas + +import mhcnames from .class1_neural_network import Class1NeuralNetwork -from .common import random_peptides +from .common import random_peptides, positional_frequency_matrix from .downloads import get_default_class1_models_dir from .encodable_sequences import EncodableSequences from .percent_rank_transform import PercentRankTransform @@ -31,6 +32,9 @@ from .allele_encoding import AlleleEncoding # See ensemble_centrality.py for other options. DEFAULT_CENTRALITY_MEASURE = "mean" +# Any value > 0 will result in attempting to optimize models after loading. +OPTIMIZATION_LEVEL = int(environ.get("MHCFLURRY_OPTIMIZATION_LEVEL", 1)) + class Class1AffinityPredictor(object): """ @@ -39,13 +43,14 @@ class Class1AffinityPredictor(object): This class manages low-level `Class1NeuralNetwork` instances, each of which wraps a single Keras network. The purpose of `Class1AffinityPredictor` is to implement ensembles, handling of multiple alleles, and predictor loading and - saving. + saving. It also provides a place to keep track of metadata like prediction + histograms for percentile rank calibration. """ def __init__( self, allele_to_allele_specific_models=None, class1_pan_allele_models=None, - allele_to_fixed_length_sequence=None, + allele_to_sequence=None, manifest_df=None, allele_to_percent_rank_transform=None, metadata_dataframes=None): @@ -53,13 +58,15 @@ class Class1AffinityPredictor(object): Parameters ---------- allele_to_allele_specific_models : dict of string -> list of `Class1NeuralNetwork` - Ensemble of single-allele models to use for each allele. - + Ensemble of single-allele models to use for each allele. + class1_pan_allele_models : list of `Class1NeuralNetwork` Ensemble of pan-allele models. - - allele_to_fixed_length_sequence : dict of string -> string - Required only if class1_pan_allele_models is specified. + + allele_to_sequence : dict of string -> string + MHC allele name to fixed-length amino acid sequence (sometimes + referred to as the pseudosequence). Required only if + class1_pan_allele_models is specified. manifest_df : `pandas.DataFrame`, optional Must have columns: model_name, allele, config_json, model. @@ -80,26 +87,43 @@ class Class1AffinityPredictor(object): if class1_pan_allele_models is None: class1_pan_allele_models = [] + self.allele_to_sequence = ( + dict(allele_to_sequence) + if allele_to_sequence is not None else None) # make a copy + + self._master_allele_encoding = None if class1_pan_allele_models: - assert allele_to_fixed_length_sequence, "Allele sequences required" + assert self.allele_to_sequence self.allele_to_allele_specific_models = allele_to_allele_specific_models self.class1_pan_allele_models = class1_pan_allele_models - self.allele_to_fixed_length_sequence = allele_to_fixed_length_sequence self._manifest_df = manifest_df if not allele_to_percent_rank_transform: allele_to_percent_rank_transform = {} self.allele_to_percent_rank_transform = allele_to_percent_rank_transform - self.metadata_dataframes = metadata_dataframes + self.metadata_dataframes = ( + dict(metadata_dataframes) if metadata_dataframes else {}) self._cache = {} + self.optimization_info = {} + + assert isinstance(self.allele_to_allele_specific_models, dict) + assert isinstance(self.class1_pan_allele_models, list) @property def manifest_df(self): + """ + A pandas.DataFrame describing the models included in this predictor. + + Based on: + - self.class1_pan_allele_models + - self.allele_to_allele_specific_models + + Returns + ------- + pandas.DataFrame + """ if self._manifest_df is None: - # Make a manifest based on - # - self.class1_pan_allele_models - # - self.allele_to_allele_specific_models rows = [] for (i, model) in enumerate(self.class1_pan_allele_models): rows.append(( @@ -108,8 +132,7 @@ class Class1AffinityPredictor(object): json.dumps(model.get_config()), model )) - for (allele, - models) in self.allele_to_allele_specific_models.items(): + for (allele, models) in self.allele_to_allele_specific_models.items(): for (i, model) in enumerate(models): rows.append(( self.model_name(allele, i), @@ -127,9 +150,9 @@ class Class1AffinityPredictor(object): Clear values cached based on the neural networks in this predictor. Users should call this after mutating any of the following: - - class1_pan_allele_models - - allele_to_allele_specific_models - - allele_to_fixed_length_sequence + - self.class1_pan_allele_models + - self.allele_to_allele_specific_models + - self.allele_to_sequence Methods that mutate these instance variables will call this method on their own if needed. @@ -174,7 +197,7 @@ class Class1AffinityPredictor(object): allele_to_allele_specific_models = collections.defaultdict(list) class1_pan_allele_models = [] - allele_to_fixed_length_sequence = predictors[0].allele_to_fixed_length_sequence + allele_to_sequence = predictors[0].allele_to_sequence for predictor in predictors: for (allele, networks) in ( @@ -186,7 +209,7 @@ class Class1AffinityPredictor(object): return Class1AffinityPredictor( allele_to_allele_specific_models=allele_to_allele_specific_models, class1_pan_allele_models=class1_pan_allele_models, - allele_to_fixed_length_sequence=allele_to_fixed_length_sequence + allele_to_sequence=allele_to_sequence ) def merge_in_place(self, others): @@ -202,22 +225,22 @@ class Class1AffinityPredictor(object): ------- list of string : names of newly added models """ - new_model_names = [] + original_manifest = self.manifest_df + new_manifest_rows = [] for predictor in others: for model in predictor.class1_pan_allele_models: model_name = self.model_name( "pan-class1", len(self.class1_pan_allele_models)) - self.class1_pan_allele_models.append(model) row = pandas.Series(collections.OrderedDict([ ("model_name", model_name), ("allele", "pan-class1"), ("config_json", json.dumps(model.get_config())), ("model", model), ])).to_frame().T - self._manifest_df = pandas.concat( - [self.manifest_df, row], ignore_index=True) + new_manifest_rows.append(row) + self.class1_pan_allele_models.append(model) new_model_names.append(model_name) for allele in predictor.allele_to_allele_specific_models: @@ -232,12 +255,16 @@ class Class1AffinityPredictor(object): ("config_json", json.dumps(model.get_config())), ("model", model), ])).to_frame().T - self._manifest_df = pandas.concat( - [self.manifest_df, row], ignore_index=True) + new_manifest_rows.append(row) current_models.append(model) new_model_names.append(model_name) + self._manifest_df = pandas.concat( + [original_manifest] + new_manifest_rows, + ignore_index=True) + self.clear_cache() + self.check_consistency() return new_model_names @property @@ -251,8 +278,8 @@ class Class1AffinityPredictor(object): """ if 'supported_alleles' not in self._cache: result = set(self.allele_to_allele_specific_models) - if self.allele_to_fixed_length_sequence: - result = result.union(self.allele_to_fixed_length_sequence) + if self.allele_to_sequence: + result = result.union(self.allele_to_sequence) self._cache["supported_alleles"] = sorted(result) return self._cache["supported_alleles"] @@ -277,6 +304,27 @@ class Class1AffinityPredictor(object): self._cache["supported_peptide_lengths"] = result return self._cache["supported_peptide_lengths"] + def check_consistency(self): + """ + Verify that self.manifest_df is consistent with: + - self.class1_pan_allele_models + - self.allele_to_allele_specific_models + + Currently only checks for agreement on the total number of models. + + Throws AssertionError if inconsistent. + """ + num_models = len(self.class1_pan_allele_models) + sum( + len(v) for v in self.allele_to_allele_specific_models.values()) + assert len(self.manifest_df) == num_models, ( + "Manifest seems out of sync with models: %d vs %d entries: " + "\n%s\npan-allele: %s\nallele-specific: %s"% ( + len(self.manifest_df), + num_models, + str(self.manifest_df), + str(self.class1_pan_allele_models), + str(self.allele_to_allele_specific_models))) + def save(self, models_dir, model_names_to_write=None, write_metadata=True): """ Serialize the predictor to a directory on disk. If the directory does @@ -292,7 +340,7 @@ class Class1AffinityPredictor(object): Parameters ---------- models_dir : string - Path to directory + Path to directory. It will be created if it doesn't exist. model_names_to_write : list of string, optional Only write the weights for the specified models. Useful for @@ -301,11 +349,7 @@ class Class1AffinityPredictor(object): write_metadata : boolean, optional Whether to write optional metadata """ - num_models = len(self.class1_pan_allele_models) + sum( - len(v) for v in self.allele_to_allele_specific_models.values()) - assert len(self.manifest_df) == num_models, ( - "Manifest seems out of sync with models: %d vs %d entries" % ( - len(self.manifest_df), num_models)) + self.check_consistency() if model_names_to_write is None: # Write all models @@ -314,7 +358,7 @@ class Class1AffinityPredictor(object): if not exists(models_dir): mkdir(models_dir) - sub_manifest_df = self.manifest_df.ix[ + sub_manifest_df = self.manifest_df.loc[ self.manifest_df.model_name.isin(model_names_to_write) ] @@ -322,14 +366,14 @@ class Class1AffinityPredictor(object): weights_path = self.weights_path(models_dir, row.model_name) Class1AffinityPredictor.save_weights( row.model.get_weights(), weights_path) - logging.info("Wrote: %s" % weights_path) + logging.info("Wrote: %s", weights_path) write_manifest_df = self.manifest_df[[ c for c in self.manifest_df.columns if c != "model" ]] manifest_path = join(models_dir, "manifest.csv") write_manifest_df.to_csv(manifest_path, index=False) - logging.info("Wrote: %s" % manifest_path) + logging.info("Wrote: %s", manifest_path) if write_metadata: # Write "info.txt" @@ -348,14 +392,15 @@ class Class1AffinityPredictor(object): metadata_df_path = join(models_dir, "%s.csv.bz2" % name) df.to_csv(metadata_df_path, index=False, compression="bz2") - if self.allele_to_fixed_length_sequence is not None: + # Save allele sequences + if self.allele_to_sequence is not None: allele_to_sequence_df = pandas.DataFrame( - list(self.allele_to_fixed_length_sequence.items()), + list(self.allele_to_sequence.items()), columns=['allele', 'sequence'] ) allele_to_sequence_df.to_csv( join(models_dir, "allele_sequences.csv"), index=False) - logging.info("Wrote: %s" % join(models_dir, "allele_sequences.csv")) + logging.info("Wrote: %s", join(models_dir, "allele_sequences.csv")) if self.allele_to_percent_rank_transform: percent_ranks_df = None @@ -370,27 +415,34 @@ class Class1AffinityPredictor(object): percent_ranks_path, index=True, index_label="bin") - logging.info("Wrote: %s" % percent_ranks_path) + logging.info("Wrote: %s", percent_ranks_path) @staticmethod - def load(models_dir=None, max_models=None): + def load(models_dir=None, max_models=None, optimization_level=None): """ Deserialize a predictor from a directory on disk. Parameters ---------- models_dir : string - Path to directory + Path to directory. If unspecified the default downloaded models are + used. max_models : int, optional Maximum number of `Class1NeuralNetwork` instances to load + optimization_level : int + If >0, model optimization will be attempted. Defaults to value of + environment variable MHCFLURRY_OPTIMIZATION_LEVEL. + Returns ------- `Class1AffinityPredictor` instance """ if models_dir is None: models_dir = get_default_class1_models_dir() + if optimization_level is None: + optimization_level = OPTIMIZATION_LEVEL manifest_path = join(models_dir, "manifest.csv") manifest_df = pandas.read_csv(manifest_path, nrows=max_models) @@ -417,11 +469,12 @@ class Class1AffinityPredictor(object): manifest_df["model"] = all_models - allele_to_fixed_length_sequence = None + # Load allele sequences + allele_to_sequence = None if exists(join(models_dir, "allele_sequences.csv")): - allele_to_fixed_length_sequence = pandas.read_csv( + allele_to_sequence = pandas.read_csv( join(models_dir, "allele_sequences.csv"), - index_col="allele").to_dict() + index_col=0).iloc[:, 0].to_dict() allele_to_percent_rank_transform = {} percent_ranks_path = join(models_dir, "percent_ranks.csv") @@ -433,25 +486,65 @@ class Class1AffinityPredictor(object): logging.info( "Loaded %d class1 pan allele predictors, %d allele sequences, " - "%d percent rank distributions, and %d allele specific models: %s" % ( - len(class1_pan_allele_models), - len(allele_to_fixed_length_sequence) if allele_to_fixed_length_sequence else 0, - len(allele_to_percent_rank_transform), - sum(len(v) for v in allele_to_allele_specific_models.values()), - ", ".join( - "%s (%d)" % (allele, len(v)) - for (allele, v) - in sorted(allele_to_allele_specific_models.items())))) + "%d percent rank distributions, and %d allele specific models: %s", + len(class1_pan_allele_models), + len(allele_to_sequence) if allele_to_sequence else 0, + len(allele_to_percent_rank_transform), + sum(len(v) for v in allele_to_allele_specific_models.values()), + ", ".join( + "%s (%d)" % (allele, len(v)) + for (allele, v) + in sorted(allele_to_allele_specific_models.items()))) result = Class1AffinityPredictor( allele_to_allele_specific_models=allele_to_allele_specific_models, class1_pan_allele_models=class1_pan_allele_models, - allele_to_fixed_length_sequence=allele_to_fixed_length_sequence, + allele_to_sequence=allele_to_sequence, manifest_df=manifest_df, allele_to_percent_rank_transform=allele_to_percent_rank_transform, ) + if optimization_level >= 1: + optimized = result.optimize() + logging.info( + "Model optimization %s", + "succeeded" if optimized else "not supported for these models") return result + def optimize(self): + """ + EXPERIMENTAL: Optimize the predictor for faster predictions. + + Currently the only optimization implemented is to merge multiple pan- + allele predictors at the tensorflow level. + + The optimization is performed in-place, mutating the instance. + + Returns + ---------- + bool + Whether optimization was performed + + """ + num_class1_pan_allele_models = len(self.class1_pan_allele_models) + if num_class1_pan_allele_models > 1: + try: + self.class1_pan_allele_models = [ + Class1NeuralNetwork.merge( + self.class1_pan_allele_models, + merge_method="concatenate") + ] + except NotImplementedError as e: + logging.warning("Optimization failed: %s", str(e)) + return False + self._manifest_df = None + self.clear_cache() + self.optimization_info["pan_models_merged"] = True + self.optimization_info["num_pan_models_merged"] = ( + num_class1_pan_allele_models) + else: + return False + return True + @staticmethod def model_name(allele, num): """ @@ -487,6 +580,23 @@ class Class1AffinityPredictor(object): """ return join(models_dir, "weights_%s.npz" % model_name) + @property + def master_allele_encoding(self): + """ + An AlleleEncoding containing the universe of alleles specified by + self.allele_to_sequence. + + Returns + ------- + AlleleEncoding + """ + if (self._master_allele_encoding is None or + self._master_allele_encoding.allele_to_sequence != + self.allele_to_sequence): + self._master_allele_encoding = AlleleEncoding( + allele_to_sequence=self.allele_to_sequence) + return self._master_allele_encoding + def fit_allele_specific_predictors( self, n_models, @@ -523,7 +633,7 @@ class Class1AffinityPredictor(object): nM affinities inequalities : list of string, each element one of ">", "<", or "=" - See Class1NeuralNetwork.fit for details. + See `Class1NeuralNetwork.fit` for details. train_rounds : sequence of int Each training point i will be used on training rounds r for which @@ -685,12 +795,12 @@ class Class1AffinityPredictor(object): alleles = pandas.Series(alleles).map(mhcnames.normalize_allele_name) allele_encoding = AlleleEncoding( alleles, - allele_to_fixed_length_sequence=self.allele_to_fixed_length_sequence) + borrow_from=self.master_allele_encoding) encodable_peptides = EncodableSequences.create(peptides) models = [] for i in range(n_models): - logging.info("Training model %d / %d" % (i + 1, n_models)) + logging.info("Training model %d / %d", i + 1, n_models) model = Class1NeuralNetwork(**architecture_hyperparameters) model.fit( encodable_peptides, @@ -702,7 +812,6 @@ class Class1AffinityPredictor(object): progress_print_interval=progress_print_interval) model_name = self.model_name("pan-class1", i) - self.class1_pan_allele_models.append(model) row = pandas.Series(collections.OrderedDict([ ("model_name", model_name), ("allele", "pan-class1"), @@ -711,6 +820,7 @@ class Class1AffinityPredictor(object): ])).to_frame().T self._manifest_df = pandas.concat( [self.manifest_df, row], ignore_index=True) + self.class1_pan_allele_models.append(model) if models_dir_for_save: self.save( models_dir_for_save, model_names_to_write=[model_name]) @@ -719,6 +829,33 @@ class Class1AffinityPredictor(object): self.clear_cache() return models + def add_pan_allele_model(self, model, models_dir_for_save=None): + """ + Add a pan-allele model to the ensemble and optionally do an incremental + save. + + Parameters + ---------- + model : Class1NeuralNetwork + models_dir_for_save : string + Directory to save resulting ensemble to + """ + model_name = self.model_name("pan-class1", 1) + row = pandas.Series(collections.OrderedDict([ + ("model_name", model_name), + ("allele", "pan-class1"), + ("config_json", json.dumps(model.get_config())), + ("model", model), + ])).to_frame().T + self._manifest_df = pandas.concat( + [self.manifest_df, row], ignore_index=True) + self.class1_pan_allele_models.append(model) + self.clear_cache() + self.check_consistency() + if models_dir_for_save: + self.save( + models_dir_for_save, model_names_to_write=[model_name]) + def percentile_ranks(self, affinities, allele=None, alleles=None, throw=True): """ Return percentile ranks for the given ic50 affinities and alleles. @@ -749,10 +886,8 @@ class Class1AffinityPredictor(object): msg = "Allele %s has no percentile rank information" % allele if throw: raise ValueError(msg) - else: - warnings.warn(msg) - # Return NaNs - return numpy.ones(len(affinities)) * numpy.nan + warnings.warn(msg) + return numpy.ones(len(affinities)) * numpy.nan # Return NaNs if alleles is None: raise ValueError("Specify allele or alleles") @@ -771,12 +906,13 @@ class Class1AffinityPredictor(object): alleles=None, allele=None, throw=True, - centrality_measure=DEFAULT_CENTRALITY_MEASURE): + centrality_measure=DEFAULT_CENTRALITY_MEASURE, + model_kwargs={}): """ Predict nM binding affinities. If multiple predictors are available for an allele, the predictions are - the geometric means of the individual model predictions. + the geometric means of the individual model (nM) predictions. One of 'allele' or 'alleles' must be specified. If 'allele' is specified all predictions will be for the given allele. If 'alleles' is specified @@ -795,6 +931,8 @@ class Class1AffinityPredictor(object): centrality_measure : string or callable Measure of central tendency to use to combine predictions in the ensemble. Options include: mean, median, robust_mean. + model_kwargs : dict + Additional keyword arguments to pass to Class1NeuralNetwork.predict Returns ------- @@ -808,6 +946,7 @@ class Class1AffinityPredictor(object): include_percentile_ranks=False, include_confidence_intervals=False, centrality_measure=centrality_measure, + model_kwargs=model_kwargs ) return df.prediction.values @@ -820,7 +959,8 @@ class Class1AffinityPredictor(object): include_individual_model_predictions=False, include_percentile_ranks=True, include_confidence_intervals=True, - centrality_measure=DEFAULT_CENTRALITY_MEASURE): + centrality_measure=DEFAULT_CENTRALITY_MEASURE, + model_kwargs={}): """ Predict nM binding affinities. Gives more detailed output than `predict` method, including 5-95% prediction intervals. @@ -844,14 +984,16 @@ class Class1AffinityPredictor(object): the predictions for the unsupported alleles or peptides will be NaN. include_individual_model_predictions : boolean If True, the predictions of each individual model are included as - columns in the result dataframe. + columns in the result DataFrame. include_percentile_ranks : boolean, default True - If True, a "prediction_percentile" column will be included giving the - percentile ranks. If no percentile rank information is available, + If True, a "prediction_percentile" column will be included giving + the percentile ranks. If no percentile rank info is available, this will be ignored with a warning. centrality_measure : string or callable Measure of central tendency to use to combine predictions in the ensemble. Options include: mean, median, robust_mean. + model_kwargs : dict + Additional keyword arguments to pass to Class1NeuralNetwork.predict Returns ------- @@ -913,7 +1055,7 @@ class Class1AffinityPredictor(object): (~df.supported_peptide_length).sum(), min_peptide_length, max_peptide_length, - str(df.ix[~df.supported_peptide_length].peptide.unique()))) + str(df.loc[~df.supported_peptide_length].peptide.unique()))) logging.warning(msg) if throw: raise ValueError(msg) @@ -922,7 +1064,10 @@ class Class1AffinityPredictor(object): df["supported_peptide_length"] = True all_peptide_lengths_supported = True - num_pan_models = len(self.class1_pan_allele_models) + num_pan_models = ( + len(self.class1_pan_allele_models) + if not self.optimization_info.get("pan_models_merged", False) + else self.optimization_info["num_pan_models_merged"]) max_single_allele_models = max( len(self.allele_to_allele_specific_models.get(allele, [])) for allele in unique_alleles @@ -933,30 +1078,70 @@ class Class1AffinityPredictor(object): predictions_array[:] = numpy.nan if self.class1_pan_allele_models: + master_allele_encoding = self.master_allele_encoding unsupported_alleles = [ allele for allele in df.normalized_allele.unique() - if allele not in self.allele_to_fixed_length_sequence + if allele not in self.allele_to_sequence ] if unsupported_alleles: + truncate_at = 100 + allele_string = " ".join( + sorted(self.allele_to_sequence)[:truncate_at]) + if len(self.allele_to_sequence) > truncate_at: + allele_string += " + %d more alleles" % ( + len(self.allele_to_sequence) - truncate_at) msg = ( "No sequences for allele(s): %s.\n" "Supported alleles: %s" % ( - " ".join(unsupported_alleles), - " ".join(sorted(self.allele_to_fixed_length_sequence)))) + " ".join(unsupported_alleles), allele_string)) logging.warning(msg) if throw: raise ValueError(msg) - mask = df.supported_peptide_length - if mask.sum() > 0: + mask = df.supported_peptide_length & ( + ~df.normalized_allele.isin(unsupported_alleles)) + + row_slice = None + if mask is None or mask.all(): + row_slice = slice(None, None, None) # all rows + masked_allele_encoding = AlleleEncoding( + df.normalized_allele, + borrow_from=master_allele_encoding) + masked_peptides = peptides + elif mask.sum() > 0: + row_slice = mask masked_allele_encoding = AlleleEncoding( df.loc[mask].normalized_allele, - allele_to_fixed_length_sequence=self.allele_to_fixed_length_sequence) + borrow_from=master_allele_encoding) masked_peptides = peptides.sequences[mask] - for (i, model) in enumerate(self.class1_pan_allele_models): - predictions_array[mask, i] = model.predict( + + masked_peptides = EncodableSequences.create(masked_peptides) + + if row_slice is not None: + # The following line is a performance optimization that may be + # revisited. It causes the neural network to set to include + # only the alleles actually being predicted for. This makes + # the network much smaller. However, subsequent calls to + # predict will need to reset these weights, so there is a + # tradeoff. + masked_allele_encoding = masked_allele_encoding.compact() + + if self.optimization_info.get("pan_models_merged"): + # Multiple pan-allele models have been merged into one + # at the tensorflow level. + assert len(self.class1_pan_allele_models) == 1 + predictions = self.class1_pan_allele_models[0].predict( masked_peptides, - allele_encoding=masked_allele_encoding) + allele_encoding=masked_allele_encoding, + output_index=None, + **model_kwargs) + predictions_array[row_slice, :num_pan_models] = predictions + else: + for (i, model) in enumerate(self.class1_pan_allele_models): + predictions_array[row_slice, i] = model.predict( + masked_peptides, + allele_encoding=masked_allele_encoding, + **model_kwargs) if self.allele_to_allele_specific_models: unsupported_alleles = [ @@ -981,19 +1166,22 @@ class Class1AffinityPredictor(object): mask = ( (df.normalized_allele == allele) & df.supported_peptide_length).values + + row_slice = None if mask is None or mask.all(): - # Common case optimization - for (i, model) in enumerate(models): - predictions_array[:, num_pan_models + i] = ( - model.predict(peptides)) + peptides_for_allele = peptides + row_slice = slice(None, None, None) elif mask.sum() > 0: peptides_for_allele = EncodableSequences.create( - df.ix[mask].peptide.values) + df.loc[mask].peptide.values) + row_slice = mask + + if row_slice is not None: for (i, model) in enumerate(models): predictions_array[ - mask, + row_slice, num_pan_models + i, - ] = model.predict(peptides_for_allele) + ] = model.predict(peptides_for_allele, **model_kwargs) if callable(centrality_measure): centrality_function = centrality_measure @@ -1005,8 +1193,10 @@ class Class1AffinityPredictor(object): df["prediction"] = numpy.exp(log_centers) if include_confidence_intervals: - df["prediction_low"] = numpy.exp(numpy.nanpercentile(logs, 5.0, axis=1)) - df["prediction_high"] = numpy.exp(numpy.nanpercentile(logs, 95.0, axis=1)) + df["prediction_low"] = numpy.exp( + numpy.nanpercentile(logs, 5.0, axis=1)) + df["prediction_high"] = numpy.exp( + numpy.nanpercentile(logs, 95.0, axis=1)) if include_individual_model_predictions: for i in range(num_pan_models): @@ -1063,12 +1253,11 @@ class Class1AffinityPredictor(object): ---------- list of array """ - loaded = numpy.load(filename) - weights = [ - loaded["array_%d" % i] - for i in range(len(loaded.keys())) - ] - loaded.close() + with numpy.load(filename) as loaded: + weights = [ + loaded["array_%d" % i] + for i in range(len(loaded.keys())) + ] return weights def calibrate_percentile_ranks( @@ -1076,11 +1265,15 @@ class Class1AffinityPredictor(object): peptides=None, num_peptides_per_length=int(1e5), alleles=None, - bins=None): + bins=None, + motif_summary=False, + summary_top_peptide_fractions=[0.001], + verbose=False, + model_kwargs={}): """ Compute the cumulative distribution of ic50 values for a set of alleles - over a large universe of random peptides, to enable computing quantiles in - this distribution later. + over a large universe of random peptides, to enable taking quantiles + of this distribution later. Parameters ---------- @@ -1097,10 +1290,25 @@ class Class1AffinityPredictor(object): Anything that can be passed to numpy.histogram's "bins" argument can be used here, i.e. either an integer or a sequence giving bin edges. This is in ic50 space. + motif_summary : bool + If True, the length distribution and per-position amino acid + frequencies are also calculated for the top x fraction of tightest- + binding peptides, where each value of x is given in the + summary_top_peptide_fractions list. + summary_top_peptide_fractions : list of float + Only used if motif_summary is True + verbose : boolean + Whether to print status updates to stdout + model_kwargs : dict + Additional low-level Class1NeuralNetwork.predict() kwargs. Returns ---------- - EncodableSequences : peptides used for calibration + dict of string -> pandas.DataFrame + + If motif_summary is True, this will have keys "frequency_matrices" and + "length_distributions". Otherwise it will be empty. + """ if bins is None: bins = to_ic50(numpy.linspace(1, 0, 1000)) @@ -1119,42 +1327,90 @@ class Class1AffinityPredictor(object): encoded_peptides = EncodableSequences.create(peptides) - for (i, allele) in enumerate(alleles): - predictions = self.predict(encoded_peptides, allele=allele) + if motif_summary: + frequency_matrices = [] + length_distributions = [] + else: + frequency_matrices = None + length_distributions = None + for allele in alleles: + start = time.time() + predictions = self.predict( + encoded_peptides, allele=allele, model_kwargs=model_kwargs) + if verbose: + elapsed = time.time() - start + print( + "Generated %d predictions for allele %s in %0.2f sec: " + "%0.2f predictions / sec" % ( + len(encoded_peptides.sequences), + allele, + elapsed, + len(encoded_peptides.sequences) / elapsed)) transform = PercentRankTransform() transform.fit(predictions, bins=bins) self.allele_to_percent_rank_transform[allele] = transform - return encoded_peptides - - def filter_networks(self, predicate): - """ - Return a new Class1AffinityPredictor containing a subset of this - predictor's neural networks. - - Parameters - ---------- - predicate : Class1NeuralNetwork -> boolean - Function specifying which neural networks to include - - Returns - ------- - Class1AffinityPredictor - """ - allele_to_allele_specific_models = {} - for (allele, models) in self.allele_to_allele_specific_models.items(): - allele_to_allele_specific_models[allele] = [ - m for m in models if predicate(m) - ] - class1_pan_allele_models = [ - m for m in self.class1_pan_allele_models if predicate(m) - ] - - return Class1AffinityPredictor( - allele_to_allele_specific_models=allele_to_allele_specific_models, - class1_pan_allele_models=class1_pan_allele_models, - allele_to_fixed_length_sequence=self.allele_to_fixed_length_sequence, - ) + if frequency_matrices is not None: + predictions_df = pandas.DataFrame({ + 'peptide': encoded_peptides.sequences, + 'prediction': predictions + }).drop_duplicates('peptide').set_index("peptide") + predictions_df["length"] = predictions_df.index.str.len() + for (length, sub_df) in predictions_df.groupby("length"): + for cutoff_fraction in summary_top_peptide_fractions: + selected = sub_df.prediction.nsmallest( + max( + int(len(sub_df) * cutoff_fraction), + 1)).index.values + matrix = positional_frequency_matrix(selected).reset_index() + original_columns = list(matrix.columns) + matrix["allele"] = allele + matrix["length"] = length + matrix["cutoff_fraction"] = cutoff_fraction + matrix["cutoff_count"] = len(selected) + matrix = matrix[ + ["allele", "length", "cutoff_fraction", "cutoff_count"] + + original_columns + ] + frequency_matrices.append(matrix) + + # Length distribution + for cutoff_fraction in summary_top_peptide_fractions: + cutoff_count = max( + int(len(predictions_df) * cutoff_fraction), 1) + length_distribution = predictions_df.prediction.nsmallest( + cutoff_count).index.str.len().value_counts() + length_distribution.index.name = "length" + length_distribution /= length_distribution.sum() + length_distribution = length_distribution.to_frame() + length_distribution.columns = ["fraction"] + length_distribution = length_distribution.reset_index() + length_distribution["allele"] = allele + length_distribution["cutoff_fraction"] = cutoff_fraction + length_distribution["cutoff_count"] = cutoff_count + length_distribution = length_distribution[[ + "allele", + "cutoff_fraction", + "cutoff_count", + "length", + "fraction" + ]].sort_values(["cutoff_fraction", "length"]) + length_distributions.append(length_distribution) + + if frequency_matrices is not None: + frequency_matrices = pandas.concat( + frequency_matrices, ignore_index=True) + + if length_distributions is not None: + length_distributions = pandas.concat( + length_distributions, ignore_index=True) + + if motif_summary: + return { + 'frequency_matrices': frequency_matrices, + 'length_distributions': length_distributions, + } + return {} def model_select( self, @@ -1165,6 +1421,8 @@ class Class1AffinityPredictor(object): """ Perform model selection using a user-specified scoring function. + This works only with allele-specific models, not pan-allele models. + Model selection is done using a "step up" variable selection procedure, in which models are repeatedly added to an ensemble until the score stops improving. @@ -1243,4 +1501,3 @@ class Class1AffinityPredictor(object): "model_selection": df, }) return new_predictor - diff --git a/mhcflurry/class1_neural_network.py b/mhcflurry/class1_neural_network.py index 8b17e78cbe97507519de706b5ef4a77ffb087126..277c683b8b23c3750daa82e75c2be09a21f75059 100644 --- a/mhcflurry/class1_neural_network.py +++ b/mhcflurry/class1_neural_network.py @@ -1,38 +1,53 @@ import time import collections -import logging import json import weakref +import itertools +import os +import logging +import pickle import numpy import pandas from .hyperparameters import HyperparameterDefaults -from .encodable_sequences import EncodableSequences -from .amino_acid import available_vector_encodings, vector_encoding_length +from .encodable_sequences import EncodableSequences, EncodingError from .regression_target import to_ic50, from_ic50 from .common import random_peptides, amino_acid_distribution -from .custom_loss import CUSTOM_LOSSES +from .custom_loss import get_loss +from .data_dependent_weights_initialization import lsuv_init + + +DEFAULT_PREDICT_BATCH_SIZE = 4096 +if os.environ.get("MHCFLURRY_DEFAULT_PREDICT_BATCH_SIZE"): + DEFAULT_PREDICT_BATCH_SIZE = int(os.environ[ + "MHCFLURRY_DEFAULT_PREDICT_BATCH_SIZE" + ]) + logging.info( + "Configured default predict batch size: %d" % DEFAULT_PREDICT_BATCH_SIZE) class Class1NeuralNetwork(object): """ Low level class I predictor consisting of a single neural network. - Both single allele and pan-allele prediction are supported, but pan-allele - is in development and not yet well performing. + Both single allele and pan-allele prediction are supported. Users will generally use Class1AffinityPredictor, which gives a higher-level interface and supports ensembles. """ network_hyperparameter_defaults = HyperparameterDefaults( - kmer_size=15, - peptide_amino_acid_encoding="BLOSUM62", - embedding_input_dim=21, - embedding_output_dim=8, + allele_amino_acid_encoding="BLOSUM62", allele_dense_layer_sizes=[], + peptide_encoding={ + 'vector_encoding_name': 'BLOSUM62', + 'alignment_method': 'pad_middle', + 'left_edge': 4, + 'right_edge': 4, + 'max_length': 15, + }, peptide_dense_layer_sizes=[], peptide_allele_merge_method="multiply", peptide_allele_merge_activation="", @@ -44,7 +59,6 @@ class Class1NeuralNetwork(object): output_activation="sigmoid", dropout_probability=0.0, batch_normalization=False, - embedding_init_method="glorot_uniform", locally_connected_layers=[ { "filters": 8, @@ -52,6 +66,7 @@ class Class1NeuralNetwork(object): "kernel_size": 3 } ], + num_outputs=1, ) """ Hyperparameters (and their default values) that affect the neural network @@ -68,31 +83,26 @@ class Class1NeuralNetwork(object): used. """ - input_encoding_hyperparameter_defaults = HyperparameterDefaults( - left_edge=4, - right_edge=4) - """ - Number of amino acid residues that are given fixed positions on the each - side in the variable length encoding. - """ - fit_hyperparameter_defaults = HyperparameterDefaults( max_epochs=500, validation_split=0.1, early_stopping=True, minibatch_size=128, + data_dependent_initialization_method=None, random_negative_rate=0.0, random_negative_constant=25, random_negative_affinity_min=20000.0, random_negative_affinity_max=50000.0, random_negative_match_distribution=True, - random_negative_distribution_smoothing=0.0) + random_negative_distribution_smoothing=0.0, + random_negative_output_indices=None) """ Hyperparameters for neural network training. """ early_stopping_hyperparameter_defaults = HyperparameterDefaults( patience=20, + min_delta=0.0, ) """ Hyperparameters for early stopping. @@ -108,7 +118,6 @@ class Class1NeuralNetwork(object): hyperparameter_defaults = network_hyperparameter_defaults.extend( compile_hyperparameter_defaults).extend( - input_encoding_hyperparameter_defaults).extend( fit_hyperparameter_defaults).extend( early_stopping_hyperparameter_defaults).extend( miscelaneous_hyperparameter_defaults @@ -130,6 +139,13 @@ class Class1NeuralNetwork(object): "verbose": None, "mode": None, "take_best_epoch": None, + 'kmer_size': None, + 'peptide_amino_acid_encoding': None, + 'embedding_input_dim': None, + 'embedding_output_dim': None, + 'embedding_init_method': None, + 'left_edge': None, + 'right_edge': None, } @classmethod @@ -153,7 +169,6 @@ class Class1NeuralNetwork(object): hyperparameters[to_name] = value return hyperparameters - def __init__(self, **hyperparameters): self.hyperparameters = self.hyperparameter_defaults.with_defaults( self.apply_hyperparameter_renames(hyperparameters)) @@ -253,12 +268,30 @@ class Class1NeuralNetwork(object): return self._network def update_network_description(self): + """ + Update self.network_json and self.network_weights properties based on + this instances's neural network. + """ if self._network is not None: self.network_json = self._network.to_json() self.network_weights = self._network.get_weights() @staticmethod def keras_network_cache_key(network_json): + """ + Given a Keras JSON description of a neural network, return a key that + uniquely defines this network. Networks that share the same key should + have compatible weights matrices and give the same prediction outputs + when their weights are the same. + + Parameters + ---------- + network_json : string + + Returns + ------- + string + """ # As an optimization, we remove anything about regularization as these # do not affect predictions. def drop_properties(d): @@ -329,8 +362,8 @@ class Class1NeuralNetwork(object): Returns ------- - list of numpy.array giving weights for each layer - or None if there is no network + list of numpy.array giving weights for each layer or None if there is no + network """ self.update_network_description() self.load_weights() @@ -373,22 +406,8 @@ class Class1NeuralNetwork(object): numpy.array """ encoder = EncodableSequences.create(peptides) - if (self.hyperparameters['peptide_amino_acid_encoding'] == "embedding"): - encoded = encoder.variable_length_to_fixed_length_categorical( - max_length=self.hyperparameters['kmer_size'], - **self.input_encoding_hyperparameter_defaults.subselect( - self.hyperparameters)) - elif ( - self.hyperparameters['peptide_amino_acid_encoding'] in - available_vector_encodings()): - encoded = encoder.variable_length_to_fixed_length_vector_encoding( - self.hyperparameters['peptide_amino_acid_encoding'], - max_length=self.hyperparameters['kmer_size'], - **self.input_encoding_hyperparameter_defaults.subselect( - self.hyperparameters)) - else: - raise ValueError("Unsupported peptide_amino_acid_encoding: %s" % - self.hyperparameters['peptide_amino_acid_encoding']) + encoded = encoder.variable_length_to_fixed_length_vector_encoding( + **self.hyperparameters['peptide_encoding']) assert len(encoded) == len(peptides) return encoded @@ -402,10 +421,16 @@ class Class1NeuralNetwork(object): (int, int) tuple """ - return ( - self.hyperparameters['left_edge'] + - self.hyperparameters['right_edge'], - self.hyperparameters['kmer_size']) + # We currently have an arbitrary hard floor of 5, even if the underlying + # peptide encoding supports smaller lengths. + # + # We empirically find the supported peptide lengths based on the + # lengths for which peptides_to_network_input throws ValueError. + try: + self.peptides_to_network_input([""]) + except EncodingError as e: + return e.supported_peptide_lengths + raise RuntimeError("peptides_to_network_input did not raise") def allele_encoding_to_network_input(self, allele_encoding): """ @@ -418,9 +443,234 @@ class Class1NeuralNetwork(object): Returns ------- - numpy.array + (numpy.array, numpy.array) + + Indices and allele representations. + + """ + return ( + allele_encoding.indices, + allele_encoding.allele_representations( + self.hyperparameters['allele_amino_acid_encoding'])) + + @staticmethod + def data_dependent_weights_initialization( + network, + x_dict=None, + method="lsuv", + verbose=1): + """ + Data dependent weights initialization. + + Parameters + ---------- + network : keras.Model + x_dict : dict of string -> numpy.ndarray + Training data as would be passed keras.Model.fit(). + method : string + Initialization method. Currently only "lsuv" is supported. + verbose : int + Status updates printed to stdout if verbose > 0 """ - return allele_encoding.fixed_length_vector_encoded_sequences("BLOSUM62") + if verbose: + print("Performing data-dependent init: ", method) + if method == "lsuv": + assert x_dict is not None, "Data required for LSUV init" + lsuv_init(network, x_dict, verbose=verbose > 0) + else: + raise RuntimeError("Unsupported init method: ", method) + + def fit_generator( + self, + generator, + validation_peptide_encoding, + validation_affinities, + validation_allele_encoding=None, + validation_inequalities=None, + validation_output_indices=None, + steps_per_epoch=10, + epochs=1000, + min_epochs=0, + patience=10, + min_delta=0.0, + verbose=1, + progress_callback=None, + progress_preamble="", + progress_print_interval=5.0): + """ + Fit using a generator. Does not support many of the features of fit(), + such as random negative peptides. + + Fitting proceeds until early stopping is hit, using the peptides, + affinities, etc. given by the parameters starting with "validation_". + + This is used for pre-training pan-allele models using data synthesized + by the allele-specific models. + + Parameters + ---------- + generator : generator yielding (alleles, peptides, affinities) tuples + where alleles and peptides are lists of strings, and affinities + is list of floats. + validation_peptide_encoding : EncodableSequences + validation_affinities : list of float + validation_allele_encoding : AlleleEncoding + validation_inequalities : list of string + validation_output_indices : list of int + steps_per_epoch : int + epochs : int + min_epochs : int + patience : int + min_delta : float + verbose : int + progress_callback : thunk + progress_preamble : string + progress_print_interval : float + """ + from keras import backend as K + + fit_info = collections.defaultdict(list) + + loss = get_loss(self.hyperparameters['loss']) + + (validation_allele_input, allele_representations) = ( + self.allele_encoding_to_network_input(validation_allele_encoding)) + + if self.network() is None: + self._network = self.make_network( + allele_representations=allele_representations, + **self.network_hyperparameter_defaults.subselect( + self.hyperparameters)) + if verbose > 0: + self.network().summary() + network = self.network() + + network.compile( + loss=loss.loss, optimizer=self.hyperparameters['optimizer']) + network._make_predict_function() + self.set_allele_representations(allele_representations) + + if self.hyperparameters['learning_rate'] is not None: + K.set_value( + self.network().optimizer.lr, + self.hyperparameters['learning_rate']) + fit_info["learning_rate"] = float( + K.get_value(self.network().optimizer.lr)) + + validation_x_dict = { + 'peptide': self.peptides_to_network_input( + validation_peptide_encoding), + 'allele': validation_allele_input, + } + encode_y_kwargs = {} + if validation_inequalities is not None: + encode_y_kwargs["inequalities"] = validation_inequalities + if validation_output_indices is not None: + encode_y_kwargs["output_indices"] = validation_output_indices + + output = loss.encode_y( + from_ic50(validation_affinities), **encode_y_kwargs) + + validation_y_dict = { + 'output': output, + } + + mutable_generator_state = { + 'yielded_values': 0 # total number of data points yielded + } + + def wrapped_generator(): + for (alleles, peptides, affinities) in generator: + (allele_encoding_input, _) = ( + self.allele_encoding_to_network_input(alleles)) + x_dict = { + 'peptide': self.peptides_to_network_input(peptides), + 'allele': allele_encoding_input, + } + y_dict = { + 'output': from_ic50(affinities) + } + yield (x_dict, y_dict) + mutable_generator_state['yielded_values'] += len(affinities) + + start = time.time() + + iterator = wrapped_generator() + + # Initialization required if a data_dependent_initialization_method + # is set and this is our first time fitting (i.e. fit_info is empty). + data_dependent_init = self.hyperparameters[ + 'data_dependent_initialization_method' + ] + if data_dependent_init and not self.fit_info: + first_chunk = next(iterator) + self.data_dependent_weights_initialization( + network, + first_chunk[0], # x_dict + method=data_dependent_init, + verbose=verbose) + iterator = itertools.chain([first_chunk], iterator) + + min_val_loss_iteration = None + min_val_loss = None + last_progress_print = 0 + epoch = 1 + while True: + epoch_start_time = time.time() + fit_history = network.fit_generator( + iterator, + steps_per_epoch=steps_per_epoch, + initial_epoch=epoch - 1, + epochs=epoch, + use_multiprocessing=False, + workers=0, + validation_data=(validation_x_dict, validation_y_dict), + verbose=verbose, + ) + epoch_time = time.time() - epoch_start_time + for (key, value) in fit_history.history.items(): + fit_info[key].extend(value) + val_loss = fit_info['val_loss'][-1] + + if min_val_loss is None or val_loss < min_val_loss - min_delta: + min_val_loss = val_loss + min_val_loss_iteration = epoch + + patience_epoch_threshold = min( + epochs, max(min_val_loss_iteration + patience, min_epochs)) + + progress_message = ( + "epoch %3d/%3d [%0.2f sec.]: loss=%g val_loss=%g. Min val " + "loss %g at epoch %s. Cum. points: %d. Stop at epoch %d." % ( + epoch, + epochs, + epoch_time, + fit_info['loss'][-1], + val_loss, + min_val_loss, + min_val_loss_iteration, + mutable_generator_state['yielded_values'], + patience_epoch_threshold, + )).strip() + + # Print progress no more often than once every few seconds. + if progress_print_interval is not None and ( + time.time() - last_progress_print > progress_print_interval): + print(progress_preamble, progress_message) + last_progress_print = time.time() + + if progress_callback: + progress_callback() + + if epoch >= patience_epoch_threshold: + if progress_print_interval is not None: + print(progress_preamble, "STOPPING", progress_message) + break + epoch += 1 + + fit_info["time"] = time.time() - start + fit_info["num_points"] = mutable_generator_state["yielded_values"] + self.fit_info.append(dict(fit_info)) def fit( self, @@ -428,9 +678,11 @@ class Class1NeuralNetwork(object): affinities, allele_encoding=None, inequalities=None, + output_indices=None, sample_weights=None, shuffle_permutation=None, verbose=1, + progress_callback=None, progress_preamble="", progress_print_interval=5.0): """ @@ -443,7 +695,7 @@ class Class1NeuralNetwork(object): affinities : list of float nM affinities. Must be same length of as peptides. - allele_encoding : AlleleEncoding, optional + allele_encoding : AlleleEncoding If not specified, the model will be a single-allele predictor. inequalities : list of string, each element one of ">", "<", or "=". @@ -451,21 +703,27 @@ class Class1NeuralNetwork(object): Each element must be one of ">", "<", or "=". For example, a ">" will train on y_pred > y_true for that element in the training set. Requires using a custom losses that support inequalities (e.g. - mse_with_ineqalities). - If None all inequalities are taken to be "=". - - sample_weights : list of float, optional + mse_with_ineqalities). If None all inequalities are taken to be "=". + + output_indices : list of int + For multi-output models only. Same length as affinities. Indicates + the index of the output (starting from 0) for each training example. + + sample_weights : list of float If not specified, all samples (including random negatives added during training) will have equal weight. If specified, the random negatives will be assigned weight=1.0. - shuffle_permutation : list of int, optional + shuffle_permutation : list of int Permutation (integer list) of same length as peptides and affinities If None, then a random permutation will be generated. verbose : int Keras verbosity level + progress_callback : function + No-argument function to call after each epoch. + progress_preamble : string Optional string of information to include in each progress update @@ -473,8 +731,10 @@ class Class1NeuralNetwork(object): How often (in seconds) to print progress update. Set to None to disable. """ + from keras import backend as K encodable_peptides = EncodableSequences.create(peptides) peptide_encoding = self.peptides_to_network_input(encodable_peptides) + fit_info = collections.defaultdict(list) length_counts = ( pandas.Series(encodable_peptides.sequences) @@ -500,8 +760,8 @@ class Class1NeuralNetwork(object): "Using amino acid distribution for random negative:\n%s" % ( str(aa_distribution.to_dict()))) - y_values = from_ic50(affinities) - assert numpy.isnan(y_values).sum() == 0, numpy.isnan(y_values).sum() + y_values = from_ic50(numpy.array(affinities, copy=False)) + assert numpy.isnan(y_values).sum() == 0, y_values if inequalities is not None: # Reverse inequalities because from_ic50() flips the direction # (i.e. lower affinity results in higher y values). @@ -518,72 +778,74 @@ class Class1NeuralNetwork(object): x_dict_without_random_negatives = { 'peptide': peptide_encoding, } - allele_encoding_dims = None + allele_representations = None if allele_encoding is not None: - allele_encoding_input = self.allele_encoding_to_network_input( - allele_encoding) - allele_encoding_dims = allele_encoding_input.shape[1:] + (allele_encoding_input, allele_representations) = ( + self.allele_encoding_to_network_input(allele_encoding)) x_dict_without_random_negatives['allele'] = allele_encoding_input # Shuffle y_values and the contents of x_dict_without_random_negatives - # This ensures different data is used for the test set for early stopping - # when multiple models are trained. + # This ensures different data is used for the test set for early + # stopping when multiple models are trained. if shuffle_permutation is None: shuffle_permutation = numpy.random.permutation(len(y_values)) y_values = y_values[shuffle_permutation] + assert numpy.isnan(y_values).sum() == 0, y_values peptide_encoding = peptide_encoding[shuffle_permutation] adjusted_inequalities = adjusted_inequalities[shuffle_permutation] for key in x_dict_without_random_negatives: x_dict_without_random_negatives[key] = ( x_dict_without_random_negatives[key][shuffle_permutation]) if sample_weights is not None: - sample_weights = sample_weights[shuffle_permutation] + sample_weights = numpy.array(sample_weights, copy=False)[ + shuffle_permutation + ] + if output_indices is not None: + output_indices = numpy.array(output_indices, copy=False)[ + shuffle_permutation + ] - if self.hyperparameters['loss'].startswith("custom:"): - # Using a custom loss that supports inequalities - try: - custom_loss = CUSTOM_LOSSES[ - self.hyperparameters['loss'].replace("custom:", "") - ] - except KeyError: - raise ValueError( - "No such custom loss function: %s. Supported losses are: %s" % ( - self.hyperparameters['loss'], - ", ".join([ - "custom:" + loss_name for loss_name in CUSTOM_LOSSES - ]))) - loss_name_or_function = custom_loss.loss - loss_supports_inequalities = custom_loss.supports_inequalities - loss_encode_y_function = custom_loss.encode_y - else: - # Using a regular keras loss. No inequalities supported. - loss_name_or_function = self.hyperparameters['loss'] - loss_supports_inequalities = False - loss_encode_y_function = None + loss = get_loss(self.hyperparameters['loss']) - if not loss_supports_inequalities and ( + if not loss.supports_inequalities and ( any(inequality != "=" for inequality in adjusted_inequalities)): - raise ValueError("Loss %s does not support inequalities" % ( - loss_name_or_function)) + raise ValueError("Loss %s does not support inequalities" % loss) + + if (not loss.supports_multiple_outputs and output_indices is not None + and (output_indices != 0).any()): + raise ValueError("Loss %s does not support multiple outputs" % loss) + + if self.hyperparameters['num_outputs'] != 1: + if output_indices is None: + raise ValueError( + "Must supply output_indices for multi-output predictor") if self.network() is None: self._network = self.make_network( - allele_encoding_dims=allele_encoding_dims, + allele_representations=allele_representations, **self.network_hyperparameter_defaults.subselect( self.hyperparameters)) - self.network().compile( - loss=loss_name_or_function, - optimizer=self.hyperparameters['optimizer']) + if verbose > 0: + self.network().summary() + + if allele_representations is not None: + self.set_allele_representations(allele_representations) + + self.network().compile( + loss=loss.loss, optimizer=self.hyperparameters['optimizer']) if self.hyperparameters['learning_rate'] is not None: - from keras import backend as K K.set_value( self.network().optimizer.lr, self.hyperparameters['learning_rate']) + fit_info["learning_rate"] = float( + K.get_value(self.network().optimizer.lr)) - if loss_supports_inequalities: + if loss.supports_inequalities: # Do not sample negative affinities: just use an inequality. - random_negative_ic50 = self.hyperparameters['random_negative_affinity_min'] + random_negative_ic50 = self.hyperparameters[ + 'random_negative_affinity_min' + ] random_negative_target = from_ic50(random_negative_ic50) y_dict_with_random_negatives = { @@ -612,6 +874,9 @@ class Class1NeuralNetwork(object): y_values, ]), } + adjusted_inequalities_with_random_negatives = None + assert numpy.isnan(y_dict_with_random_negatives['output']).sum() == 0, ( + y_dict_with_random_negatives) if sample_weights is not None: sample_weights_with_random_negatives = numpy.concatenate([ numpy.ones(int(num_random_negative.sum())), @@ -619,16 +884,40 @@ class Class1NeuralNetwork(object): else: sample_weights_with_random_negatives = None - if loss_encode_y_function is not None: - y_dict_with_random_negatives['output'] = loss_encode_y_function( - y_dict_with_random_negatives['output'], + if output_indices is not None: + random_negative_output_indices = ( + self.hyperparameters['random_negative_output_indices'] + if self.hyperparameters['random_negative_output_indices'] + else list(range(0, self.hyperparameters['num_outputs']))) + output_indices_with_random_negatives = numpy.concatenate([ + pandas.Series(random_negative_output_indices, dtype=int).sample( + n=int(num_random_negative.sum()), replace=True).values, + output_indices + ]) + else: + output_indices_with_random_negatives = None + + encode_y_kwargs = {} + if adjusted_inequalities_with_random_negatives is not None: + encode_y_kwargs["inequalities"] = ( adjusted_inequalities_with_random_negatives) + if output_indices_with_random_negatives is not None: + encode_y_kwargs["output_indices"] = ( + output_indices_with_random_negatives) + + y_dict_with_random_negatives['output'] = loss.encode_y( + y_dict_with_random_negatives['output'], + **encode_y_kwargs) - val_losses = [] min_val_loss_iteration = None min_val_loss = None - fit_info = collections.defaultdict(list) + # Initialization required if a data_dependent_initialization_method + # is set and this is our first time fitting (i.e. fit_info is empty). + needs_initialization = self.hyperparameters[ + 'data_dependent_initialization_method' + ] is not None and not self.fit_info + start = time.time() last_progress_print = None x_dict_with_random_negatives = {} @@ -680,15 +969,27 @@ class Class1NeuralNetwork(object): ] ) + if needs_initialization: + self.data_dependent_weights_initialization( + self.network(), + x_dict_with_random_negatives, + method=self.hyperparameters[ + 'data_dependent_initialization_method'], + verbose=verbose) + needs_initialization = False + + epoch_start = time.time() fit_history = self.network().fit( x_dict_with_random_negatives, y_dict_with_random_negatives, shuffle=True, batch_size=self.hyperparameters['minibatch_size'], verbose=verbose, - epochs=1, + epochs=i + 1, + initial_epoch=i, validation_split=self.hyperparameters['validation_split'], sample_weight=sample_weights_with_random_negatives) + epoch_time = time.time() - epoch_start for (key, value) in fit_history.history.items(): fit_info[key].extend(value) @@ -699,10 +1000,11 @@ class Class1NeuralNetwork(object): time.time() - last_progress_print > progress_print_interval)): print((progress_preamble + " " + - "Epoch %3d / %3d: loss=%g. " + "Epoch %3d / %3d [%0.2f sec]: loss=%g. " "Min val loss (%s) at epoch %s" % ( i, self.hyperparameters['max_epochs'], + epoch_time, fit_info['loss'][-1], str(min_val_loss), min_val_loss_iteration)).strip()) @@ -710,9 +1012,9 @@ class Class1NeuralNetwork(object): if self.hyperparameters['validation_split']: val_loss = fit_info['val_loss'][-1] - val_losses.append(val_loss) - if min_val_loss is None or val_loss <= min_val_loss: + if min_val_loss is None or ( + val_loss < min_val_loss - self.hyperparameters['min_delta']): min_val_loss = val_loss min_val_loss_iteration = i @@ -724,26 +1026,37 @@ class Class1NeuralNetwork(object): if progress_print_interval is not None: print((progress_preamble + " " + "Stopping at epoch %3d / %3d: loss=%g. " - "Min val loss (%s) at epoch %s" % ( + "Min val loss (%g) at epoch %s" % ( i, self.hyperparameters['max_epochs'], fit_info['loss'][-1], - str(min_val_loss), + ( + min_val_loss if min_val_loss is not None + else numpy.nan), min_val_loss_iteration)).strip()) break + if progress_callback: + progress_callback() + fit_info["time"] = time.time() - start fit_info["num_points"] = len(peptides) self.fit_info.append(dict(fit_info)) - def predict(self, peptides, allele_encoding=None, batch_size=4096): + def predict( + self, + peptides, + allele_encoding=None, + batch_size=DEFAULT_PREDICT_BATCH_SIZE, + output_index=0): """ Predict affinities. If peptides are specified as EncodableSequences, then the predictions - will be cached for this predictor as long as the EncodableSequences object - remains in memory. The cache is keyed in the object identity of the - EncodableSequences, not the sequences themselves. + will be cached for this predictor as long as the EncodableSequences + object remains in memory. The cache is keyed in the object identity of + the EncodableSequences, not the sequences themselves. The cache is used + only for allele-specific models (i.e. when allele_encoding is None). Parameters ---------- @@ -755,6 +1068,10 @@ class Class1NeuralNetwork(object): batch_size : int batch_size passed to Keras + output_index : int or None + For multi-output models. Gives the output index to return. If set to + None, then all outputs are returned as a samples x outputs matrix. + Returns ------- numpy.array of nM affinity predictions @@ -769,25 +1086,135 @@ class Class1NeuralNetwork(object): x_dict = { 'peptide': self.peptides_to_network_input(peptides) } - if allele_encoding is not None: - allele_input = self.allele_encoding_to_network_input(allele_encoding) - x_dict['allele'] = allele_input - network = self.network(borrow=True) + if allele_encoding is not None: + (allele_encoding_input, allele_representations) = ( + self.allele_encoding_to_network_input(allele_encoding)) + x_dict['allele'] = allele_encoding_input + self.set_allele_representations(allele_representations) + network = self.network() + else: + network = self.network(borrow=True) raw_predictions = network.predict(x_dict, batch_size=batch_size) - predictions = numpy.array(raw_predictions, dtype = "float64")[:,0] + predictions = numpy.array(raw_predictions, dtype = "float64") + if output_index is not None: + predictions = predictions[:,output_index] result = to_ic50(predictions) if use_cache: self.prediction_cache[peptides] = result return result - @staticmethod + @classmethod + def merge(cls, models, merge_method="average"): + """ + Merge multiple models at the tensorflow (or other backend) level. + + Only certain neural network architectures support merging. Others will + result in a NotImplementedError. + + Parameters + ---------- + models : list of Class1NeuralNetwork + instances to merge + merge_method : string, one of "average", "sum", or "concatenate" + How to merge the predictions of the different models + + Returns + ------- + Class1NeuralNetwork + The merged neural network + + """ + import keras + import keras.backend as K + from keras.layers import Input + from keras.models import Model + + if len(models) == 1: + return models[0] + assert len(models) > 1 + + result = Class1NeuralNetwork(**dict(models[0].hyperparameters)) + + # Remove hyperparameters that are not shared by all models. + for model in models: + for (key, value) in model.hyperparameters.items(): + if result.hyperparameters.get(key, value) != value: + del result.hyperparameters[key] + + assert result._network is None + + networks = [ + model.network() for model in models + ] + + layer_names = [ + [layer.name for layer in network.layers] + for network in networks + ] + + pan_allele_layer_names = [ + 'allele', 'peptide', 'allele_representation', 'flattened_0', + 'allele_flat', 'allele_peptide_merged', 'dense_0', 'dropout_0', + 'dense_1', 'dropout_1', 'output', + ] + + if all(names == pan_allele_layer_names for names in layer_names): + # Merging an ensemble of pan-allele architectures + network = networks[0] + peptide_input = Input( + shape=tuple(int(x) for x in K.int_shape(network.inputs[0])[1:]), + dtype='float32', + name='peptide') + allele_input = Input( + shape=(1,), + dtype='float32', + name='allele') + + allele_embedding = network.get_layer( + "allele_representation")(allele_input) + peptide_flat = network.get_layer("flattened_0")(peptide_input) + allele_flat = network.get_layer("allele_flat")(allele_embedding) + allele_peptide_merged = network.get_layer("allele_peptide_merged")( + [peptide_flat, allele_flat]) + + sub_networks = [] + for (i, network) in enumerate(networks): + layers = network.layers[ + pan_allele_layer_names.index("allele_peptide_merged") + 1: + ] + node = allele_peptide_merged + for layer in layers: + layer.name += "_%d" % i + node = layer(node) + sub_networks.append(node) + + if merge_method == 'average': + output = keras.layers.average(sub_networks) + elif merge_method == 'sum': + output = keras.layers.add(sub_networks) + elif merge_method == 'concatenate': + output = keras.layers.concatenate(sub_networks) + else: + raise NotImplementedError( + "Unsupported merge method", merge_method) + + result._network = Model( + inputs=[peptide_input, allele_input], + outputs=[output], + name="merged_predictor" + ) + result.update_network_description() + else: + raise NotImplementedError( + "Don't know merge_method to merge networks with layer names: ", + layer_names) + return result + def make_network( - allele_encoding_dims, - kmer_size, - peptide_amino_acid_encoding, - embedding_input_dim, - embedding_output_dim, + self, + peptide_encoding, + allele_amino_acid_encoding, allele_dense_layer_sizes, peptide_dense_layer_sizes, peptide_allele_merge_method, @@ -800,10 +1227,11 @@ class Class1NeuralNetwork(object): output_activation, dropout_probability, batch_normalization, - embedding_init_method, - locally_connected_layers): + locally_connected_layers, + num_outputs=1, + allele_representations=None): """ - Helper function to make a keras network for class1 affinity prediction. + Helper function to make a keras network for class 1 affinity prediction. """ # We import keras here to avoid tensorflow debug output, etc. unless we @@ -815,23 +1243,12 @@ class Class1NeuralNetwork(object): from keras.layers.embeddings import Embedding from keras.layers.normalization import BatchNormalization - if peptide_amino_acid_encoding == "embedding": - peptide_input = Input( - shape=(kmer_size,), dtype='int32', name='peptide') - current_layer = Embedding( - input_dim=embedding_input_dim, - output_dim=embedding_output_dim, - input_length=kmer_size, - embeddings_initializer=embedding_init_method, - name="peptide_embedding")(peptide_input) - else: - peptide_input = Input( - shape=( - kmer_size, - vector_encoding_length(peptide_amino_acid_encoding)), - dtype='float32', - name='peptide') - current_layer = peptide_input + peptide_encoding_shape = self.peptides_to_network_input([]).shape[1:] + peptide_input = Input( + shape=peptide_encoding_shape, + dtype='float32', + name='peptide') + current_layer = peptide_input inputs = [peptide_input] @@ -859,32 +1276,36 @@ class Class1NeuralNetwork(object): current_layer = BatchNormalization(name="batch_norm_early")( current_layer) - if dropout_probability: - current_layer = Dropout(dropout_probability, name="dropout_early")( - current_layer) - - if allele_encoding_dims: + if allele_representations is not None: allele_input = Input( - shape=allele_encoding_dims, + shape=(1,), dtype='float32', name='allele') inputs.append(allele_input) - allele_embedding_layer = Flatten(name="allele_flat")(allele_input) + + allele_layer = Embedding( + name="allele_representation", + input_dim=allele_representations.shape[0], + output_dim=numpy.product(allele_representations.shape[1:], dtype=int), + input_length=1, + trainable=False)(allele_input) for (i, layer_size) in enumerate(allele_dense_layer_sizes): - allele_embedding_layer = Dense( + allele_layer = Dense( layer_size, name="allele_dense_%d" % i, kernel_regularizer=kernel_regularizer, - activation=activation)(allele_embedding_layer) + activation=activation)(allele_layer) + + allele_layer = Flatten(name="allele_flat")(allele_layer) if peptide_allele_merge_method == 'concatenate': current_layer = keras.layers.concatenate([ - current_layer, allele_embedding_layer + current_layer, allele_layer ], name="allele_peptide_merged") elif peptide_allele_merge_method == 'multiply': current_layer = keras.layers.multiply([ - current_layer, allele_embedding_layer + current_layer, allele_layer ], name="allele_peptide_merged") else: raise ValueError( @@ -905,15 +1326,16 @@ class Class1NeuralNetwork(object): name="dense_%d" % i)(current_layer) if batch_normalization: - current_layer = BatchNormalization(name="batch_norm_%d" % i)\ - (current_layer) + current_layer = BatchNormalization( + name="batch_norm_%d" % i)(current_layer) if dropout_probability > 0: current_layer = Dropout( - dropout_probability, name="dropout_%d" % i)(current_layer) + rate=1 - dropout_probability, + name="dropout_%d" % i)(current_layer) output = Dense( - 1, + num_outputs, kernel_initializer=init, activation=output_activation, name="output")(current_layer) @@ -921,4 +1343,77 @@ class Class1NeuralNetwork(object): inputs=inputs, outputs=[output], name="predictor") + return model + + def set_allele_representations(self, allele_representations): + """ + Set the allele representations in use by this model. This means mutating + the weights for the allele input embedding layer. + + Rationale: instead of passing in the allele sequence for each data point + during model training or prediction (which is expensive in terms of + memory usage), we pass in an allele index between 0 and n-1 where n is + the number of alleles in some universe of possible alleles. This index + is used in the model to lookup the corresponding allele sequence. This + function sets the lookup table. + + See also: AlleleEncoding.allele_representations() + + Parameters + ---------- + allele_representations : numpy.ndarray of shape (a, l, m) + where a is the total number of alleles, + l is the allele sequence length, + m is the length of the vectors used to represent amino acids + """ + from keras.models import clone_model + import keras.backend as K + import tensorflow as tf + + reshaped = allele_representations.reshape( + (allele_representations.shape[0], -1)) + original_model = self.network() + layer = original_model.get_layer("allele_representation") + existing_weights_shape = (layer.input_dim, layer.output_dim) + + # Only changes to the number of supported alleles (not the length of + # the allele sequences) are allowed. + assert existing_weights_shape[1:] == reshaped.shape[1:] + + if existing_weights_shape[0] > reshaped.shape[0]: + # Extend with NaNs so we can avoid having to reshape the weights + # matrix, which is expensive. + reshaped = numpy.append( + reshaped, + numpy.ones([ + existing_weights_shape[0] - reshaped.shape[0], + reshaped.shape[1] + ]) * numpy.nan, + axis=0) + + if existing_weights_shape != reshaped.shape: + # Network surgery required. Make a new network with this layer's + # dimensions changed. Kind of a hack. + layer.input_dim = reshaped.shape[0] + new_model = clone_model(original_model) + + # copy weights for other layers over + for layer in new_model.layers: + if layer.name != "allele_representation": + layer.set_weights( + original_model.get_layer(name=layer.name).get_weights()) + + self._network = new_model + self.update_network_description() + + layer = new_model.get_layer("allele_representation") + + # Disable the old model to catch bugs. + def throw(*args, **kwargs): + raise RuntimeError("Using a disabled model!") + original_model.predict = \ + original_model.fit = \ + original_model.fit_generator = throw + + layer.set_weights([reshaped]) diff --git a/mhcflurry/cluster_parallelism.py b/mhcflurry/cluster_parallelism.py new file mode 100644 index 0000000000000000000000000000000000000000..9ec07de96283da2a351053297fee719f7cb20499 --- /dev/null +++ b/mhcflurry/cluster_parallelism.py @@ -0,0 +1,351 @@ +""" +Simple, relatively naive parallel map implementation for HPC clusters. + +Used for training MHCflurry models. +""" +import traceback +import sys +import os +import time +import signal +import argparse +import pickle +import subprocess +import shutil + +from .local_parallelism import call_wrapped_kwargs +from .class1_affinity_predictor import Class1AffinityPredictor + +try: + from shlex import quote +except ImportError: + from pipes import quote + + +def add_cluster_parallelism_args(parser): + """ + Add commandline arguments controlling cluster parallelism to an argparse + ArgumentParser. + + Parameters + ---------- + parser : argparse.ArgumentParser + """ + group = parser.add_argument_group("Cluster parallelism") + group.add_argument( + "--cluster-parallelism", + default=False, + action="store_true") + group.add_argument( + "--cluster-submit-command", + default='sh', + help="Default: %(default)s") + group.add_argument( + "--cluster-results-workdir", + default='./cluster-workdir', + help="Default: %(default)s") + group.add_argument( + '--cluster-script-prefix-path', + help="", + ) + group.add_argument('--cluster-max-retries', help="", default=3) + + +def cluster_results_from_args( + args, + work_function, + work_items, + constant_data=None, + result_serialization_method="pickle", + clear_constant_data=False): + """ + Parallel map configurable using commandline arguments. See the + cluster_results() function for docs. + + The `args` parameter should be an argparse.Namespace from an argparse parser + generated using the add_cluster_parallelism_args() function. + + + Parameters + ---------- + args + work_function + work_items + constant_data + result_serialization_method + clear_constant_data + + Returns + ------- + generator + """ + return cluster_results( + work_function=work_function, + work_items=work_items, + constant_data=constant_data, + submit_command=args.cluster_submit_command, + results_workdir=args.cluster_results_workdir, + script_prefix_path=args.cluster_script_prefix_path, + result_serialization_method=result_serialization_method, + clear_constant_data=clear_constant_data + ) + + +def cluster_results( + work_function, + work_items, + constant_data=None, + submit_command="sh", + results_workdir="./cluster-workdir", + script_prefix_path=None, + result_serialization_method="pickle", + max_retries=3, + clear_constant_data=False): + """ + Parallel map on an HPC cluster. + + Returns [work_function(item) for item in work_items] where each invocation + of work_function is performed as a separate HPC cluster job. Order is + preserved. + + Optionally, "constant data" can be specified, which will be passed to + each work_function() invocation as a keyword argument called constant_data. + This data is serialized once and all workers read it from the same source, + which is more efficient than serializing it separately for each worker. + + Each worker's input is serialized to a shared NFS directory and the + submit_command is used to launch a job to process that input. The shared + filesystem is polled occasionally to watch for results, which are fed back + to the user. + + Parameters + ---------- + work_function : A -> B + work_items : list of A + constant_data : object + submit_command : string + For running on LSF, we use "bsub" here. + results_workdir : string + Path to NFS shared directory where inputs and results can be written + script_prefix_path : string + Path to script that will be invoked to run each worker. A line calling + the _mhcflurry-cluster-worker-entry-point command will be appended to + the contents of this file. + result_serialization_method : string, one of "pickle" or "save_predictor" + The "save_predictor" works only when the return type of work_function + is Class1AffinityPredictor + max_retries : int + How many times to attempt to re-launch a failed worker + clear_constant_data : bool + If True, the constant data dict is cleared on the launching host after + it is serialized to disk. + + Returns + ------- + generator of B + """ + + constant_payload = { + 'constant_data': constant_data, + 'function': work_function, + } + work_dir = os.path.join( + os.path.abspath(results_workdir), + str(int(time.time()))) + os.mkdir(work_dir) + + constant_payload_path = os.path.join(work_dir, "global_data.pkl") + with open(constant_payload_path, "wb") as fd: + pickle.dump(constant_payload, fd, protocol=pickle.HIGHEST_PROTOCOL) + print("Wrote:", constant_payload_path) + if clear_constant_data: + constant_data.clear() + print("Cleared constant data to free up memory.") + + if script_prefix_path: + with open(script_prefix_path) as fd: + script_prefix = fd.read() + else: + script_prefix = "#!/bin/bash" + + result_items = [] + + for (i, item) in enumerate(work_items): + item_workdir = os.path.join( + work_dir, "work-item.%03d-of-%03d" % (i, len(work_items))) + os.mkdir(item_workdir) + + item_data_path = os.path.join(item_workdir, "data.pkl") + with open(item_data_path, "wb") as fd: + pickle.dump(item, fd, protocol=pickle.HIGHEST_PROTOCOL) + print("Wrote:", item_data_path) + + item_result_path = os.path.join(item_workdir, "result") + item_error_path = os.path.join(item_workdir, "error.pkl") + item_finished_path = os.path.join(item_workdir, "COMPLETE") + + item_script_pieces = [ + script_prefix.format(work_item_num=i, work_dir=item_workdir) + ] + item_script_pieces.append(" ".join([ + "_mhcflurry-cluster-worker-entry-point", + "--constant-data", quote(constant_payload_path), + "--worker-data", quote(item_data_path), + "--result-out", quote(item_result_path), + "--error-out", quote(item_error_path), + "--complete-dir", quote(item_finished_path), + "--result-serialization-method", result_serialization_method, + ])) + item_script = "\n".join(item_script_pieces) + item_script_path = os.path.join( + item_workdir, + "run.%d.sh" % i) + with open(item_script_path, "w") as fd: + fd.write(item_script) + print("Wrote:", item_script_path) + + launch_command = " ".join([ + submit_command, "<", quote(item_script_path) + ]) + subprocess.check_call(launch_command, shell=True) + print("Invoked", launch_command) + + result_items.append({ + 'work_dir': item_workdir, + 'finished_path': item_finished_path, + 'result_path': item_result_path, + 'error_path': item_error_path, + 'retry_num': 0, + 'launch_command': launch_command, + }) + + def result_generator(): + start = time.time() + while result_items: + print("[%0.1f sec elapsed] waiting on %d / %d items." % ( + time.time() - start, len(result_items), len(work_items))) + while True: + result_item = None + for d in result_items: + if os.path.exists(d['finished_path']): + result_item = d + break + if result_item is None: + time.sleep(60) + else: + result_items.remove(result_item) + break + + complete_dir = result_item['finished_path'] + result_path = result_item['result_path'] + error_path = result_item['error_path'] + retry_num = result_item['retry_num'] + launch_command = result_item['launch_command'] + + print("[%0.1f sec elapsed] processing item %s" % ( + time.time() - start, result_item)) + + if os.path.exists(error_path): + print("Error path exists", error_path) + with open(error_path, "rb") as fd: + exception = pickle.load(fd) + print(exception) + if retry_num < max_retries: + print("Relaunching", launch_command) + attempt_dir = os.path.join( + result_item['work_dir'], "attempt.%d" % retry_num) + shutil.move(complete_dir, attempt_dir) + shutil.move(error_path, attempt_dir) + subprocess.check_call(launch_command, shell=True) + print("Invoked", launch_command) + result_item['retry_num'] += 1 + result_items.append(result_item) + continue + else: + print("Max retries exceeded", max_retries) + raise exception + + if os.path.exists(result_path): + print("Result path exists", result_path) + if result_serialization_method == "save_predictor": + result = Class1AffinityPredictor.load(result_path) + else: + assert result_serialization_method == "pickle" + with open(result_path, "rb") as fd: + result = pickle.load(fd) + yield result + else: + raise RuntimeError("Results do not exist", result_path) + + return result_generator() + + +parser = argparse.ArgumentParser( + usage="Entry point for cluster workers") +parser.add_argument( + "--constant-data", + required=True, +) +parser.add_argument( + "--worker-data", + required=True, +) +parser.add_argument( + "--result-out", + required=True, +) +parser.add_argument( + "--error-out", + required=True, +) +parser.add_argument( + "--complete-dir", +) +parser.add_argument( + "--result-serialization-method", + choices=("pickle", "save_predictor"), + default="pickle") + + +def worker_entry_point(argv=sys.argv[1:]): + """ + Entry point for the worker command. + + Parameters + ---------- + argv : list of string + """ + # On sigusr1 print stack trace + print("To show stack trace, run:\nkill -s USR1 %d" % os.getpid()) + signal.signal(signal.SIGUSR1, lambda sig, frame: traceback.print_stack()) + + args = parser.parse_args(argv) + + with open(args.constant_data, "rb") as fd: + constant_payload = pickle.load(fd) + + with open(args.worker_data, "rb") as fd: + worker_data = pickle.load(fd) + + kwargs = dict(worker_data) + if constant_payload['constant_data'] is not None: + kwargs['constant_data'] = constant_payload['constant_data'] + + try: + result = call_wrapped_kwargs(constant_payload['function'], kwargs) + if args.result_serialization_method == 'save_predictor': + result.save(args.result_out) + else: + with open(args.result_out, "wb") as fd: + pickle.dump(result, fd, pickle.HIGHEST_PROTOCOL) + print("Wrote:", args.result_out) + except Exception as e: + print("Exception: ", e) + with open(args.error_out, "wb") as fd: + pickle.dump(e, fd, pickle.HIGHEST_PROTOCOL) + print("Wrote:", args.error_out) + raise + finally: + if args.complete_dir: + os.mkdir(args.complete_dir) + print("Created: ", args.complete_dir) diff --git a/mhcflurry/common.py b/mhcflurry/common.py index b5120b522dcc4e94d56e8e60a6a2ed75d246f69f..8885637b2e963c98b70dcadf8762cd43cbc2ff4b 100644 --- a/mhcflurry/common.py +++ b/mhcflurry/common.py @@ -147,3 +147,30 @@ def random_peptides(num, length=9, distribution=None): p=distribution.values, size=(int(num), int(length))) ] + + +def positional_frequency_matrix(peptides): + """ + Given a set of peptides, calculate a length x amino acids frequency matrix. + + Parameters + ---------- + peptides : list of string + All of same length + + Returns + ------- + pandas.DataFrame + Index is position, columns are amino acids + """ + length = len(peptides[0]) + assert all(len(peptide) == length for peptide in peptides) + counts = pandas.DataFrame( + index=[a for a in amino_acid.BLOSUM62_MATRIX.index if a != 'X'], + columns=numpy.arange(1, length + 1), + ) + for i in range(length): + counts[i + 1] = pandas.Series([p[i] for p in peptides]).value_counts() + result = (counts / len(peptides)).fillna(0.0).T + result.index.name = 'position' + return result diff --git a/mhcflurry/custom_loss.py b/mhcflurry/custom_loss.py index cc885e003af6ec5105db900efaf3709df429f88e..8c523c0a61ad0576d54c1cd77a15dfdf9ba987c8 100644 --- a/mhcflurry/custom_loss.py +++ b/mhcflurry/custom_loss.py @@ -5,16 +5,78 @@ For losses supporting inequalities, each training data point is associated with one of (=), (<), or (>). For e.g. (>) inequalities, penalization is applied only if the prediction is less than the given value. """ - +from __future__ import division import pandas +import numpy from numpy import isnan, array CUSTOM_LOSSES = {} -class MSEWithInequalities(object): +def get_loss(name): + """ + Get a custom_loss.Loss instance by name. + + Parameters + ---------- + name : string + + Returns + ------- + custom_loss.Loss + """ + if name.startswith("custom:"): + try: + custom_loss = CUSTOM_LOSSES[name.replace("custom:", "")] + except KeyError: + raise ValueError( + "No such custom loss: %s. Supported losses are: %s" % ( + name, + ", ".join([ + "custom:" + loss_name for loss_name in CUSTOM_LOSSES + ]))) + return custom_loss + return StandardKerasLoss(name) + + +class Loss(object): + """ + Thin wrapper to keep track of neural network loss functions, which could + be custom or baked into Keras. + + Each subclass or instance should define these properties/methods: + - name : string + - loss : string or function + This is what gets passed to keras.fit() + - encode_y : numpy.ndarray -> numpy.ndarray + Transformation to apply to regression target before fitting + """ + def __init__(self, name=None): + self.name = name if name else self.name # use name from class instance + + def __str__(self): + return "<Loss: %s>" % self.name + + +class StandardKerasLoss(Loss): + """ + A loss function supported by Keras, such as MSE. """ - Supports training a regressor on data that includes inequalities + supports_inequalities = False + supports_multiple_outputs = False + + def __init__(self, loss_name="mse"): + self.loss = loss_name + Loss.__init__(self, loss_name) + + @staticmethod + def encode_y(y): + return y + + +class MSEWithInequalities(Loss): + """ + Supports training a regression model on data that includes inequalities (e.g. x < 100). Mean square error is used as the loss for elements with an (=) inequality. For elements with e.g. a (> 0.5) inequality, then the loss for that element is (y - 0.5)^2 (standard MSE) if y < 500 and 0 otherwise. @@ -26,29 +88,30 @@ class MSEWithInequalities(object): y_true is interpreted as follows: between 0 - 1 - Regular MSE loss is used. Penality (y_pred - y_true)**2 is applied if + Regular MSE loss is used. Penalty (y_pred - y_true)**2 is applied if y_pred is greater or less than y_true. between 2 - 3: - Treated as a "<" inequality. Penality (y_pred - (y_true - 2))**2 is + Treated as a "<" inequality. Penalty (y_pred - (y_true - 2))**2 is applied only if y_pred is greater than y_true - 2. between 4 - 5: - Treated as a ">" inequality. Penality (y_pred - (y_true - 4))**2 is + Treated as a ">" inequality. Penalty (y_pred - (y_true - 4))**2 is applied only if y_pred is less than y_true - 4. """ name = "mse_with_inequalities" supports_inequalities = True + supports_multiple_outputs = False @staticmethod def encode_y(y, inequalities=None): y = array(y, dtype="float32") if isnan(y).any(): - raise ValueError("y contains NaN") + raise ValueError("y contains NaN", y) if (y > 1.0).any(): - raise ValueError("y contains values > 1.0") + raise ValueError("y contains values > 1.0", y) if (y < 0.0).any(): - raise ValueError("y contains values < 0.0") + raise ValueError("y contains values < 0.0", y) if inequalities is None: encoded = y @@ -66,8 +129,8 @@ class MSEWithInequalities(object): @staticmethod def loss(y_true, y_pred): - # We always delay import of Keras so that mhcflurry can be imported initially - # without tensorflow debug output, etc. + # We always delay import of Keras so that mhcflurry can be imported + # initially without tensorflow debug output, etc. from keras import backend as K # Handle (=) inequalities @@ -86,11 +149,106 @@ class MSEWithInequalities(object): diff3 *= K.cast(y_true >= 4.0, "float32") diff3 *= K.cast(diff3 > 0.0, "float32") - return ( - K.sum(K.square(diff1), axis=-1) + - K.sum(K.square(diff2), axis=-1) + - K.sum(K.square(diff3), axis=-1)) + result = ( + K.sum(K.square(diff1)) + + K.sum(K.square(diff2)) + + K.sum(K.square(diff3))) / K.cast(K.shape(y_pred)[0], "float32") + + return result + + +class MSEWithInequalitiesAndMultipleOutputs(Loss): + """ + Loss supporting inequalities and multiple outputs. + + This loss assumes that the normal range for y_true and y_pred is 0 - 1. As a + hack, the implementation uses other intervals for y_pred to encode the + inequality and output-index information. + + Inequalities are encoded into the regression target as in + the MSEWithInequalities loss. + + Multiple outputs are encoded by mapping each regression target x (after + transforming for inequalities) using the rule x -> x + i * 10 where i is + the output index. + + The reason for explicitly encoding multiple outputs this way (rather than + just making the regression target a matrix instead of a vector) is that + in our use cases we frequently have missing data in the regression target. + This encoding gives a simple way to penalize only on (data point, output + index) pairs that have labels. + """ + name = "mse_with_inequalities_and_multiple_outputs" + supports_inequalities = True + supports_multiple_outputs = True + + @staticmethod + def encode_y(y, inequalities=None, output_indices=None): + y = array(y, dtype="float32") + if isnan(y).any(): + raise ValueError("y contains NaN", y) + if (y > 1.0).any(): + raise ValueError("y contains values > 1.0", y) + if (y < 0.0).any(): + raise ValueError("y contains values < 0.0", y) + + encoded = MSEWithInequalities.encode_y( + y, inequalities=inequalities) + + if output_indices is not None: + output_indices = numpy.array(output_indices) + check_shape("output_indices", output_indices, (len(encoded),)) + if (output_indices < 0).any(): + raise ValueError("Invalid output indices: ", output_indices) + + encoded += output_indices * 10 + + return encoded + + @staticmethod + def loss(y_true, y_pred): + from keras import backend as K + + y_true = K.flatten(y_true) + + output_indices = y_true // 10 + updated_y_true = y_true - (10 * output_indices) + + # We index into y_pred using flattened indices since Keras backend + # supports gather but has no equivalent of tf.gather_nd: + ordinals = K.arange(K.shape(y_true)[0]) + flattened_indices = ( + ordinals * y_pred.shape[1] + K.cast(output_indices, "int32")) + updated_y_pred = K.gather(K.flatten(y_pred), flattened_indices) + + # Alternative implementation using tensorflow, which could be used if + # we drop support for other backends: + # import tensorflow as tf + # indexer = K.stack([ + # ordinals, + # K.cast(output_indices, "int32") + # ], axis=-1) + #updated_y_pred = tf.gather_nd(y_pred, indexer) + + return MSEWithInequalities.loss(updated_y_true, updated_y_pred) + + +def check_shape(name, arr, expected_shape): + """ + Raise ValueError if arr.shape != expected_shape. + + Parameters + ---------- + name : string + Included in error message to aid debugging + arr : numpy.ndarray + expected_shape : tuple of int + """ + if arr.shape != expected_shape: + raise ValueError("Expected %s to have shape %s not %s" % ( + name, str(expected_shape), str(arr.shape))) + # Register custom losses. -for cls in [MSEWithInequalities]: - CUSTOM_LOSSES[cls.name] = cls() \ No newline at end of file +for cls in [MSEWithInequalities, MSEWithInequalitiesAndMultipleOutputs]: + CUSTOM_LOSSES[cls.name] = cls() diff --git a/mhcflurry/data_dependent_weights_initialization.py b/mhcflurry/data_dependent_weights_initialization.py new file mode 100644 index 0000000000000000000000000000000000000000..8cc118ce6fc97be405f1da93a388a4567049aab1 --- /dev/null +++ b/mhcflurry/data_dependent_weights_initialization.py @@ -0,0 +1,138 @@ +""" +Layer-sequential unit-variance initialization for neural networks. + +See: + Mishkin and Matas, "All you need is a good init". 2016. + https://arxiv.org/abs/1511.06422 +""" +# +# LSUV initialization code in this file is adapted from: +# https://github.com/ducha-aiki/LSUV-keras/blob/master/lsuv_init.py +# by Dmytro Mishkin +# +# Here is the license for the original code: +# +# +# Copyright (C) 2017, Dmytro Mishkin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS 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. + +from __future__ import print_function +import numpy + + +def svd_orthonormal(shape): + # Orthonormal init code is from Lasagne + # https://github.com/Lasagne/Lasagne/blob/master/lasagne/init.py + if len(shape) < 2: + raise RuntimeError("Only shapes of length 2 or more are supported.") + flat_shape = (shape[0], numpy.prod(shape[1:])) + a = numpy.random.standard_normal(flat_shape).astype("float32") + u, _, v = numpy.linalg.svd(a, full_matrices=False) + q = u if u.shape == flat_shape else v + q = q.reshape(shape) + return q + + +def get_activations(model, layer, X_batch): + from keras.models import Model + intermediate_layer_model = Model( + inputs=model.get_input_at(0), + outputs=layer.get_output_at(0) + ) + activations = intermediate_layer_model.predict(X_batch) + return activations + + +def lsuv_init(model, batch, verbose=True, margin=0.1, max_iter=100): + """ + Initialize neural network weights using layer-sequential unit-variance + initialization. + + See: + Mishkin and Matas, "All you need is a good init". 2016. + https://arxiv.org/abs/1511.06422 + + Parameters + ---------- + model : keras.Model + batch : dict + Training data, as would be passed keras.Model.fit() + verbose : boolean + Whether to print progress to stdout + margin : float + max_iter : int + + Returns + ------- + keras.Model + Same as what was passed in. + """ + from keras.layers import Dense, Convolution2D + needed_variance = 1.0 + layers_inintialized = 0 + for layer in model.layers: + if not isinstance(layer, (Dense, Convolution2D)): + continue + # avoid small layers where activation variance close to zero, esp. + # for small batches + if numpy.prod(layer.get_output_shape_at(0)[1:]) < 32: + if verbose: + print('LSUV initialization skipping', layer.name) + continue + layers_inintialized += 1 + weights_and_biases = layer.get_weights() + weights_and_biases[0] = svd_orthonormal(weights_and_biases[0].shape) + layer.set_weights(weights_and_biases) + activations = get_activations(model, layer, batch) + variance = numpy.var(activations) + iteration = 0 + if verbose: + print(layer.name, variance) + while abs(needed_variance - variance) > margin: + if verbose: + print( + 'LSUV initialization', + layer.name, + iteration, + needed_variance, + margin, + variance) + + if numpy.abs(numpy.sqrt(variance)) < 1e-7: + break # avoid zero division + + weights_and_biases = layer.get_weights() + weights_and_biases[0] /= numpy.sqrt(variance) / numpy.sqrt( + needed_variance) + layer.set_weights(weights_and_biases) + activations = get_activations(model, layer, batch) + variance = numpy.var(activations) + + iteration += 1 + if iteration >= max_iter: + break + if verbose: + print('Done with LSUV: total layers initialized', layers_inintialized) + return model \ No newline at end of file diff --git a/mhcflurry/downloads.py b/mhcflurry/downloads.py index ec776f9e093c7309e5f06a54d0b35a52489d0d96..7f29ea521cb558cbf47523b1302b2875041509a5 100644 --- a/mhcflurry/downloads.py +++ b/mhcflurry/downloads.py @@ -9,9 +9,9 @@ from __future__ import ( ) import logging import yaml -from os.path import join, exists, relpath -from pipes import quote +from os.path import join, exists from os import environ +from pipes import quote from collections import OrderedDict from appdirs import user_data_dir from pkg_resources import resource_string @@ -81,8 +81,7 @@ def get_default_class1_models_dir(test_exists=True): if test_exists and not exists(result): raise IOError("No such directory: %s" % result) return result - else: - return get_path("models_class1", "models", test_exists=test_exists) + return get_path("models_class1", "models", test_exists=test_exists) def get_current_release_downloads(): @@ -160,13 +159,13 @@ def configure(): metadata["releases"][_CURRENT_RELEASE]["compatibility-version"]) current_compatability = metadata["current-compatibility-version"] if current_release_compatability != current_compatability: - logging.warn( + logging.warning( "The specified downloads are not compatible with this version " "of the MHCflurry codebase. Downloads: release %s, " - "compatability version: %d. Code compatability version: %d" % ( - _CURRENT_RELEASE, - current_release_compatability, - current_compatability)) + "compatability version: %d. Code compatability version: %d", + _CURRENT_RELEASE, + current_release_compatability, + current_compatability) data_dir = environ.get("MHCFLURRY_DATA_DIR") if not data_dir: @@ -176,6 +175,7 @@ def configure(): data_dir = user_data_dir("mhcflurry", version="4") _DOWNLOADS_DIR = join(data_dir, _CURRENT_RELEASE) - logging.debug("Configured MHCFLURRY_DOWNLOADS_DIR: %s" % _DOWNLOADS_DIR) + logging.debug("Configured MHCFLURRY_DOWNLOADS_DIR: %s", _DOWNLOADS_DIR) + configure() diff --git a/mhcflurry/downloads.yml b/mhcflurry/downloads.yml index 3a2c84e26ce7ea7855a5bf519f2af80a6148855d..338b8e728aa6f098b929734a5e09f7fdf1ac5e01 100644 --- a/mhcflurry/downloads.yml +++ b/mhcflurry/downloads.yml @@ -8,7 +8,7 @@ # by name, the downloads with "default=true" are downloaded. # This should usually be the latest release. -current-release: 1.2.0 +current-release: 1.3.0 # An integer indicating what models the current MHCflurry code base is compatible # with. Increment this integer when changes are made to MHCflurry that would break @@ -17,6 +17,70 @@ current-compatibility-version: 2 # Add new releases here as they are made. releases: + 1.3.0: + compatibility-version: 2 + downloads: + - name: models_class1_pan + url: https://github.com/openvax/mhcflurry/releases/download/pan-dev1/models_class1_pan.20190829.tar.bz2 + default: false + + - name: models_class1_pan_unselected + part_urls: + - https://github.com/openvax/mhcflurry/releases/download/pan-dev1/models_class1_pan_unselected.20190826.tar.bz2.part.aa + - https://github.com/openvax/mhcflurry/releases/download/pan-dev1/models_class1_pan_unselected.20190826.tar.bz2.part.ab + default: false + + - name: data_iedb + url: https://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_iedb.20190610.tar.bz2 + default: false + + - name: data_systemhcatlas + url: https://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_systemhcatlas.20190506.tar.bz2 + default: false + + - name: allele_sequences + url: https://github.com/openvax/mhcflurry/releases/download/pan-dev1/allele_sequences.20190506.tar.bz2 + default: false + + - name: random_peptide_predictions + url: https://github.com/openvax/mhcflurry/releases/download/pan-dev1/random_peptide_predictions.20190506.tar.bz2 + default: false + + - name: data_published + url: https://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_published.tar.bz2 + default: false + + - name: data_curated + url: https://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_curated.20190516.tar.bz2 + default: true + + # Older downloads + - name: models_class1 + url: https://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 + default: true + + - name: models_class1_selected_no_mass_spec + url: https://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 + default: false + + - name: models_class1_unselected + url: https://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 + default: false + + - name: models_class1_trained_with_mass_spec + url: https://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 + default: false + + - name: models_class1_unselected_with_mass_spec + url: https://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 + default: false + + - name: models_class1_minimal + url: https://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 + default: false + + + 1.2.0: compatibility-version: 2 downloads: diff --git a/mhcflurry/downloads_command.py b/mhcflurry/downloads_command.py index 34403ab7d01bd2acfc1728073a5dcb6e838b8198..249269aea94f3a8b3bdcec5f7fce26f41c4e804d 100644 --- a/mhcflurry/downloads_command.py +++ b/mhcflurry/downloads_command.py @@ -27,7 +27,8 @@ import os from pipes import quote import errno import tarfile -from tempfile import mkstemp +from shutil import copyfileobj +from tempfile import NamedTemporaryFile from tqdm import tqdm tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 @@ -167,8 +168,7 @@ def fetch_subcommand(args): "\nThe requested download '%s' has already been downloaded. " "To re-download this data, first run: \n\t%s\nin a shell " "and then re-run this command.\n" + - "*" * 40) - % (name, 'rm -rf ' + quote(get_path(name)))) + "*" * 40) % (name, 'rm -rf ' + quote(get_path(name)))) if not info['downloaded'] and (name in args.download_name or default): items_to_fetch.add(name) @@ -181,27 +181,46 @@ def fetch_subcommand(args): "DOWNLOAD NAME", "ALREADY DOWNLOADED?", "WILL DOWNLOAD NOW?", "URL")) for (item, info) in downloads.items(): + urls = ( + [info['metadata']["url"]] + if "url" in info['metadata'] + else info['metadata']["part_urls"]) + url_description = urls[0] + if len(urls) > 1: + url_description += " + %d more parts" % (len(urls) - 1) + qprint(format_string % ( item, yes_no(info['downloaded']), yes_no(item in items_to_fetch), - info['metadata']["url"])) + url_description)) # TODO: may want to extract into somewhere temporary and then rename to # avoid making an incomplete extract if the process is killed. for item in items_to_fetch: metadata = downloads[item]['metadata'] - (temp_fd, target_path) = mkstemp() + urls = ( + [metadata["url"]] if "url" in metadata else metadata["part_urls"]) + temp = NamedTemporaryFile(delete=False, suffix=".tar.bz2") try: - qprint("Downloading: %s" % metadata['url']) - urlretrieve( - metadata['url'], - target_path, - reporthook=TqdmUpTo( - unit='B', unit_scale=True, miniters=1).update_to) - qprint("Downloaded to: %s" % quote(target_path)) - - tar = tarfile.open(target_path, 'r:bz2') + for (url_num, url) in enumerate(urls): + qprint("Downloading [part %d/%d]: %s" % ( + url_num + 1, len(urls), url)) + (downloaded_path, _) = urlretrieve( + url, + temp.name if len(urls) == 1 else None, + reporthook=TqdmUpTo( + unit='B', unit_scale=True, miniters=1).update_to) + qprint("Downloaded to: %s" % quote(downloaded_path)) + + if downloaded_path != temp.name: + qprint("Appending to: %s" % temp.name) + with open(downloaded_path, "rb") as fd: + copyfileobj(fd, temp, length=64*1024*1024) + os.remove(downloaded_path) + + temp.close() + tar = tarfile.open(temp.name, 'r:bz2') names = tar.getnames() logging.debug("Extracting: %s" % names) bad_names = [ @@ -221,7 +240,7 @@ def fetch_subcommand(args): len(names), quote(result_dir))) finally: if not args.keep: - os.remove(target_path) + os.remove(temp.name) def info_subcommand(args): @@ -257,10 +276,18 @@ def info_subcommand(args): print(format_string % ("DOWNLOAD NAME", "DOWNLOADED?", "URL")) for (item, info) in downloads.items(): + urls = ( + [info['metadata']["url"]] + if "url" in info['metadata'] + else info['metadata']["part_urls"]) + url_description = urls[0] + if len(urls) > 1: + url_description += " + %d more parts" % (len(urls) - 1) + print(format_string % ( item, yes_no(info['downloaded']), - info['metadata']["url"])) + url_description)) def path_subcommand(args): diff --git a/mhcflurry/encodable_sequences.py b/mhcflurry/encodable_sequences.py index 47d62f886e3bca21753c962954deae6869f89bbe..19696e23b9f901811e0fb01b9f16f58a7c0ac613 100644 --- a/mhcflurry/encodable_sequences.py +++ b/mhcflurry/encodable_sequences.py @@ -1,3 +1,6 @@ +""" +Class for encoding variable-length peptides to fixed-size numerical matrices +""" from __future__ import ( print_function, division, @@ -13,11 +16,25 @@ import pandas from . import amino_acid +class EncodingError(ValueError): + """ + Exception raised when peptides cannot be encoded + """ + def __init__(self, message, supported_peptide_lengths): + self.supported_peptide_lengths = supported_peptide_lengths + ValueError.__init__( + self, + message + " Supported lengths: %s - %s." % supported_peptide_lengths) + + class EncodableSequences(object): """ - Sequences of amino acids. + Class for encoding variable-length peptides to fixed-size numerical matrices This class caches various encodings of a list of sequences. + + In practice this is used only for peptides. To encode MHC allele sequences, + see AlleleEncoding. """ unknown_character = "X" @@ -36,7 +53,7 @@ class EncodableSequences(object): if not all(isinstance(obj, string_types) for obj in sequences): raise ValueError("Sequence of strings is required") self.sequences = numpy.array(sequences) - lengths = pandas.Series(self.sequences).str.len() + lengths = pandas.Series(self.sequences, dtype=numpy.object_).str.len() self.min_length = lengths.min() self.max_length = lengths.max() @@ -51,27 +68,38 @@ class EncodableSequences(object): return len(self.sequences) def variable_length_to_fixed_length_categorical( - self, left_edge=4, right_edge=4, max_length=15): + self, + alignment_method="pad_middle", + left_edge=4, + right_edge=4, + max_length=15): """ - Encode variable-length sequences using a fixed-length encoding designed - for preserving the anchor positions of class I peptides. - - The sequences must be of length at least left_edge + right_edge, and at - most max_length. + Encode variable-length sequences to a fixed-size index-encoded (integer) + matrix. + + See `sequences_to_fixed_length_index_encoded_array` for details. Parameters ---------- + alignment_method : string + One of "pad_middle" or "left_pad_right_pad" left_edge : int, size of fixed-position left side + Only relevant for pad_middle alignment method right_edge : int, size of the fixed-position right side - max_length : sequence length of the resulting encoding + Only relevant for pad_middle alignment method + max_length : maximum supported peptide length Returns ------- - numpy.array of integers with shape (num sequences, max_length) + numpy.array of integers with shape (num sequences, encoded length) + + For pad_middle, the encoded length is max_length. For left_pad_right_pad, + it's 3 * max_length. """ cache_key = ( "fixed_length_categorical", + alignment_method, left_edge, right_edge, max_length) @@ -80,6 +108,7 @@ class EncodableSequences(object): fixed_length_sequences = ( self.sequences_to_fixed_length_index_encoded_array( self.sequences, + alignment_method=alignment_method, left_edge=left_edge, right_edge=right_edge, max_length=max_length)) @@ -87,13 +116,19 @@ class EncodableSequences(object): return self.encoding_cache[cache_key] def variable_length_to_fixed_length_vector_encoding( - self, vector_encoding_name, left_edge=4, right_edge=4, max_length=15): + self, + vector_encoding_name, + alignment_method="pad_middle", + left_edge=4, + right_edge=4, + max_length=15): """ - Encode variable-length sequences using a fixed-length encoding designed - for preserving the anchor positions of class I peptides. + Encode variable-length sequences to a fixed-size matrix. Amino acids + are encoded as specified by the vector_encoding_name argument. - The sequences must be of length at least left_edge + right_edge, and at - most max_length. + See `sequences_to_fixed_length_index_encoded_array` for details. + + See also: variable_length_to_fixed_length_categorical. Parameters ---------- @@ -101,18 +136,27 @@ class EncodableSequences(object): How to represent amino acids. One of "BLOSUM62", "one-hot", etc. Full list of supported vector encodings is given by available_vector_encodings(). + alignment_method : string + One of "pad_middle" or "left_pad_right_pad" left_edge : int, size of fixed-position left side + Only relevant for pad_middle alignment method right_edge : int, size of the fixed-position right side - max_length : sequence length of the resulting encoding + Only relevant for pad_middle alignment method + max_length : maximum supported peptide length Returns ------- - numpy.array with shape (num sequences, max_length, m) where m is - vector_encoding_length(vector_encoding_name) + numpy.array with shape (num sequences, encoded length, m) + + where + - m is the vector encoding length (usually 21). + - encoded length is max_length if alignment_method is pad_middle; + 3 * max_length if it's left_pad_right_pad. """ cache_key = ( "fixed_length_vector_encoding", vector_encoding_name, + alignment_method, left_edge, right_edge, max_length) @@ -120,6 +164,7 @@ class EncodableSequences(object): fixed_length_sequences = ( self.sequences_to_fixed_length_index_encoded_array( self.sequences, + alignment_method=alignment_method, left_edge=left_edge, right_edge=right_edge, max_length=max_length)) @@ -132,92 +177,212 @@ class EncodableSequences(object): @classmethod def sequences_to_fixed_length_index_encoded_array( - klass, sequences, left_edge=4, right_edge=4, max_length=15): + klass, + sequences, + alignment_method="pad_middle", + left_edge=4, + right_edge=4, + max_length=15): """ - Transform a sequence of strings, where each string is of length at least - left_edge + right_edge and at most max_length into strings of length - max_length using a scheme designed to preserve the anchor positions of - class I peptides. + Encode variable-length sequences to a fixed-size index-encoded (integer) + matrix. + + How variable length sequences get mapped to fixed length is set by the + "alignment_method" argument. Supported alignment methods are: - The first left_edge characters in the input always map to the first - left_edge characters in the output. Similarly for the last right_edge - characters. The middle characters are filled in based on the length, - with the X character filling in the blanks. + pad_middle + Encoding designed for preserving the anchor positions of class + I peptides. This is what is used in allele-specific models. + + Each string must be of length at least left_edge + right_edge + and at most max_length. The first left_edge characters in the + input always map to the first left_edge characters in the + output. Similarly for the last right_edge characters. The + middle characters are filled in based on the length, with the + X character filling in the blanks. - For example, using defaults: + Example: - AAAACDDDD -> AAAAXXXCXXXDDDD + AAAACDDDD -> AAAAXXXCXXXDDDD - The strings are also converted to int categorical amino acid indices. + left_pad_centered_right_pad + Encoding that makes no assumptions on anchor positions but is + 3x larger than pad_middle, since it duplicates the peptide + (left aligned + centered + right aligned). This is what is used + for the pan-allele models. + + Example: + + AAAACDDDD -> AAAACDDDDXXXXXXXXXAAAACDDDDXXXXXXXXXAAAACDDDD + + left_pad_right_pad + Same as left_pad_centered_right_pad but only includes left- + and right-padded peptide. + + Example: + + AAAACDDDD -> AAAACDDDDXXXXXXXXXXXXAAAACDDDD Parameters ---------- - sequence : string - left_edge : int - right_edge : int - max_length : int + sequences : list of string + alignment_method : string + One of "pad_middle" or "left_pad_right_pad" + left_edge : int, size of fixed-position left side + Only relevant for pad_middle alignment method + right_edge : int, size of the fixed-position right side + Only relevant for pad_middle alignment method + max_length : maximum supported peptide length Returns ------- - numpy array of shape (len(sequences), max_length) and dtype int + numpy.array of integers with shape (num sequences, encoded length) + + For pad_middle, the encoded length is max_length. For left_pad_right_pad, + it's 2 * max_length. For left_pad_centered_right_pad, it's + 3 * max_length. """ + result = None + if alignment_method == 'pad_middle': + # Result array is int32, filled with X (null amino acid) value. + result = numpy.full( + fill_value=amino_acid.AMINO_ACID_INDEX['X'], + shape=(len(sequences), max_length), + dtype="int32") + + df = pandas.DataFrame({"peptide": sequences}, dtype=numpy.object_) + df["length"] = df.peptide.str.len() + + middle_length = max_length - left_edge - right_edge + min_length = left_edge + right_edge + + # For efficiency we handle each supported peptide length using bulk + # array operations. + for (length, sub_df) in df.groupby("length"): + if length < min_length or length > max_length: + raise EncodingError( + "Sequence '%s' (length %d) unsupported. There are %d " + "total peptides with this length." % ( + sub_df.iloc[0].peptide, + length, + len(sub_df)), supported_peptide_lengths=( + min_length, max_length)) + + # Array of shape (num peptides, length) giving fixed-length + # amino acid encoding each peptide of the current length. + fixed_length_sequences = numpy.stack( + sub_df.peptide.map( + lambda s: numpy.array([ + amino_acid.AMINO_ACID_INDEX[char] for char in s + ])).values) + + num_null = max_length - length + num_null_left = int(math.ceil(num_null / 2)) + num_middle_filled = middle_length - num_null + middle_start = left_edge + num_null_left + + # Set left edge + result[sub_df.index, :left_edge] = fixed_length_sequences[ + :, :left_edge + ] + + # Set middle. + result[ + sub_df.index, + middle_start : middle_start + num_middle_filled + ] = fixed_length_sequences[ + :, left_edge : left_edge + num_middle_filled + ] + + # Set right edge. + result[ + sub_df.index, + -right_edge: + ] = fixed_length_sequences[:, -right_edge:] + elif alignment_method == "left_pad_right_pad": + # We arbitrarily set a minimum length of 5, although this encoding + # could handle smaller peptides. + min_length = 5 + + # Result array is int32, filled with X (null amino acid) value. + result = numpy.full( + fill_value=amino_acid.AMINO_ACID_INDEX['X'], + shape=(len(sequences), max_length * 2), + dtype="int32") + + df = pandas.DataFrame({"peptide": sequences}, dtype=numpy.object_) + + # For efficiency we handle each supported peptide length using bulk + # array operations. + for (length, sub_df) in df.groupby(df.peptide.str.len()): + if length < min_length or length > max_length: + raise EncodingError( + "Sequence '%s' (length %d) unsupported. There are %d " + "total peptides with this length." % ( + sub_df.iloc[0].peptide, + length, + len(sub_df)), supported_peptide_lengths=( + min_length, max_length)) + + # Array of shape (num peptides, length) giving fixed-length + # amino acid encoding each peptide of the current length. + fixed_length_sequences = numpy.stack(sub_df.peptide.map( + lambda s: numpy.array([ + amino_acid.AMINO_ACID_INDEX[char] for char in s + ])).values) - # Result array is int32, filled with X (null amino acid) value. - result = numpy.full( - fill_value=amino_acid.AMINO_ACID_INDEX['X'], - shape=(len(sequences), max_length), - dtype="int32") - - df = pandas.DataFrame({"peptide": sequences}) - df["length"] = df.peptide.str.len() - - middle_length = max_length - left_edge - right_edge - - # For efficiency we handle each supported peptide length using bulk - # array operations. - for (length, sub_df) in df.groupby("length"): - if length < left_edge + right_edge: - raise ValueError( - "Sequence '%s' (length %d) unsupported: length must be at " - "least %d. There are %d total peptides with this length." % ( - sub_df.iloc[0].peptide, length, left_edge + right_edge, - len(sub_df))) - if length > max_length: - raise ValueError( - "Sequence '%s' (length %d) unsupported: length must be at " - "most %d. There are %d total peptides with this length." % ( - sub_df.iloc[0].peptide, length, max_length, - len(sub_df))) - - # Array of shape (num peptides, length) giving fixed-length amino - # acid encoding each peptide of the current length. - fixed_length_sequences = numpy.stack( - sub_df.peptide.map( + # Set left edge + result[sub_df.index, :length] = fixed_length_sequences + + # Set right edge. + result[sub_df.index, -length:] = fixed_length_sequences + elif alignment_method == "left_pad_centered_right_pad": + # We arbitrarily set a minimum length of 5, although this encoding + # could handle smaller peptides. + min_length = 5 + + # Result array is int32, filled with X (null amino acid) value. + result = numpy.full( + fill_value=amino_acid.AMINO_ACID_INDEX['X'], + shape=(len(sequences), max_length * 3), + dtype="int32") + + df = pandas.DataFrame({"peptide": sequences}, dtype=numpy.object_) + + # For efficiency we handle each supported peptide length using bulk + # array operations. + for (length, sub_df) in df.groupby(df.peptide.str.len()): + if length < min_length or length > max_length: + raise EncodingError( + "Sequence '%s' (length %d) unsupported. There are %d " + "total peptides with this length." % ( + sub_df.iloc[0].peptide, + length, + len(sub_df)), supported_peptide_lengths=( + min_length, max_length)) + + # Array of shape (num peptides, length) giving fixed-length + # amino acid encoding each peptide of the current length. + fixed_length_sequences = numpy.stack(sub_df.peptide.map( lambda s: numpy.array([ amino_acid.AMINO_ACID_INDEX[char] for char in s ])).values) - num_null = max_length - length - num_null_left = int(math.ceil(num_null / 2)) - num_middle_filled = middle_length - num_null - middle_start = left_edge + num_null_left - - # Set left edge - result[sub_df.index, :left_edge] = fixed_length_sequences[ - :, :left_edge - ] - - # Set middle. - result[ - sub_df.index, - middle_start : middle_start + num_middle_filled - ] = fixed_length_sequences[ - :, left_edge : left_edge + num_middle_filled - ] - - # Set right edge. - result[ - sub_df.index, - -right_edge: - ] = fixed_length_sequences[:, -right_edge:] + # Set left edge + result[sub_df.index, :length] = fixed_length_sequences + + # Set right edge. + result[sub_df.index, -length:] = fixed_length_sequences + + # Set center. + center_left_padding = int( + math.floor((max_length - length) / 2)) + center_left_offset = max_length + center_left_padding + result[ + sub_df.index, + center_left_offset : center_left_offset + length + ] = fixed_length_sequences + else: + raise NotImplementedError( + "Unsupported alignment method: %s" % alignment_method) return result diff --git a/mhcflurry/ensemble_centrality.py b/mhcflurry/ensemble_centrality.py index e370a39d66f31d8e343605a22c38e62bd12160b0..07251bf028e5414abf31afc53db2b2a2abb96e53 100644 --- a/mhcflurry/ensemble_centrality.py +++ b/mhcflurry/ensemble_centrality.py @@ -37,4 +37,4 @@ CENTRALITY_MEASURES = { "mean": partial(numpy.nanmean, axis=1), "median": partial(numpy.nanmedian, axis=1), "robust_mean": robust_mean, -} \ No newline at end of file +} diff --git a/mhcflurry/hyperparameters.py b/mhcflurry/hyperparameters.py index cc5950d5c175a35c08eb9cfea0d44d64e3fdeb65..1241fa4650378f17247d2c0bea529ba4ac0a0261 100644 --- a/mhcflurry/hyperparameters.py +++ b/mhcflurry/hyperparameters.py @@ -1,3 +1,6 @@ +""" +Hyperparameter (neural network options) management +""" from __future__ import ( print_function, division, @@ -70,8 +73,7 @@ class HyperparameterDefaults(object): if invalid_keys: raise ValueError( "No such model parameters: %s. Valid parameters are: %s" - % (" ".join(invalid_keys), - " ".join(self.defaults))) + % (" ".join(invalid_keys), " ".join(self.defaults))) def models_grid(self, **kwargs): ''' diff --git a/mhcflurry/parallelism.py b/mhcflurry/local_parallelism.py similarity index 74% rename from mhcflurry/parallelism.py rename to mhcflurry/local_parallelism.py index b21af5c64f2c72bd13336161fefa8604fa0edd3c..100a270c9f7f3b37662e3fc0743cec5759e51ffb 100644 --- a/mhcflurry/parallelism.py +++ b/mhcflurry/local_parallelism.py @@ -1,6 +1,12 @@ +""" +Infrastructure for "local" parallelism, i.e. multiprocess parallelism on one +compute node. +""" + import traceback import sys import os +import time from multiprocessing import Pool, Queue, cpu_count from six.moves import queue from multiprocessing.util import Finalize @@ -12,16 +18,23 @@ import numpy from .common import set_keras_backend -def add_worker_pool_args(parser): - group = parser.add_argument_group("Worker pool") +def add_local_parallelism_args(parser): + """ + Add local parallelism arguments to the given argparse.ArgumentParser. + + Parameters + ---------- + parser : argparse.ArgumentParser + """ + group = parser.add_argument_group("Local parallelism") group.add_argument( "--num-jobs", - default=1, + default=0, type=int, metavar="N", - help="Number of processes to parallelize training over. Experimental. " - "Set to 1 for serial run. Set to 0 to use number of cores. Default: %(default)s.") + help="Number of local processes to parallelize training over. " + "Set to 0 for serial run. Default: %(default)s.") group.add_argument( "--backend", choices=("tensorflow-gpu", "tensorflow-cpu", "tensorflow-default"), @@ -46,15 +59,34 @@ def add_worker_pool_args(parser): default=None, help="Restart workers after N tasks. Workaround for tensorflow memory " "leaks. Requires Python >=3.2.") + group.add_argument( + "--worker-log-dir", + default=None, + help="Write worker stdout and stderr logs to given directory.") def worker_pool_with_gpu_assignments_from_args(args): + """ + Create a multiprocessing.Pool where each worker uses its own GPU. + + Uses commandline arguments. See `worker_pool_with_gpu_assignments`. + + Parameters + ---------- + args : argparse.ArgumentParser + + Returns + ------- + multiprocessing.Pool + """ + return worker_pool_with_gpu_assignments( num_jobs=args.num_jobs, num_gpus=args.gpus, backend=args.backend, max_workers_per_gpu=args.max_workers_per_gpu, - max_tasks_per_worker=args.max_tasks_per_worker + max_tasks_per_worker=args.max_tasks_per_worker, + worker_log_dir=args.worker_log_dir, ) @@ -63,16 +95,32 @@ def worker_pool_with_gpu_assignments( num_gpus=0, backend=None, max_workers_per_gpu=1, - max_tasks_per_worker=None): + max_tasks_per_worker=None, + worker_log_dir=None): + """ + Create a multiprocessing.Pool where each worker uses its own GPU. - num_workers = num_jobs if num_jobs else cpu_count() + Parameters + ---------- + num_jobs : int + Number of worker processes. + num_gpus : int + backend : string + max_workers_per_gpu : int + max_tasks_per_worker : int + worker_log_dir : string - if num_workers == 1: + Returns + ------- + multiprocessing.Pool + """ + + if num_jobs == 0: if backend: set_keras_backend(backend) return None - worker_init_kwargs = None + worker_init_kwargs = [{} for _ in range(num_jobs)] if num_gpus: print("Attempting to round-robin assign each worker a GPU.") if backend != "tensorflow-default": @@ -82,8 +130,7 @@ def worker_pool_with_gpu_assignments( gpu_assignments_remaining = dict(( (gpu, max_workers_per_gpu) for gpu in range(num_gpus) )) - worker_init_kwargs = [] - for worker_num in range(num_workers): + for (worker_num, kwargs) in enumerate(worker_init_kwargs): if gpu_assignments_remaining: # Use a GPU gpu_num = sorted( @@ -97,15 +144,19 @@ def worker_pool_with_gpu_assignments( # Use CPU gpu_assignment = [] - worker_init_kwargs.append({ + kwargs.update({ 'gpu_device_nums': gpu_assignment, 'keras_backend': backend }) print("Worker %d assigned GPUs: %s" % ( worker_num, gpu_assignment)) + if worker_log_dir: + for kwargs in worker_init_kwargs: + kwargs["worker_log_dir"] = worker_log_dir + worker_pool = make_worker_pool( - processes=num_workers, + processes=num_jobs, initializer=worker_init, initializer_kwargs_per_process=worker_init_kwargs, max_tasks_per_worker=max_tasks_per_worker) @@ -208,7 +259,12 @@ def worker_init_entry_point( init_function(**kwargs) -def worker_init(keras_backend=None, gpu_device_nums=None): +def worker_init(keras_backend=None, gpu_device_nums=None, worker_log_dir=None): + if worker_log_dir: + sys.stderr = sys.stdout = open(os.path.join( + worker_log_dir, + "LOG-worker.%d.%d.txt" % (os.getpid(), int(time.time()))), "w") + # Each worker needs distinct random numbers numpy.random.seed() random.seed() @@ -234,6 +290,20 @@ class WrapException(Exception): def call_wrapped(function, *args, **kwargs): + """ + Run function on args and kwargs and return result, wrapping any exception + raised in a WrapException. + + Parameters + ---------- + function : arbitrary function + + Any other arguments provided are passed to the function. + + Returns + ------- + object + """ try: return function(*args, **kwargs) except: @@ -241,4 +311,20 @@ def call_wrapped(function, *args, **kwargs): def call_wrapped_kwargs(function, kwargs): + """ + Invoke function on given kwargs and return result, wrapping any exception + raised in a WrapException. + + Parameters + ---------- + function : arbitrary function + kwargs : dict + + Returns + ------- + object + + result of calling function(**kwargs) + + """ return call_wrapped(function, **kwargs) \ No newline at end of file diff --git a/mhcflurry/percent_rank_transform.py b/mhcflurry/percent_rank_transform.py index 6f42477d56f94619e526d84bd3a8a5c5965caa45..a4597686941b97162ac3bcf6f833b3856f354e44 100644 --- a/mhcflurry/percent_rank_transform.py +++ b/mhcflurry/percent_rank_transform.py @@ -1,6 +1,10 @@ +""" +Class for transforming arbitrary values into percent ranks given a distribution. +""" import numpy import pandas + class PercentRankTransform(object): """ Transform arbitrary values into percent ranks. @@ -76,8 +80,3 @@ class PercentRankTransform(object): result.cdf = series.values result.bin_edges = series.index.values[1:-1] return result - - - - - diff --git a/mhcflurry/predict_command.py b/mhcflurry/predict_command.py index 0a8e5c97a4915e66c73059d0b03d5c2ae46a8232..17a687f55eff01b46573c84341088ec9d3ecea88 100644 --- a/mhcflurry/predict_command.py +++ b/mhcflurry/predict_command.py @@ -149,6 +149,10 @@ implementation_args.add_argument( def run(argv=sys.argv[1:]): + if not argv: + parser.print_help() + parser.exit(1) + args = parser.parse_args(argv) set_keras_backend(backend=args.backend, num_threads=args.threads) @@ -159,9 +163,9 @@ def run(argv=sys.argv[1:]): models_dir = args.models if models_dir is None: - # The reason we set the default here instead of in the argument parser is that - # we want to test_exists at this point, so the user gets a message instructing - # them to download the models if needed. + # The reason we set the default here instead of in the argument parser + # is that we want to test_exists at this point, so the user gets a + # message instructing them to download the models if needed. models_dir = get_default_class1_models_dir(test_exists=True) predictor = Class1AffinityPredictor.load(models_dir) @@ -215,12 +219,13 @@ def run(argv=sys.argv[1:]): }) logging.info( "Predicting for %d alleles and %d peptides = %d predictions" % ( - len(args.alleles), len(args.peptides), len(df))) + len(args.alleles), len(args.peptides), len(df))) predictions = predictor.predict_to_dataframe( peptides=df[args.peptide_column].values, alleles=df[args.allele_column].values, - include_individual_model_predictions=args.include_individual_model_predictions, + include_individual_model_predictions=( + args.include_individual_model_predictions), throw=not args.no_throw) for col in predictions.columns: diff --git a/mhcflurry/regression_target.py b/mhcflurry/regression_target.py index d1189178c54df06d32ae1b45b2ee23efeed9306e..3c9ed6a741805646123fa12a7c8e94b605596115 100644 --- a/mhcflurry/regression_target.py +++ b/mhcflurry/regression_target.py @@ -14,7 +14,7 @@ def from_ic50(ic50, max_ic50=50000.0): numpy.array of float """ - x = 1.0 - (numpy.log(ic50) / numpy.log(max_ic50)) + x = 1.0 - (numpy.log(numpy.maximum(ic50, 1e-12)) / numpy.log(max_ic50)) return numpy.minimum( 1.0, numpy.maximum(0.0, x)) diff --git a/mhcflurry/scoring.py b/mhcflurry/scoring.py index f6a256baa18e1bbe01968ce270466791588a34f1..d0d41d4e01e215c8c1e603fd5d1ec09dc08cf673 100644 --- a/mhcflurry/scoring.py +++ b/mhcflurry/scoring.py @@ -1,3 +1,6 @@ +""" +Measures of prediction accuracy +""" from __future__ import ( print_function, division, diff --git a/mhcflurry/select_allele_specific_models_command.py b/mhcflurry/select_allele_specific_models_command.py index 226185553481a629febccd4ee3c27c6b76fef4c9..2ca46a809d4ffa6594d33f9f6073f57f9cb1f02d 100644 --- a/mhcflurry/select_allele_specific_models_command.py +++ b/mhcflurry/select_allele_specific_models_command.py @@ -22,7 +22,7 @@ tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 from .class1_affinity_predictor import Class1AffinityPredictor from .encodable_sequences import EncodableSequences from .common import configure_logging, random_peptides -from .parallelism import worker_pool_with_gpu_assignments_from_args, add_worker_pool_args +from .local_parallelism import worker_pool_with_gpu_assignments_from_args, add_local_parallelism_args from .regression_target import from_ic50 @@ -176,7 +176,7 @@ parser.add_argument( help="Keras verbosity. Default: %(default)s", default=0) -add_worker_pool_args(parser) +add_local_parallelism_args(parser) def run(argv=sys.argv[1:]): @@ -205,7 +205,7 @@ def run(argv=sys.argv[1:]): df = pandas.read_csv(args.data) print("Loaded data: %s" % (str(df.shape))) - df = df.ix[ + df = df.loc[ (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) ] print("Subselected to 8-15mers: %s" % (str(df.shape))) diff --git a/mhcflurry/select_pan_allele_models_command.py b/mhcflurry/select_pan_allele_models_command.py new file mode 100644 index 0000000000000000000000000000000000000000..6e6f45fa8c29fd5ead83567ce251e9cb88141e08 --- /dev/null +++ b/mhcflurry/select_pan_allele_models_command.py @@ -0,0 +1,394 @@ +""" +Model select class1 pan-allele models. + +APPROACH: For each training fold, we select at least min and at most max models +(where min and max are set by the --{min/max}-models-per-fold argument) using a +step-up (forward) selection procedure. The final ensemble is the union of all +selected models across all folds. +""" +import argparse +import os +import signal +import sys +import time +import traceback +import hashlib +from pprint import pprint + +import numpy +import pandas + +import tqdm # progress bar +tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 + +from .class1_affinity_predictor import Class1AffinityPredictor +from .encodable_sequences import EncodableSequences +from .allele_encoding import AlleleEncoding +from .common import configure_logging +from .local_parallelism import ( + worker_pool_with_gpu_assignments_from_args, + add_local_parallelism_args) +from .cluster_parallelism import ( + add_cluster_parallelism_args, + cluster_results_from_args) +from .regression_target import from_ic50 + + +# To avoid pickling large matrices to send to child processes when running in +# parallel, we use this global variable as a place to store data. Data that is +# stored here before creating the thread pool will be inherited to the child +# processes upon fork() call, allowing us to share large data with the workers +# via shared memory. +GLOBAL_DATA = {} + + +parser = argparse.ArgumentParser(usage=__doc__) + +parser.add_argument( + "--data", + metavar="FILE.csv", + required=False, + help=( + "Model selection data CSV. Expected columns: " + "allele, peptide, measurement_value")) +parser.add_argument( + "--folds", + metavar="FILE.csv", + required=False, + help=("")) +parser.add_argument( + "--models-dir", + metavar="DIR", + required=True, + help="Directory to read models") +parser.add_argument( + "--out-models-dir", + metavar="DIR", + required=True, + help="Directory to write selected models") +parser.add_argument( + "--min-models-per-fold", + type=int, + default=2, + metavar="N", + help="Min number of models to select per fold") +parser.add_argument( + "--max-models-per-fold", + type=int, + default=1000, + metavar="N", + help="Max number of models to select per fold") +parser.add_argument( + "--mass-spec-regex", + metavar="REGEX", + default="mass[- ]spec", + help="Regular expression for mass-spec data. Runs on measurement_source col." + "Default: %(default)s.") +parser.add_argument( + "--verbosity", + type=int, + help="Keras verbosity. Default: %(default)s", + default=0) + +add_local_parallelism_args(parser) +add_cluster_parallelism_args(parser) + + +def mse( + predictions, + actual, + inequalities=None, + affinities_are_already_01_transformed=False): + """ + Mean squared error of predictions vs. actual + + Parameters + ---------- + predictions : list of float + actual : list of float + inequalities : list of string (">", "<", or "=") + affinities_are_already_01_transformed : boolean + Predictions and actual are taken to be nanomolar affinities if + affinities_are_already_01_transformed is False, otherwise 0-1 values. + + Returns + ------- + float + """ + if not affinities_are_already_01_transformed: + predictions = from_ic50(predictions) + actual = from_ic50(actual) + + deviations = ( + numpy.array(predictions, copy=False) - numpy.array(actual, copy=False)) + + if inequalities is not None: + # Must reverse meaning of inequality since we are working with + # transformed 0-1 values, which are anti-correlated with the ic50s. + # The measurement_inequality column is given in terms of ic50s. + inequalities = numpy.array(inequalities, copy=False) + deviations[ + ((inequalities == "<") & (deviations > 0)) | ( + (inequalities == ">") & (deviations < 0)) + ] = 0.0 + + return (deviations ** 2).mean() + + +def run(argv=sys.argv[1:]): + global GLOBAL_DATA + + # On sigusr1 print stack trace + print("To show stack trace, run:\nkill -s USR1 %d" % os.getpid()) + signal.signal(signal.SIGUSR1, lambda sig, frame: traceback.print_stack()) + + args = parser.parse_args(argv) + + args.out_models_dir = os.path.abspath(args.out_models_dir) + + configure_logging(verbose=args.verbosity > 1) + + df = pandas.read_csv(args.data) + print("Loaded data: %s" % (str(df.shape))) + + input_predictor = Class1AffinityPredictor.load(args.models_dir) + print("Loaded: %s" % input_predictor) + + alleles = input_predictor.supported_alleles + (min_peptide_length, max_peptide_length) = ( + input_predictor.supported_peptide_lengths) + + metadata_dfs = {} + + if args.folds: + folds_df = pandas.read_csv(args.folds) + matches = all([ + len(folds_df) == len(df), + (folds_df.peptide == df.peptide).all(), + (folds_df.allele == df.allele).all(), + ]) + if not matches: + raise ValueError("Training data and fold data do not match") + fold_cols = [c for c in folds_df if c.startswith("fold_")] + for col in fold_cols: + df[col] = folds_df[col] + + fold_cols = [c for c in df if c.startswith("fold_")] + num_folds = len(fold_cols) + if num_folds <= 1: + raise ValueError("Too few folds: ", num_folds) + + df = df.loc[ + (df.peptide.str.len() >= min_peptide_length) & + (df.peptide.str.len() <= max_peptide_length) + ] + print("Subselected to %d-%dmers: %s" % ( + min_peptide_length, max_peptide_length, str(df.shape))) + + print("Num folds: ", num_folds, "fraction included:") + print(df[fold_cols].mean()) + + # Allele names in data are assumed to be already normalized. + df = df.loc[df.allele.isin(alleles)].dropna() + print("Subselected to supported alleles: %s" % str(df.shape)) + + print("Selected %d alleles: %s" % (len(alleles), ' '.join(alleles))) + + metadata_dfs["model_selection_data"] = df + + df["mass_spec"] = df.measurement_source.str.contains( + args.mass_spec_regex) + + def make_train_peptide_hash(sub_df): + train_peptide_hash = hashlib.sha1() + for peptide in sorted(sub_df.peptide.values): + train_peptide_hash.update(peptide.encode()) + return train_peptide_hash.hexdigest() + + folds_to_predictors = dict( + (int(col.split("_")[-1]), ( + [], + make_train_peptide_hash(df.loc[df[col] == 1]))) + for col in fold_cols) + print(folds_to_predictors) + for model in input_predictor.class1_pan_allele_models: + training_info = model.fit_info[-1]['training_info'] + fold_num = training_info['fold_num'] + assert num_folds == training_info['num_folds'] + (lst, hash) = folds_to_predictors[fold_num] + train_peptide_hash = training_info['train_peptide_hash'] + numpy.testing.assert_equal(hash, train_peptide_hash) + lst.append(model) + + work_items = [] + for (fold_num, (models, _)) in folds_to_predictors.items(): + work_items.append({ + 'fold_num': fold_num, + 'models': models, + 'min_models': args.min_models_per_fold, + 'max_models': args.max_models_per_fold, + }) + + GLOBAL_DATA["data"] = df + GLOBAL_DATA["input_predictor"] = input_predictor + + if not os.path.exists(args.out_models_dir): + print("Attempting to create directory: %s" % args.out_models_dir) + os.mkdir(args.out_models_dir) + print("Done.") + + result_predictor = Class1AffinityPredictor( + allele_to_sequence=input_predictor.allele_to_sequence, + metadata_dataframes=metadata_dfs) + + serial_run = not args.cluster_parallelism and args.num_jobs == 0 + worker_pool = None + start = time.time() + if serial_run: + # Serial run + print("Running in serial.") + results = (do_model_select_task(item) for item in work_items) + elif args.cluster_parallelism: + # Run using separate processes HPC cluster. + print("Running on cluster.") + results = cluster_results_from_args( + args, + work_function=do_model_select_task, + work_items=work_items, + constant_data=GLOBAL_DATA, + result_serialization_method="pickle") + else: + worker_pool = worker_pool_with_gpu_assignments_from_args(args) + print("Worker pool", worker_pool) + assert worker_pool is not None + + print("Processing %d work items in parallel." % len(work_items)) + assert not serial_run + + # Parallel run + results = worker_pool.imap_unordered( + do_model_select_task, work_items, chunksize=1) + + models_by_fold = {} + summary_dfs = [] + for result in tqdm.tqdm(results, total=len(work_items)): + pprint(result) + fold_num = result['fold_num'] + (all_models_for_fold, _) = folds_to_predictors[fold_num] + models = [ + all_models_for_fold[i] + for i in result['selected_indices'] + ] + summary_df = result['summary'].copy() + summary_df.index = summary_df.index.map( + lambda idx: all_models_for_fold[idx]) + summary_dfs.append(summary_df) + + print("Selected %d models for fold %d: %s" % ( + len(models), fold_num, result['selected_indices'])) + models_by_fold[fold_num] = models + for model in models: + result_predictor.add_pan_allele_model(model) + + summary_df = pandas.concat(summary_dfs, ignore_index=False) + summary_df["model_config"] = summary_df.index.map(lambda m: m.get_config()) + result_predictor.metadata_dataframes["model_selection_summary"] = ( + summary_df.reset_index(drop=True)) + + result_predictor.save(args.out_models_dir) + + model_selection_time = time.time() - start + + if worker_pool: + worker_pool.close() + worker_pool.join() + + print("Model selection time %0.2f min." % (model_selection_time / 60.0)) + print("Predictor written to: %s" % args.out_models_dir) + + +def do_model_select_task(item, constant_data=GLOBAL_DATA): + return model_select(constant_data=constant_data, **item) + + +def model_select( + fold_num, models, min_models, max_models, constant_data=GLOBAL_DATA): + """ + Model select for a fold. + + Parameters + ---------- + fold_num : int + models : list of Class1NeuralNetwork + min_models : int + max_models : int + constant_data : dict + + Returns + ------- + dict with keys 'fold_num', 'selected_indices', 'summary' + """ + full_data = constant_data["data"] + input_predictor = constant_data["input_predictor"] + df = full_data.loc[ + full_data["fold_%d" % fold_num] == 0 + ] + + peptides = EncodableSequences.create(df.peptide.values) + alleles = AlleleEncoding( + df.allele.values, + borrow_from=input_predictor.master_allele_encoding) + + predictions_df = df.copy() + for (i, model) in enumerate(models): + predictions_df[i] = from_ic50(model.predict(peptides, alleles)) + + actual = from_ic50(predictions_df.measurement_value) + + selected = [] + selected_score = 0 + remaining_models = set(numpy.arange(len(models))) + individual_model_scores = {} + while remaining_models and len(selected) < max_models: + best_model = None + best_model_score = 0 + for i in remaining_models: + possible_ensemble = list(selected) + [i] + predictions = predictions_df[possible_ensemble].mean(1) + mse_score = 1 - mse( + predictions, + actual, + inequalities=( + predictions_df.measurement_inequality + if 'measurement_inequality' in predictions_df.columns + else None), + affinities_are_already_01_transformed=True) + if mse_score >= best_model_score: + best_model = i + best_model_score = mse_score + if not selected: + # First iteration. Store individual model scores. + individual_model_scores[i] = mse_score + if len(selected) < min_models or best_model_score > selected_score: + selected_score = best_model_score + remaining_models.remove(best_model) + selected.append(best_model) + else: + break + + assert selected + + summary_df = pandas.Series(individual_model_scores)[ + numpy.arange(len(models)) + ].to_frame() + summary_df.columns = ['mse_score'] + + return { + 'fold_num': fold_num, + 'selected_indices': selected, + 'summary': summary_df, # indexed by model index + } + + +if __name__ == '__main__': + run() diff --git a/mhcflurry/testing_utils.py b/mhcflurry/testing_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..64e4965b25c6f169ac69b0bdeb5e4ff89cee2473 --- /dev/null +++ b/mhcflurry/testing_utils.py @@ -0,0 +1,21 @@ +""" +Utilities used in MHCflurry unit tests. +""" +from . import Class1NeuralNetwork +from .common import set_keras_backend + + +def startup(): + """ + Configure Keras backend for running unit tests. + """ + set_keras_backend("tensorflow-cpu", num_threads=2) + + +def cleanup(): + """ + Clear tensorflow session and other process-wide resources. + """ + import keras.backend as K + Class1NeuralNetwork.clear_model_cache() + K.clear_session() diff --git a/mhcflurry/train_allele_specific_models_command.py b/mhcflurry/train_allele_specific_models_command.py index 270acb4a92e760fbfe58c2804fb98b57d673fbf1..ec1b8c8af7adac1e10ef6d3305780b86ea98f41a 100644 --- a/mhcflurry/train_allele_specific_models_command.py +++ b/mhcflurry/train_allele_specific_models_command.py @@ -10,7 +10,6 @@ import traceback import random from functools import partial -import numpy import pandas import yaml from sklearn.metrics.pairwise import cosine_similarity @@ -20,9 +19,9 @@ import tqdm # progress bar tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 from .class1_affinity_predictor import Class1AffinityPredictor -from .common import configure_logging, set_keras_backend -from .parallelism import ( - add_worker_pool_args, +from .common import configure_logging +from .local_parallelism import ( + add_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, call_wrapped_kwargs) from .hyperparameters import HyperparameterDefaults @@ -122,7 +121,7 @@ parser.add_argument( help="Keras verbosity. Default: %(default)s", default=0) -add_worker_pool_args(parser) +add_local_parallelism_args(parser) TRAIN_DATA_HYPERPARAMETER_DEFAULTS = HyperparameterDefaults( subset="all", @@ -150,7 +149,7 @@ def run(argv=sys.argv[1:]): df = pandas.read_csv(args.data) print("Loaded training data: %s" % (str(df.shape))) - df = df.ix[ + df = df.loc[ (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) ] print("Subselected to 8-15mers: %s" % (str(df.shape))) @@ -166,7 +165,7 @@ def run(argv=sys.argv[1:]): if args.allele: alleles = [normalize_allele_name(a) for a in args.allele] else: - alleles = list(allele_counts.ix[ + alleles = list(allele_counts.loc[ allele_counts > args.min_measurements_per_allele ].index) @@ -337,7 +336,7 @@ def alleles_by_similarity(allele): allele_similarity.columns.to_series().sample(frac=1.0)) return ( allele_similarity[allele] + ( - allele_similarity.index == allele) # force that we return specified allele first + allele_similarity.index == allele) # force specified allele first ).sort_values(ascending=False).index.tolist() diff --git a/mhcflurry/train_pan_allele_models_command.py b/mhcflurry/train_pan_allele_models_command.py new file mode 100644 index 0000000000000000000000000000000000000000..c1b015e4573341cae239a306ed52db159c587aac --- /dev/null +++ b/mhcflurry/train_pan_allele_models_command.py @@ -0,0 +1,702 @@ +""" +Train Class1 pan-allele models. +""" +import argparse +import os +from os.path import join +import signal +import sys +import time +import traceback +import random +import pprint +import hashlib +import pickle +import uuid +from functools import partial + +import numpy +import pandas +import yaml +import tqdm # progress bar +tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 + +from .class1_affinity_predictor import Class1AffinityPredictor +from .class1_neural_network import Class1NeuralNetwork +from .common import configure_logging +from .local_parallelism import ( + add_local_parallelism_args, + worker_pool_with_gpu_assignments_from_args, + call_wrapped_kwargs) +from .cluster_parallelism import ( + add_cluster_parallelism_args, + cluster_results_from_args) +from .allele_encoding import AlleleEncoding +from .encodable_sequences import EncodableSequences + + +# To avoid pickling large matrices to send to child processes when running in +# parallel, we use this global variable as a place to store data. Data that is +# stored here before creating the thread pool will be inherited to the child +# processes upon fork() call, allowing us to share large data with the workers +# via shared memory. +GLOBAL_DATA = {} + +# Note on parallelization: +# It seems essential currently (tensorflow==1.4.1) that no processes are forked +# after tensorflow has been used at all, which includes merely importing +# keras.backend. So we must make sure not to use tensorflow in the main process +# if we are running in parallel. + +parser = argparse.ArgumentParser(usage=__doc__) + +parser.add_argument( + "--data", + metavar="FILE.csv", + help=( + "Training data CSV. Expected columns: " + "allele, peptide, measurement_value")) +parser.add_argument( + "--pretrain-data", + metavar="FILE.csv", + help=( + "Pre-training data CSV. Expected columns: " + "allele, peptide, measurement_value")) +parser.add_argument( + "--out-models-dir", + metavar="DIR", + required=True, + help="Directory to write models and manifest") +parser.add_argument( + "--hyperparameters", + metavar="FILE.json", + help="JSON or YAML of hyperparameters") +parser.add_argument( + "--held-out-measurements-per-allele-fraction-and-max", + type=float, + metavar="X", + nargs=2, + default=[0.25, 100], + help="Fraction of measurements per allele to hold out, and maximum number") +parser.add_argument( + "--ignore-inequalities", + action="store_true", + default=False, + help="Do not use affinity value inequalities even when present in data") +parser.add_argument( + "--ensemble-size", + type=int, + metavar="N", + help="Ensemble size, i.e. how many models to retain the final predictor. " + "In the current implementation, this is also the number of training folds.") +parser.add_argument( + "--num-replicates", + type=int, + metavar="N", + default=1, + help="Number of replicates per (architecture, fold) pair to train.") +parser.add_argument( + "--max-epochs", + type=int, + metavar="N", + help="Max training epochs. If specified here it overrides any 'max_epochs' " + "specified in the hyperparameters.") +parser.add_argument( + "--allele-sequences", + metavar="FILE.csv", + help="Allele sequences file.") +parser.add_argument( + "--verbosity", + type=int, + help="Keras verbosity. Default: %(default)s", + default=0) +parser.add_argument( + "--debug", + action="store_true", + default=False, + help="Launch python debugger on error") +parser.add_argument( + "--continue-incomplete", + action="store_true", + default=False, + help="Continue training models from an incomplete training run. If this is " + "specified then the only required argument is --out-models-dir") +parser.add_argument( + "--only-initialize", + action="store_true", + default=False, + help="Do not actually train models. The initialized run can be continued " + "later with --continue-incomplete.") + +add_local_parallelism_args(parser) +add_cluster_parallelism_args(parser) + + +def assign_folds(df, num_folds, held_out_fraction, held_out_max): + """ + Split training data into multple test/train pairs, which we refer to as + folds. Note that a given data point may be assigned to multiple test or + train sets; these folds are NOT a non-overlapping partition as used in cross + validation. + + A fold is defined by a boolean value for each data point, indicating whether + it is included in the training data for that fold. If it's not in the + training data, then it's in the test data. + + Folds are balanced in terms of allele content. + + Parameters + ---------- + df : pandas.DataFrame + training data + num_folds : int + held_out_fraction : float + Fraction of data to hold out as test data in each fold + held_out_max + For a given allele, do not hold out more than held_out_max number of + data points in any fold. + + Returns + ------- + pandas.DataFrame + index is same as df.index, columns are "fold_0", ... "fold_N" giving + whether the data point is in the training data for the fold + """ + result_df = pandas.DataFrame(index=df.index) + + for fold in range(num_folds): + result_df["fold_%d" % fold] = True + for (allele, sub_df) in df.groupby("allele"): + medians = sub_df.groupby("peptide").measurement_value.median() + + low_peptides = medians[medians < medians.median()].index.values + high_peptides = medians[medians >= medians.median()].index.values + + held_out_count = int( + min(len(medians) * held_out_fraction, held_out_max)) + + held_out_peptides = set() + if held_out_count == 0: + pass + elif held_out_count < 2: + held_out_peptides = set( + medians.index.to_series().sample(n=held_out_count)) + else: + held_out_low_count = min( + len(low_peptides), + int(held_out_count / 2)) + held_out_high_count = min( + len(high_peptides), + held_out_count - held_out_low_count) + + held_out_low = pandas.Series(low_peptides).sample( + n=held_out_low_count) if held_out_low_count else set() + held_out_high = pandas.Series(high_peptides).sample( + n=held_out_high_count) if held_out_high_count else set() + held_out_peptides = set(held_out_low).union(set(held_out_high)) + + result_df.loc[ + sub_df.index[sub_df.peptide.isin(held_out_peptides)], + "fold_%d" % fold + ] = False + + print("Training points per fold") + print(result_df.sum()) + + print("Test points per fold") + print((~result_df).sum()) + return result_df + + +def pretrain_data_iterator( + filename, + master_allele_encoding, + peptides_per_chunk=1024): + """ + Step through a CSV file giving predictions for a large number of peptides + (rows) and alleles (columns). + + Parameters + ---------- + filename : string + master_allele_encoding : AlleleEncoding + peptides_per_chunk : int + + Returns + ------- + Generator of (AlleleEncoding, EncodableSequences, float affinities) tuples + + """ + empty = pandas.read_csv(filename, index_col=0, nrows=0) + usable_alleles = [ + c for c in empty.columns + if c in master_allele_encoding.allele_to_sequence + ] + print("Using %d / %d alleles" % (len(usable_alleles), len(empty.columns))) + print("Skipped alleles: ", [ + c for c in empty.columns + if c not in master_allele_encoding.allele_to_sequence + ]) + + allele_encoding = AlleleEncoding( + numpy.tile(usable_alleles, peptides_per_chunk), + borrow_from=master_allele_encoding) + + while True: + synthetic_iter = pandas.read_csv( + filename, index_col=0, chunksize=peptides_per_chunk) + for (k, df) in enumerate(synthetic_iter): + if len(df) != peptides_per_chunk: + continue + + df = df[usable_alleles] + encodable_peptides = EncodableSequences( + numpy.repeat( + df.index.values, + len(usable_alleles))) + + yield (allele_encoding, encodable_peptides, df.stack().values) + + +def run(argv=sys.argv[1:]): + # On sigusr1 print stack trace + print("To show stack trace, run:\nkill -s USR1 %d" % os.getpid()) + signal.signal(signal.SIGUSR1, lambda sig, frame: traceback.print_stack()) + + args = parser.parse_args(argv) + + if args.debug: + try: + return main(args) + except Exception as e: + print(e) + import ipdb # pylint: disable=import-error + ipdb.set_trace() + raise + else: + return main(args) + + +def main(args): + print("Arguments:") + print(args) + + args.out_models_dir = os.path.abspath(args.out_models_dir) + configure_logging(verbose=args.verbosity > 1) + + if not args.continue_incomplete: + initialize_training(args) + + if not args.only_initialize: + train_models(args) + + +def initialize_training(args): + required_arguments = [ + "data", + "out_models_dir", + "hyperparameters", + "ensemble_size", + ] + for arg in required_arguments: + if getattr(args, arg) is None: + parser.error("Missing required arg: %s" % arg) + + print("Initializing training.") + hyperparameters_lst = yaml.load(open(args.hyperparameters)) + assert isinstance(hyperparameters_lst, list) + print("Loaded hyperparameters list:") + pprint.pprint(hyperparameters_lst) + + allele_sequences = pandas.read_csv( + args.allele_sequences, index_col=0).sequence + + df = pandas.read_csv(args.data) + print("Loaded training data: %s" % (str(df.shape))) + df = df.loc[ + (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) + ] + print("Subselected to 8-15mers: %s" % (str(df.shape))) + + df = df.loc[~df.measurement_value.isnull()] + print("Dropped NaNs: %s" % (str(df.shape))) + + df = df.loc[df.allele.isin(allele_sequences.index)] + print("Subselected to alleles with sequences: %s" % (str(df.shape))) + + print("Data inequalities:") + print(df.measurement_inequality.value_counts()) + + if args.ignore_inequalities and "measurement_inequality" in df.columns: + print("Dropping measurement_inequality column") + del df["measurement_inequality"] + # Allele names in data are assumed to be already normalized. + print("Training data: %s" % (str(df.shape))) + + (held_out_fraction, held_out_max) = ( + args.held_out_measurements_per_allele_fraction_and_max) + + folds_df = assign_folds( + df=df, + num_folds=args.ensemble_size, + held_out_fraction=held_out_fraction, + held_out_max=held_out_max) + + allele_sequences_in_use = allele_sequences[ + allele_sequences.index.isin(df.allele) + ] + print("Will use %d / %d allele sequences" % ( + len(allele_sequences_in_use), len(allele_sequences))) + + # All alleles, not just those with training data. + full_allele_encoding = AlleleEncoding( + alleles=allele_sequences.index.values, + allele_to_sequence=allele_sequences.to_dict() + ) + + # Only alleles with training data. For efficiency we perform model training + # using only these alleles in the neural network embedding layer. + allele_encoding = AlleleEncoding( + alleles=allele_sequences_in_use.index.values, + allele_to_sequence=allele_sequences_in_use.to_dict()) + + if not os.path.exists(args.out_models_dir): + print("Attempting to create directory: %s" % args.out_models_dir) + os.mkdir(args.out_models_dir) + print("Done.") + + predictor = Class1AffinityPredictor( + allele_to_sequence=allele_encoding.allele_to_sequence, + metadata_dataframes={ + 'train_data': pandas.merge( + df, + folds_df, + left_index=True, + right_index=True) + }) + + work_items = [] + for (h, hyperparameters) in enumerate(hyperparameters_lst): + if 'n_models' in hyperparameters: + raise ValueError("n_models is unsupported") + + if args.max_epochs: + hyperparameters['max_epochs'] = args.max_epochs + + if hyperparameters.get("train_data", {}).get("pretrain", False): + if not args.pretrain_data: + raise ValueError("--pretrain-data is required") + + for fold in range(args.ensemble_size): + for replicate in range(args.num_replicates): + work_dict = { + 'work_item_name': str(uuid.uuid4()), + 'architecture_num': h, + 'num_architectures': len(hyperparameters_lst), + 'fold_num': fold, + 'num_folds': args.ensemble_size, + 'replicate_num': replicate, + 'num_replicates': args.num_replicates, + 'hyperparameters': hyperparameters, + 'pretrain_data_filename': args.pretrain_data, + } + work_items.append(work_dict) + + training_init_info = {} + training_init_info["train_data"] = df + training_init_info["folds_df"] = folds_df + training_init_info["allele_encoding"] = allele_encoding + training_init_info["full_allele_encoding"] = full_allele_encoding + training_init_info["work_items"] = work_items + + # Save empty predictor (for metadata) + predictor.save(args.out_models_dir) + + # Write training_init_info. + with open(join(args.out_models_dir, "training_init_info.pkl"), "wb") as fd: + pickle.dump(training_init_info, fd, protocol=pickle.HIGHEST_PROTOCOL) + + print("Done initializing training.") + + +def train_models(args): + global GLOBAL_DATA + + print("Beginning training.") + predictor = Class1AffinityPredictor.load(args.out_models_dir) + print("Loaded predictor with %d networks" % len(predictor.neural_networks)) + + with open(join(args.out_models_dir, "training_init_info.pkl"), "rb") as fd: + GLOBAL_DATA.update(pickle.load(fd)) + print("Loaded training init info:") + print(GLOBAL_DATA) + + all_work_items = GLOBAL_DATA["work_items"] + complete_work_item_names = [ + network.fit_info[-1]["training_info"]["work_item_name"] for network in + predictor.neural_networks + ] + work_items = [ + item for item in all_work_items + if item["work_item_name"] not in complete_work_item_names + ] + print("Found %d work items, of which %d are incomplete and will run now." % ( + len(all_work_items), len(work_items))) + + serial_run = not args.cluster_parallelism and args.num_jobs == 0 + + # The estimated time to completion is more accurate if we randomize + # the order of the work. + random.shuffle(work_items) + for (work_item_num, item) in enumerate(work_items): + item['work_item_num'] = work_item_num + item['num_work_items'] = len(work_items) + item['progress_print_interval'] = 60.0 if not serial_run else 5.0 + item['predictor'] = predictor if serial_run else None + item['save_to'] = args.out_models_dir if serial_run else None + item['verbose'] = args.verbosity + if args.pretrain_data: + item['pretrain_data_filename'] = args.pretrain_data + + start = time.time() + + worker_pool = None + if serial_run: + # Run in serial. Every worker is passed the same predictor, + # which it adds models to, so no merging is required. It also saves + # as it goes so no saving is required at the end. + print("Processing %d work items in serial." % len(work_items)) + for _ in tqdm.trange(len(work_items)): + item = work_items.pop(0) # want to keep freeing up memory + work_predictor = train_model(**item) + assert work_predictor is predictor + assert not work_items + results_generator = None + elif args.cluster_parallelism: + # Run using separate processes HPC cluster. + results_generator = cluster_results_from_args( + args, + work_function=train_model, + work_items=work_items, + constant_data=GLOBAL_DATA, + result_serialization_method="save_predictor") + else: + worker_pool = worker_pool_with_gpu_assignments_from_args(args) + print("Worker pool", worker_pool) + assert worker_pool is not None + + print("Processing %d work items in parallel." % len(work_items)) + assert not serial_run + + results_generator = worker_pool.imap_unordered( + partial(call_wrapped_kwargs, train_model), + work_items, + chunksize=1) + + if results_generator: + for new_predictor in tqdm.tqdm(results_generator, total=len(work_items)): + save_start = time.time() + (new_model_name,) = predictor.merge_in_place([new_predictor]) + predictor.save( + args.out_models_dir, + model_names_to_write=[new_model_name], + write_metadata=False) + print( + "Saved predictor (%d models total) with 1 new models" + "in %0.2f sec to %s" % ( + len(predictor.neural_networks), + time.time() - save_start, + args.out_models_dir)) + + # We want the final predictor to support all alleles with sequences, not + # just those we actually used for model training. + predictor.allele_to_sequence = ( + GLOBAL_DATA['full_allele_encoding'].allele_to_sequence) + predictor.clear_cache() + predictor.save(args.out_models_dir) + print("Done.") + + print("*" * 30) + training_time = time.time() - start + print("Trained affinity predictor with %d networks in %0.2f min." % ( + len(predictor.neural_networks), training_time / 60.0)) + print("*" * 30) + + if worker_pool: + worker_pool.close() + worker_pool.join() + + print("Predictor written to: %s" % args.out_models_dir) + + +def train_model( + work_item_name, + work_item_num, + num_work_items, + architecture_num, + num_architectures, + fold_num, + num_folds, + replicate_num, + num_replicates, + hyperparameters, + pretrain_data_filename, + verbose, + progress_print_interval, + predictor, + save_to, + constant_data=GLOBAL_DATA): + + df = constant_data["train_data"] + folds_df = constant_data["folds_df"] + allele_encoding = constant_data["allele_encoding"] + + if predictor is None: + predictor = Class1AffinityPredictor( + allele_to_sequence=allele_encoding.allele_to_sequence) + + numpy.testing.assert_equal(len(df), len(folds_df)) + + train_data = df.loc[ + folds_df["fold_%d" % fold_num] + ].sample(frac=1.0) + + train_peptides = EncodableSequences(train_data.peptide.values) + train_alleles = AlleleEncoding( + train_data.allele.values, borrow_from=allele_encoding) + + progress_preamble = ( + "[task %2d / %2d]: " + "[%2d / %2d folds] " + "[%2d / %2d architectures] " + "[%4d / %4d replicates] " % ( + work_item_num + 1, + num_work_items, + fold_num + 1, + num_folds, + architecture_num + 1, + num_architectures, + replicate_num + 1, + num_replicates)) + + print("%s [pid %d]. Hyperparameters:" % (progress_preamble, os.getpid())) + pprint.pprint(hyperparameters) + + train_params = dict(hyperparameters.get("train_data", {})) + + def get_train_param(param, default): + if param in train_params: + result = train_params.pop(param) + if verbose: + print("Train param", param, "=", result) + else: + result = default + if verbose: + print("Train param", param, "=", result, "[default]") + return result + + if get_train_param("pretrain", False): + pretrain_patience = get_train_param("pretrain_patience", 10) + pretrain_min_delta = get_train_param("pretrain_min_delta", 0.0) + pretrain_steps_per_epoch = get_train_param( + "pretrain_steps_per_epoch", 10) + pretrain_max_epochs = get_train_param("pretrain_max_epochs", 1000) + pretrain_min_epochs = get_train_param("pretrain_min_epochs", 0) + pretrain_peptides_per_step = get_train_param( + "pretrain_peptides_per_step", 1024) + max_val_loss = get_train_param("pretrain_max_val_loss", None) + + if verbose: + print("Unused train params", train_params) + + attempt = 0 + while True: + attempt += 1 + print("Pre-training attempt %d" % attempt) + if attempt > 10: + print("Too many pre-training attempts! Stopping pretraining.") + break + + model = Class1NeuralNetwork(**hyperparameters) + assert model.network() is None + generator = pretrain_data_iterator( + pretrain_data_filename, + allele_encoding, + peptides_per_chunk=pretrain_peptides_per_step) + + model.fit_generator( + generator, + validation_peptide_encoding=train_peptides, + validation_affinities=train_data.measurement_value.values, + validation_allele_encoding=train_alleles, + validation_inequalities=train_data.measurement_inequality.values, + patience=pretrain_patience, + min_delta=pretrain_min_delta, + steps_per_epoch=pretrain_steps_per_epoch, + epochs=pretrain_max_epochs, + min_epochs=pretrain_min_epochs, + verbose=verbose, + progress_preamble=progress_preamble + "PRETRAIN", + progress_print_interval=progress_print_interval, + ) + model.fit_info[-1].setdefault( + "training_info", {})["pretrain_attempt"] = attempt + if not max_val_loss: + break + final_val_loss = model.fit_info[-1]["val_loss"][-1] + if final_val_loss >= max_val_loss: + print("Val loss %f >= max val loss %f. Pre-training again." % ( + final_val_loss, max_val_loss)) + else: + print("Val loss %f < max val loss %f. Done pre-training." % ( + final_val_loss, max_val_loss)) + break + + # Use a smaller learning rate for training on real data + learning_rate = model.fit_info[-1]["learning_rate"] + model.hyperparameters['learning_rate'] = learning_rate / 10 + else: + model = Class1NeuralNetwork(**hyperparameters) + + model.fit( + peptides=train_peptides, + affinities=train_data.measurement_value.values, + allele_encoding=train_alleles, + inequalities=( + train_data.measurement_inequality.values + if "measurement_inequality" in train_data.columns else None), + progress_preamble=progress_preamble, + progress_print_interval=progress_print_interval, + verbose=verbose) + + # Save model-specific training info + train_peptide_hash = hashlib.sha1() + for peptide in sorted(train_data.peptide.values): + train_peptide_hash.update(peptide.encode()) + + model.fit_info[-1].setdefault("training_info", {}).update({ + "fold_num": fold_num, + "num_folds": num_folds, + "replicate_num": replicate_num, + "num_replicates": num_replicates, + "architecture_num": architecture_num, + "num_architectures": num_architectures, + "train_peptide_hash": train_peptide_hash.hexdigest(), + "work_item_name": work_item_name, + }) + + numpy.testing.assert_equal( + predictor.manifest_df.shape[0], len(predictor.class1_pan_allele_models)) + predictor.add_pan_allele_model(model, models_dir_for_save=save_to) + numpy.testing.assert_equal( + predictor.manifest_df.shape[0], len(predictor.class1_pan_allele_models)) + predictor.clear_cache() + + # Delete the network to release memory + model.update_network_description() # save weights and config + model._network = None # release tensorflow network + return predictor + + +if __name__ == '__main__': + run() diff --git a/mhcflurry/version.py b/mhcflurry/version.py index b3f9ac7f1a3db1c3b67eb7be431b87759bd13ce4..67bc602abf06e9bcea675fe21c56a2f3c76bc331 100644 --- a/mhcflurry/version.py +++ b/mhcflurry/version.py @@ -1 +1 @@ -__version__ = "1.2.4" +__version__ = "1.3.0" diff --git a/requirements.txt b/requirements.txt index da0ceda3a648a43ba10b5d6b82c760e5152c1574..f9de6c97e13a7ef60ce6314259f1e68382e2bd27 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,3 +8,4 @@ scikit-learn mhcnames pyyaml tqdm +np_utils \ No newline at end of file diff --git a/setup.py b/setup.py index fe12d96338e55dc75b010a93861ff53e78a873be..3842bcf6217a2b57ea69ff5ef319e4d80394983a 100644 --- a/setup.py +++ b/setup.py @@ -58,11 +58,8 @@ if __name__ == '__main__': 'mhcnames', 'pyyaml', 'tqdm', + 'np_utils', ] - if PY2: - # concurrent.futures is a standard library in Py3 but Py2 - # requires this backport - required_packages.append('futures') setup( name='mhcflurry', @@ -78,14 +75,20 @@ if __name__ == '__main__': 'mhcflurry-predict = mhcflurry.predict_command:run', 'mhcflurry-class1-train-allele-specific-models = ' 'mhcflurry.train_allele_specific_models_command:run', + 'mhcflurry-class1-train-pan-allele-models = ' + 'mhcflurry.train_pan_allele_models_command:run', 'mhcflurry-class1-select-allele-specific-models = ' 'mhcflurry.select_allele_specific_models_command:run', + 'mhcflurry-class1-select-pan-allele-models = ' + 'mhcflurry.select_pan_allele_models_command:run', 'mhcflurry-calibrate-percentile-ranks = ' 'mhcflurry.calibrate_percentile_ranks_command:run', + '_mhcflurry-cluster-worker-entry-point = ' + 'mhcflurry.cluster_parallelism:worker_entry_point', ] }, classifiers=[ - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Operating System :: OS Independent', 'Intended Audience :: Science/Research', diff --git a/test/data/hpv_predictions.csv b/test/data/hpv_predictions.csv new file mode 100644 index 0000000000000000000000000000000000000000..954f27143e5e6878a1d199df9f61d5885ae6738e --- /dev/null +++ b/test/data/hpv_predictions.csv @@ -0,0 +1,476 @@ +allele,peptide,Length,Affinity (uM),Binding Capacity,Status,Security,affinity,netmhcpan3,netmhcpan4,netmhc,MHCflurry 1.2.0,MHCflurry (train MS),MHCflurry (no MS) +HLA-A*02:01,LMGTLGIVCPI,11,0.29,strong,novel,CONFIDENTIAL,290.0,261.8,214.5,248.47,167.22380960425482,74.84751152620106,301.93403988869073 +HLA-A*02:01,RTLEDLLMGTL,11,1.95,strong,novel,CONFIDENTIAL,1950.0,3836.9,2582.2,3257.01,2830.2157958268767,2188.9538132772736,2132.3345643653206 +HLA-A*02:01,MGTLGIVCPI,10,2.01,strong,novel,CONFIDENTIAL,2010.0,322.0,296.3,393.31,7561.020273281272,7718.081462632219,4225.447860121435 +HLA-A*02:01,YMLDLQPETTD,11,2.83,strong,novel,CONFIDENTIAL,2830.0,11400.9,9155.6,4351.54,6287.6952523646105,9355.44304469742,5658.571030354306 +HLA-A*02:01,FQDPQERPI,9,3.36,strong,novel,CONFIDENTIAL,3360.0,2044.2,2257.7,1166.07,735.5087046488492,1298.7161222243133,1665.7433194119546 +HLA-A*02:01,TTIHEIILECV,11,3.57,strong,novel,CONFIDENTIAL,3570.0,8613.5,4527.0,3024.93,2554.8469340269025,1810.7353167190304,1699.1128317557593 +HLA-A*02:01,KLPDLCTELQT,11,3.9,strong,novel,CONFIDENTIAL,3900.0,11935.0,6485.2,6742.69,1493.95057048418,2041.3286363075747,3488.3542353067187 +HLA-A*02:01,TIHEIILECV,10,6.61,intermediate,novel,CONFIDENTIAL,6610.0,451.8,408.9,259.31,1428.0179037333828,698.7850153544011,1037.8827485898053 +HLA-A*02:01,TIHEIRLECV,10,8.62,intermediate,novel,CONFIDENTIAL,8620.0,2086.4,1587.4,1719.29,2623.970703334057,1942.8046329664567,2620.8693158569736 +HLA-A*02:01,YMLDLQPE,8,9.69,intermediate,novel,CONFIDENTIAL,9690.0,7303.5,8102.5,5042.35,782.0608447431365,981.9365057280755,2292.0327441099435 +HLA-A*02:01,ELQTTIHEI,9,10.61,intermediate,novel,CONFIDENTIAL,10610.0,2957.5,2929.5,1769.68,2295.581304708852,1796.3302915309757,2763.6730228020515 +HLA-A*02:01,EDLLMGTLGIV,11,12.07,intermediate,novel,CONFIDENTIAL,12070.0,1599.5,1510.9,971.14,14678.11653386876,18844.65527176244,11576.74126684321 +HLA-A*02:01,TTIHEIRLECV,11,14.01,intermediate,novel,CONFIDENTIAL,14010.0,17971.1,12699.0,10173.59,5309.987246377647,3922.455924078571,6448.9484310722155 +HLA-A*02:01,FQDPQERPIKL,11,14.03,intermediate,novel,CONFIDENTIAL,14030.0,11214.0,6086.6,8579.48,2232.255948165024,2319.270770821285,5867.236637410394 +HLA-A*02:01,KLPQLCTELQT,11,27.145,weak,novel,CONFIDENTIAL,27145.0,16616.3,8531.1,10551.05,4005.921189159136,5135.113451729935,7277.304901511617 +HLA-A*02:01,RYYCYSVYGT,10,28.2,weak,novel,CONFIDENTIAL,28200.0,13147.0,15049.1,18721.52,9613.502999977934,9152.728921945634,9621.349989269409 +HLA-A*02:01,YRYYCYSV,8,29.43,weak,novel,CONFIDENTIAL,29430.0,22112.3,19446.0,9128.42,906.80060226134,659.7409889715294,2156.7317840689675 +HLA-A*02:01,YRYYCYSL,8,32.78,weak,novel,CONFIDENTIAL,32780.0,23243.3,20212.7,14919.58,2964.261133692841,2320.4297748900585,6774.905546806434 +HLA-A*02:01,TTIHDIILECV,11,35.72063432,weak,novel,CONFIDENTIAL,35720.63432,7569.3,3945.1,3483.89,1682.8116357450924,999.0395725488116,859.2392689717731 +HLA-A*02:01,LLMGTLGIVCP,11,47.53,weak,novel,CONFIDENTIAL,47530.0,3969.1,2993.6,3239.61,4453.276686751863,5139.813945807773,3630.920394105956 +HLA-A*02:01,ILECVYCKQQL,11,48.75666667,weak,novel,CONFIDENTIAL,48756.66667,5305.8,4136.1,8507.65,4865.669632619836,7471.308350302104,6224.036410094804 +HLA-A*02:01,IRTLEDLLMGT,11,54.56,weak,novel,CONFIDENTIAL,54560.0,9448.4,5149.0,8339.86,15749.863216740647,17063.417773345544,12394.628341531134 +HLA-A*02:01,MLDLQPET,8,59.36,weak,novel,CONFIDENTIAL,59360.0,9487.8,11631.9,4072.64,4314.772648482042,4568.488501987155,7890.133873821171 +HLA-A*02:01,KISEYRYYCYS,11,65.6,weak,novel,CONFIDENTIAL,65600.0,21152.4,18205.2,25066.62,7743.224282745778,8249.90329061251,7770.289216385544 +HLA-A*02:01,SEYRYYCYSV,10,76.64,weak,novel,CONFIDENTIAL,76640.0,6925.8,7485.7,6255.27,1083.5856435034402,1243.166012373093,2682.1753853576192 +HLA-A*02:01,SEYRYYCYSL,10,78.22,weak,novel,CONFIDENTIAL,78220.0,12376.5,14030.9,11628.92,3409.681674777167,3911.731710904121,7951.765029734319 +HLA-A*02:01,TIHEIILEC,9,82.01,weak,novel,CONFIDENTIAL,82010.0,3635.3,3470.3,3629.49,7046.813797831271,6971.597573231845,8045.3140793790035 +HLA-A*02:01,DLLMGTLGIVC,11,83.34,weak,novel,CONFIDENTIAL,83340.0,5638.5,10687.9,2747.2,8054.668925826633,11427.961477186245,2380.608862941643 +HLA-A*01:01,CTELQTTIH,9,1.4,strong,novel,CONFIDENTIAL,1400.0,1036.7,2136.9,6705.74,1528.1812706714318,1429.5692489150265,2060.9423819981425 +HLA-A*01:01,DLQPETTDLY,10,1.77,strong,novel,CONFIDENTIAL,1770.0,2245.9,1323.5,3675.65,193.50561967984606,201.231897331688,290.17355954864087 +HLA-A*01:01,AVCDKCLKFY,10,2.7,strong,novel,CONFIDENTIAL,2700.0,1140.4,1547.3,3210.16,6849.596682068725,8034.716592367712,5342.243682887992 +HLA-A*01:01,LKFYSKISEY,10,7.7,intermediate,novel,CONFIDENTIAL,7700.0,14948.7,15773.3,17014.02,12422.761301072042,12400.829967565891,10658.091389039851 +HLA-A*01:01,GTTLEQQY,8,16.2,weak,novel,CONFIDENTIAL,16200.0,15250.7,14780.6,11701.75,1059.4330640275084,1520.6973609096137,5918.9567991423155 +HLA-A*01:01,KISEYRHYCY,10,18.4,weak,novel,CONFIDENTIAL,18400.0,1377.0,1230.1,330.74,1453.3474707081182,1482.838019653631,1479.8110134773426 +HLA-A*01:01,DTPTLHEY,8,32.0,weak,novel,CONFIDENTIAL,32000.0,7096.4,8641.0,6601.07,1203.6621607075274,1486.3283925246994,5269.391140890927 +HLA-A*03:01,LIRCINCQK,9,4.67,strong,novel,CONFIDENTIAL,4670.0,162.3,145.8,375.07,204.0478698313392,435.8311949480205,350.2389716370093 +HLA-A*03:01,GIVCPICSQK,10,6.49,intermediate,novel,CONFIDENTIAL,6490.0,156.6,157.8,343.48,215.34416992422456,230.1221633521149,151.1602721982741 +HLA-A*03:01,AVCDKCLKFY,10,9.29,intermediate,novel,CONFIDENTIAL,9290.0,990.5,1364.5,932.09,2047.2596287287881,2735.4138567447353,2745.2271592296443 +HLA-A*03:01,SLYGTTLEQQY,11,10.06,intermediate,novel,CONFIDENTIAL,10060.0,162.5,131.8,233.79,1272.2137029730231,1360.821450087417,1225.4807167540018 +HLA-A*03:01,KFYSKISEYR,10,11.72,intermediate,novel,CONFIDENTIAL,11720.0,924.2,1046.0,319.36,535.3088903701828,659.2740478699708,599.8433012394488 +HLA-A*03:01,GTTLEQQYNK,10,17.33,weak,novel,CONFIDENTIAL,17330.0,1092.1,804.8,1292.32,1025.619711037487,1096.7490729173253,1019.6007981576853 +HLA-A*03:01,KQRFHNIRGR,10,21.01,weak,novel,CONFIDENTIAL,21010.0,1768.7,1270.2,1602.6,932.8032378723947,854.2980408145897,1234.1362547195588 +HLA-A*03:01,CVYCKQQLLR,10,30.56,weak,novel,CONFIDENTIAL,30560.0,377.7,319.8,112.79,56.32241532369268,52.70881959032983,52.85686131251664 +HLA-A*03:01,AVCDKCLK,8,34.39,weak,novel,CONFIDENTIAL,34390.0,5533.2,7695.2,6961.08,219.5139365424112,772.7494025534432,1790.5815297337801 +HLA-A*03:01,RHYCYSLY,8,58.09,weak,novel,CONFIDENTIAL,58090.0,10536.2,12510.7,10604.15,5011.41873021642,4586.303522172484,5479.046498205236 +HLA-A*11:01,FAFRDLCIVYR,11,2.67,strong,novel,CONFIDENTIAL,2670.0,1597.0,1170.5,6087.15,198.5418558836729,767.7842293451082,759.5269541462752 +HLA-A*11:01,AVCDKCLKFY,10,4.8,strong,novel,CONFIDENTIAL,4800.0,533.8,419.6,219.88,488.06798984272723,1069.0895760249005,1703.2245972516055 +HLA-A*11:01,LIRCINCQK,9,5.21,intermediate,novel,CONFIDENTIAL,5210.0,287.3,338.0,1089.12,398.9452823944749,1091.5759819174523,1239.654411219963 +HLA-A*11:01,TLEQQYNK,8,6.03,intermediate,novel,CONFIDENTIAL,6030.0,5308.2,7464.8,3131.9,376.55410528228134,2962.719959672343,4638.566296504541 +HLA-A*11:01,LGIVCPICSQK,11,6.32,intermediate,novel,CONFIDENTIAL,6320.0,1398.0,1627.3,1807.2,1571.9827102006725,3357.029177949049,1283.0588085190461 +HLA-A*11:01,ILECVYCK,8,8.34,intermediate,novel,CONFIDENTIAL,8340.0,2359.2,4510.3,4750.58,162.8377973720471,1098.030205507943,1498.1961045921537 +HLA-A*11:01,AVCDKCLKFYS,11,11.51,intermediate,novel,CONFIDENTIAL,11510.0,11471.3,12747.5,9182.5,760.7260316491818,2889.8862445569057,2580.9365830201405 +HLA-A*11:01,RCMSCCRSSR,10,12.19,intermediate,novel,CONFIDENTIAL,12190.0,1721.1,1956.4,1927.66,10366.764450311626,17378.519334733573,16695.884904110924 +HLA-A*11:01,YAVCDKCLK,9,12.64,intermediate,novel,CONFIDENTIAL,12640.0,979.9,834.3,1462.48,305.35638363147206,1246.2218943284665,1720.2926725701159 +HLA-A*11:01,DLLIRCINCQK,11,14.75,intermediate,novel,CONFIDENTIAL,14750.0,3140.1,5360.6,4278.29,3141.671074869477,6922.462818808072,7522.20865864938 +HLA-A*11:01,YNIVTFCCK,9,15.83,weak,novel,CONFIDENTIAL,15830.0,961.0,780.0,2722.16,1366.3231568518531,1823.5975197172027,1245.35475751254 +HLA-A*11:01,PYAVCDKCLK,10,15.99,weak,novel,CONFIDENTIAL,15990.0,7038.1,7230.3,8296.39,6694.072757669444,7382.799710571277,6964.978182003566 +HLA-A*11:01,NIVTFCCK,8,17.88,weak,novel,CONFIDENTIAL,17880.0,5011.1,7719.3,8169.19,177.44387922524263,1271.0049548564928,1324.9382491538568 +HLA-A*11:01,EVYDFAFR,8,27.75,weak,novel,CONFIDENTIAL,27750.0,4961.4,6460.5,9341.53,146.23879735518875,1179.4278141381164,803.5471316545512 +HLA-A*11:01,AHYNIVTFCCK,11,28.95,weak,novel,CONFIDENTIAL,28950.0,5908.5,3047.8,4515.23,1799.4665054888096,4097.776212326945,2556.585920952502 +HLA-A*11:01,NPYAVCDKCLK,11,31.11,weak,novel,CONFIDENTIAL,31110.0,18020.2,12853.2,19279.42,5561.112420245893,8852.317456986519,8280.409444184594 +HLA-A*11:01,CVYCKQQLLR,10,36.49,weak,novel,CONFIDENTIAL,36490.0,348.8,356.5,506.27,54.98115951529731,125.60064701018942,161.45982239468202 +HLA-A*11:01,YAVCDKCLKFY,11,40.88,weak,novel,CONFIDENTIAL,40880.0,7708.6,10967.8,2634.65,7952.677805963036,12250.765710981861,16787.055726162154 +HLA-A*11:01,YGTTLEQQYNK,11,43.48,weak,novel,CONFIDENTIAL,43480.0,956.5,539.9,962.76,4318.5973365009995,7398.7202017867285,7566.772095061476 +HLA-A*11:01,AFRDLCIVYR,10,47.68,weak,novel,CONFIDENTIAL,47680.0,3801.2,2782.3,6053.46,2622.759087481481,4940.091758791927,3030.899009631936 +HLA-A*11:01,AVCDKCLKF,9,48.82,weak,novel,CONFIDENTIAL,48820.0,12744.2,10508.3,9085.16,3531.4624077727067,6345.713974481844,6720.213609332939 +HLA-A*11:01,KISEYRHYCY,10,48.83,weak,novel,CONFIDENTIAL,48830.0,553.5,715.8,263.87,96.67683826219296,125.95280812849022,97.50901080742322 +HLA-A*11:01,VCDKCLKFYSK,11,58.43,weak,novel,CONFIDENTIAL,58430.0,20498.8,16472.8,16577.36,2927.256576617747,5664.311988434344,4358.709052700608 +HLA-A*11:01,WTGRCMSCCR,10,82.74,weak,novel,CONFIDENTIAL,82740.0,4430.8,5391.6,15228.16,3411.959775768269,5846.378194697021,5182.588436200903 +HLA-A*24:02,VYDFAFRDLCI,11,0.256666667,strong,novel,CONFIDENTIAL,256.6666667,2621.4,2073.9,2480.67,648.37494940904,1484.3033637780072,5029.309818093023 +HLA-A*24:02,PYAVCDKCLKF,11,0.28,strong,novel,CONFIDENTIAL,280.0,3417.5,1843.7,1976.58,83.28087797328301,243.88324986590942,3576.553843681802 +HLA-A*24:02,VYGTTLEQQY,10,0.68,strong,novel,CONFIDENTIAL,680.0,8525.7,8380.9,6614.94,1629.7666773485894,3107.701590567886,4106.562015411532 +HLA-A*24:02,TFCCKCDSTL,10,0.7533333329999999,strong,novel,CONFIDENTIAL,753.3333332999997,5243.0,8383.4,9077.1,3332.1846862068824,5905.839785214386,4944.675457011142 +HLA-A*24:02,QYNKPLCDLLI,11,0.7666666670000001,strong,novel,CONFIDENTIAL,766.6666667000003,1659.7,1162.3,2768.8,134.74745049246454,402.8452453716209,542.4886114927364 +HLA-A*24:02,KLPQLCTEL,9,0.83,strong,novel,CONFIDENTIAL,830.0,6113.0,6747.1,11100.88,1551.3652961517096,3712.5243927747533,5494.156914058253 +HLA-A*24:02,VYRDGNPYAV,10,1.06,strong,novel,CONFIDENTIAL,1060.0,1933.7,2111.0,3259.54,402.34460018719125,1015.4575794850017,1397.3121809349875 +HLA-A*24:02,YAVCDKCLKF,10,1.093333333,strong,novel,CONFIDENTIAL,1093.333333,7763.1,7692.7,12914.62,4306.466832601471,6667.05677309083,9985.12989112205 +HLA-A*24:02,DRAHYNIVTF,10,1.316666667,strong,novel,CONFIDENTIAL,1316.666667,11145.0,12097.2,6105.89,2428.8140888228404,4939.367664513643,7255.9444215451795 +HLA-A*24:02,LQTTIHEII,9,1.65,strong,novel,CONFIDENTIAL,1650.0,12345.4,11328.9,7819.96,5914.300147570152,7860.195300661325,2281.5229434808784 +HLA-A*24:02,EYRHYCYSLY,10,1.983333333,strong,novel,CONFIDENTIAL,1983.3333329999998,7319.8,7218.3,6231.43,703.2658386654582,1515.9408499157364,1477.5881767756796 +HLA-A*24:02,AHYNIVTF,8,2.2766666669999998,strong,novel,CONFIDENTIAL,2276.666667,7995.6,10388.4,12213.63,535.0480605196514,830.1737520796222,2491.9112158124303 +HLA-A*24:02,VYCKQQLL,8,2.4533333330000002,strong,novel,CONFIDENTIAL,2453.333333,2262.2,3318.8,1910.18,52.27313383518106,88.41831947379872,575.635438043838 +HLA-A*24:02,DFAFRDLCI,9,3.353333333,strong,novel,CONFIDENTIAL,3353.333333,6895.2,8358.8,5299.67,2321.9605565176307,4833.893616635816,2774.791392983021 +HLA-A*24:02,YSLYGTTL,8,3.356666667,strong,novel,CONFIDENTIAL,3356.666667,9147.3,10801.2,5320.23,7199.2723693321095,9213.709378071613,13122.858103833583 +HLA-A*24:02,FYSKISEY,8,3.36,strong,novel,CONFIDENTIAL,3360.0,12309.7,12705.1,17137.81,2205.404661591299,3581.325026470185,6557.405367260899 +HLA-A*24:02,VYDFAFRDLC,10,4.303333333,strong,novel,CONFIDENTIAL,4303.333333,6027.3,5872.8,7810.15,3261.5361858609203,4541.968966974872,5575.954542513338 +HLA-A*24:02,EVYDFAFRDL,10,4.7466666669999995,strong,novel,CONFIDENTIAL,4746.666667,7778.9,7300.7,10889.37,10584.928627802516,14998.341370715189,16265.726335821162 +HLA-A*24:02,FYSKISEYRH,10,4.76,strong,novel,CONFIDENTIAL,4760.0,17447.3,19539.6,4653.72,2557.610445090333,4367.497745288996,5044.566675718917 +HLA-A*24:02,HYNIVTFCC,9,6.06,intermediate,novel,CONFIDENTIAL,6060.0,5297.5,7451.3,3700.51,883.2590003262035,1556.9247929275973,1614.7965128506924 +HLA-A*24:02,CYSLYGTTLE,10,6.8666666670000005,intermediate,novel,CONFIDENTIAL,6866.666667,3660.3,5860.6,1124.93,1459.6902336809735,2496.7356419659945,3525.4328802793743 +HLA-A*24:02,LYGTTLEQQY,10,7.08,intermediate,novel,CONFIDENTIAL,7080.0,9536.2,11002.8,10662.6,1941.517006322411,3576.9833205995587,4657.422623464599 +HLA-A*24:02,KCLKFYSKI,9,7.503333333,intermediate,novel,CONFIDENTIAL,7503.333333,14133.4,17530.9,2341.86,699.1338794910405,1171.0981253622886,1770.7628128622314 +HLA-A*24:02,LECVYCKQQL,10,8.133333333,intermediate,novel,CONFIDENTIAL,8133.333333,38821.8,37065.8,37771.0,10864.99221187379,11788.509292507915,19923.786170055457 +HLA-A*24:02,EYRYYCYSV,9,8.64,intermediate,novel,CONFIDENTIAL,8640.0,972.8,1102.6,2521.31,443.0731091832768,775.765326629387,2495.118062975035 +HLA-A*24:02,FYSKISEYRHY,11,10.6,intermediate,novel,CONFIDENTIAL,10600.0,11705.4,8762.6,14075.75,2915.085842405545,5116.743170286183,10544.696205113243 +HLA-A*24:02,PYAVCDKCLK,10,10.92666667,intermediate,novel,CONFIDENTIAL,10926.66667,25168.5,27683.3,26543.21,6885.730236669599,9592.873322236668,13304.621298708753 +HLA-A*24:02,YDFAFRDLCI,10,11.01333333,intermediate,novel,CONFIDENTIAL,11013.33333,2877.7,4657.9,2956.78,12352.424311027677,16119.501861361616,17724.81775456142 +HLA-A*24:02,SEYRHYCYSL,10,11.97666667,intermediate,novel,CONFIDENTIAL,11976.66667,480.4,743.8,825.17,4777.401079101041,8473.810658312603,12884.606885147292 +HLA-A*24:02,HYNIVTFC,8,16.50666667,weak,novel,CONFIDENTIAL,16506.66667,22350.0,21160.9,23030.23,4943.438196616697,5891.456284818602,17692.391313008437 +HLA-A*24:02,VYCKQQLLRR,10,22.28,weak,novel,CONFIDENTIAL,22280.0,25203.4,28044.8,13917.2,3204.1311394463733,5560.819014680763,6042.764371359264 +HLA-A*24:02,REVYDFAF,8,23.27,weak,novel,CONFIDENTIAL,23270.0,18654.2,23029.5,23691.66,1850.0543105860065,2478.076299821525,6735.1965030939145 +HLA-A*24:02,KKQRFHNIR,9,28.63666667,weak,novel,CONFIDENTIAL,28636.66667,36419.0,38575.1,35997.06,18840.464726183844,21098.373761501232,19027.297846877213 +HLA-A*24:02,KFYSKISEYRH,11,31.99666667,weak,novel,CONFIDENTIAL,31996.66667,32363.3,34292.3,19160.27,8006.412012230704,11191.558204349676,13840.797318332548 +HLA-A*24:02,CYSVYGTTLE,10,32.71,weak,novel,CONFIDENTIAL,32710.0,4245.8,6458.2,1649.91,1569.781391307999,2487.4000289810565,4869.80660107878 +HLA-A*24:02,YCYSLYGTTLE,11,36.66333333,weak,novel,CONFIDENTIAL,36663.33333,7610.9,9765.9,2313.58,16139.756539090044,18650.695843017987,23113.19583519468 +HLA-A*24:02,YSVYGTTL,8,37.87,weak,novel,CONFIDENTIAL,37870.0,11241.5,11347.0,7091.69,8065.2962258007765,10251.465162052817,14753.287936076544 +HLA-A*24:02,VYCKQQLLR,9,46.39666667,weak,novel,CONFIDENTIAL,46396.66667,17707.0,20124.1,6744.89,1776.1100492444934,3229.353309718729,4718.3223038401975 +HLA-A*24:02,KKQRFHNI,8,46.83666667,weak,novel,CONFIDENTIAL,46836.66667,30641.7,29623.0,24111.62,3941.4027541538735,5280.337684102296,10622.243090510694 +HLA-A*24:02,DKKQRFHNI,8,55.94666667,weak,novel,CONFIDENTIAL,55946.66667000001,39079.2,38729.5,25336.02,8260.198769933226,10568.709366954625,11615.771585035689 +HLA-A*24:02,HLDKKQRFHNI,11,60.8,weak,novel,CONFIDENTIAL,60800.0,35515.4,30329.4,35114.98,10190.34608252548,12609.65475151052,22871.03164018196 +HLA-A*24:02,VQSTHVDI,8,84.61333333,weak,novel,CONFIDENTIAL,84613.33333,33737.3,33855.8,29711.28,7667.765794228896,8752.810114048165,21345.212270250264 +HLA-A*24:02,DLYCYEQF,8,29.23,weak,novel,CONFIDENTIAL,29230.0,23229.4,20680.1,24389.75,2811.256108620112,4375.938952621141,11821.029639805005 +HLA-B*07:02,LIRCINCQKPL,11,0.16,strong,novel,CONFIDENTIAL,160.0,3064.8,4560.3,10601.75,1945.3949554892865,1759.2480536978715,13235.818200827416 +HLA-B*07:02,RPRKLPQLC,9,0.29,strong,novel,CONFIDENTIAL,290.0,99.6,70.6,286.03,57.26882685127524,59.91249013361661,172.89450329842686 +HLA-B*07:02,RGRWTGRCM,9,0.33,strong,novel,CONFIDENTIAL,330.0,544.1,737.1,167.14,88.23814698866963,80.05266353876195,72.67379631603724 +HLA-B*07:02,RPRKLPQLCT,10,0.53,strong,novel,CONFIDENTIAL,530.0,496.2,414.4,170.01,62.07504609258122,67.46746511764775,178.43235602677032 +HLA-B*07:02,RPRKLPQLCTE,11,0.81,strong,novel,CONFIDENTIAL,810.0,5681.8,4260.3,3632.24,304.6591113264488,285.9482746084626,3531.0372933871067 +HLA-B*07:02,RTRRETQL,8,1.1,strong,novel,CONFIDENTIAL,1100.0,3895.8,2410.3,4306.76,302.2911569113051,202.7473844585019,718.8179070458214 +HLA-B*07:02,TPTLHEYM,8,1.35,strong,novel,CONFIDENTIAL,1350.0,6604.3,5514.7,6866.75,1465.150113174896,1121.1330423351164,2429.2378272886103 +HLA-B*07:02,TPTLHEYML,9,2.27,strong,novel,CONFIDENTIAL,2270.0,505.2,481.8,521.93,118.06538967914535,140.81757469280657,92.07467249450524 +HLA-B*07:02,RAHYNIVTF,9,2.33,strong,novel,CONFIDENTIAL,2330.0,1801.2,1073.9,2595.16,1032.0194526410553,1071.074685897953,861.016487718305 +HLA-B*07:02,DPQERPRKL,9,2.93,strong,novel,CONFIDENTIAL,2930.0,6430.7,8586.4,6673.02,4447.920925284252,5032.4869670550315,12010.097114484184 +HLA-B*07:02,SSRTRRETQL,10,4.06,strong,novel,CONFIDENTIAL,4060.0,2089.8,2816.0,2016.89,2538.6524520076005,2004.4016130475518,4567.458624166775 +HLA-B*07:02,CPEEKQRHL,9,4.23,strong,novel,CONFIDENTIAL,4230.0,893.3,1528.5,2463.79,1394.2744805759644,2149.807140578608,872.0581690760785 +HLA-B*07:02,IVYRDGNPYAV,11,12.94,intermediate,novel,CONFIDENTIAL,12940.0,26980.1,26763.8,29570.16,7479.563593333048,6102.175369168072,9605.759184515084 +HLA-B*07:02,LEQQYNKPL,9,15.1,weak,novel,CONFIDENTIAL,15100.0,13788.5,14910.4,16353.78,6259.887601536141,8331.416242786941,15960.857492638128 +HLA-B*07:02,EPDRAHYNIV,10,19.27,weak,novel,CONFIDENTIAL,19270.0,2351.6,2782.2,1084.14,6278.3163427984155,7045.2443973048275,3790.5555744968437 +HLA-B*07:02,KPLCDLLIRCI,11,21.1,weak,novel,CONFIDENTIAL,21100.0,6869.7,7330.3,12509.87,801.2379327776382,643.0833456130414,2284.5703449437165 +HLA-B*07:02,KPLCDLLI,8,21.62,weak,novel,CONFIDENTIAL,21620.0,6518.4,5417.9,8852.66,1815.3360300680606,1719.2729086743375,8584.752287226422 +HLA-B*07:02,NIRGRWTGRCM,11,49.58,weak,novel,CONFIDENTIAL,49580.0,12004.9,10710.7,12157.85,1904.0345404286825,2252.3556481610667,6420.5002847491005 +HLA-B*07:02,LLRREVYDFAF,11,53.51,weak,novel,CONFIDENTIAL,53510.0,22487.3,25001.3,26384.57,2863.3737518256316,2094.5426998534267,6319.718643066938 +HLA-B*15:01,CLKFYSKISEY,11,0.29,strong,?,CONFIDENTIAL,290.0,978.1,1148.9,3333.73,100.12875865670289,89.79060745300224,482.6428077286937 +HLA-B*15:01,LKFYSKISEY,10,2.44,strong,?,CONFIDENTIAL,2440.0,328.6,360.4,670.13,464.4010900707389,365.56287514368285,226.36814205834855 +HLA-B*15:01,SEYRHYCYSLY,11,2.5,strong,?,CONFIDENTIAL,2500.0,1944.7,2054.2,11010.92,1401.9870967130635,2102.273337412692,3603.7637607179827 +HLA-B*15:01,AVCDKCLKFY,10,2.96,strong,?,CONFIDENTIAL,2960.0,3065.1,2645.1,1317.37,178.86701409141514,170.1696154317968,235.54338201813513 +HLA-B*15:01,RHYCYSLY,8,3.96,strong,?,CONFIDENTIAL,3960.0,6469.3,4021.1,9120.32,6001.048237865377,6277.851617263311,8776.537436401066 +HLA-B*15:01,GQAEPDRAHY,10,3.97,strong,?,CONFIDENTIAL,3970.0,38.7,26.9,18.62,17.40913832461758,22.93177948959837,18.25441985354535 +HLA-B*15:01,KISEYRHYCY,10,4.18,strong,?,CONFIDENTIAL,4180.0,722.1,673.9,532.56,188.0057025142708,285.77394447106343,265.58478819185194 +HLA-B*15:01,LQPETTDLY,9,4.87,strong,?,CONFIDENTIAL,4870.0,233.2,307.5,114.64,86.10233924690445,138.71362381007455,93.16515819544595 +HLA-B*15:01,AFRDLCIVY,9,5.23,intermediate,?,CONFIDENTIAL,5230.0,1030.7,1057.2,460.29,424.3561939924511,612.2269976892022,976.4649149914122 +HLA-B*15:01,FAFRDLCIVY,10,5.27,intermediate,?,CONFIDENTIAL,5270.0,30.0,54.0,72.32,85.35493740907567,113.36915764673607,144.0842521338272 +HLA-B*15:01,YRHYCYSLY,9,5.62,intermediate,?,CONFIDENTIAL,5620.0,2226.8,2396.0,4253.87,2232.1043002386045,4070.7985953310827,4481.40899937409 +HLA-B*15:01,LQPETTDLYCY,11,6.08,intermediate,?,CONFIDENTIAL,6080.0,2534.8,2382.0,1904.75,106.96510326211235,116.31407824150664,57.36903618129154 +HLA-B*15:01,KQQLLRREVY,10,6.23,intermediate,?,CONFIDENTIAL,6230.0,178.4,74.7,76.01,30.491063196285573,44.73951549010499,68.18582442576489 +HLA-B*15:01,CIVYRDGNPY,10,6.58,intermediate,?,CONFIDENTIAL,6580.0,125.9,114.3,110.45,40.53014006414743,45.807707973742865,31.46490517047732 +HLA-B*15:01,IVYRDGNPY,9,6.63,intermediate,?,CONFIDENTIAL,6630.0,46.1,31.9,61.09,52.87880709132674,84.07449075465877,47.86039440508893 +HLA-B*15:01,LLMGTLGIV,9,7.1,intermediate,?,CONFIDENTIAL,7100.0,860.8,937.1,2322.78,534.5426071153162,849.7323988294139,462.22498009594113 +HLA-B*15:01,SLYGTTLEQQY,11,7.19,intermediate,?,CONFIDENTIAL,7190.0,338.0,230.4,1740.59,117.23636408487276,234.18830949346,105.37219050298744 +HLA-B*15:01,QQYNKPLCDL,10,8.52,intermediate,?,CONFIDENTIAL,8520.0,1829.3,1621.3,1345.65,600.4679447031629,899.1971301644063,850.2194364474872 +HLA-B*15:01,KLPQLCTEL,9,8.8,intermediate,?,CONFIDENTIAL,8800.0,3978.6,4085.5,5949.82,3835.943090749321,7120.605089018278,7847.671348501214 +HLA-B*15:01,QQLLRREVY,9,8.9,intermediate,?,CONFIDENTIAL,8900.0,300.0,207.4,193.81,230.91940954822832,219.41800195333204,282.60995304812405 +HLA-B*15:01,LCIVYRDGNPY,11,10.49,intermediate,?,CONFIDENTIAL,10490.0,494.5,301.2,982.82,339.8685867172298,227.20500067595367,682.6748668050218 +HLA-B*15:01,LLRREVYDFAF,11,11.34,intermediate,?,CONFIDENTIAL,11340.0,381.6,399.3,1704.66,67.71174660960358,212.11992230183037,839.4445432934434 +HLA-B*15:01,LLRREVYDF,9,13.73,intermediate,?,CONFIDENTIAL,13730.0,87.9,94.0,281.84,73.4518778217546,114.8259665577371,62.3035983246114 +HLA-B*15:01,VYRDGNPY,8,14.08,intermediate,?,CONFIDENTIAL,14080.0,3951.2,3244.9,2753.92,813.0948639229259,1064.1938077744298,1394.6899762223227 +HLA-B*15:01,RAHYNIVTF,9,15.85,weak,?,CONFIDENTIAL,15850.0,64.7,62.2,82.18,59.67455706810693,86.34963096148407,35.39766823681614 +HLA-B*15:01,GQAEPDRAH,9,17.31,weak,?,CONFIDENTIAL,17310.0,1672.1,886.6,1526.88,627.7935489433132,1156.7461202151535,940.5329764058071 +HLA-B*15:01,TLHEYMLDL,9,19.1,weak,?,CONFIDENTIAL,19100.0,3961.2,4781.2,5412.44,3188.32234786814,4370.989395819677,6157.718865619735 +HLA-B*15:01,YAVCDKCLKFY,11,19.77,weak,?,CONFIDENTIAL,19770.0,2994.2,3383.8,11119.27,1313.5652926667344,1123.1035569308099,2332.3519035580634 +HLA-B*15:01,LQTTIHDII,9,20.8,weak,?,CONFIDENTIAL,20800.0,3201.7,3183.3,6475.15,3508.220617041432,5252.916723398049,3558.7993737839442 +HLA-B*15:01,QQLLRREVYDF,11,20.84,weak,?,CONFIDENTIAL,20840.0,4777.8,3005.2,6524.1,1395.5709140240094,1647.8974388280567,3234.8884455717102 +HLA-B*15:01,KQRFHNIRGRW,11,21.33,weak,?,CONFIDENTIAL,21330.0,10844.6,6519.9,12284.4,3209.069828170334,5037.071796544306,7191.905607823522 +HLA-B*15:01,AGQAEPDRAHY,11,21.56,weak,?,CONFIDENTIAL,21560.0,1404.6,1362.3,1407.49,523.3780922619607,1174.1391466687742,2108.223246766194 +HLA-B*15:01,YSKISEYRHY,10,21.64,weak,?,CONFIDENTIAL,21640.0,174.5,235.9,48.14,49.734400543630066,38.94847000263059,41.31760975565961 +HLA-B*15:01,QLLRREVY,8,28.48,weak,?,CONFIDENTIAL,28480.0,7374.1,4959.3,4022.01,334.1041331076923,497.43111535595193,996.4526394200656 +HLA-B*15:01,KQRHLDKKQRF,11,29.77,weak,?,CONFIDENTIAL,29770.0,4349.9,1481.7,3954.91,264.1992655778023,799.4991513146069,3186.967792936229 +HLA-B*15:01,YAVCDKCLKF,10,29.92,weak,?,CONFIDENTIAL,29920.0,341.8,721.3,1324.03,589.5003656676157,322.8184699303833,170.59555698221587 +HLA-B*15:01,HDIILECVY,9,32.57,weak,?,CONFIDENTIAL,32570.0,2732.9,4656.1,1976.11,1364.6114315053885,1536.2820888670612,1348.9721708118166 +HLA-B*15:01,TIHDIILECVY,11,37.79,weak,?,CONFIDENTIAL,37790.0,1072.7,1127.3,2106.16,595.6118816499967,979.8290459326907,3282.111249651654 +HLA-B*15:01,IVYRDGNPYA,10,40.0,weak,?,CONFIDENTIAL,40000.0,871.8,544.8,935.11,5431.139564386863,5685.053856764514,5664.246317872208 +HLA-B*15:01,SEYRHYCY,8,41.84,weak,?,CONFIDENTIAL,41840.0,6850.1,7695.0,8495.33,1628.083811935315,1895.3144773195527,2815.4525280584785 +HLA-B*15:01,LLMGTLGI,8,43.75,weak,?,CONFIDENTIAL,43750.0,6292.9,6789.1,14125.18,465.4261794512378,605.1702826248901,1208.890677643299 +HLA-B*15:01,RGRWTGRCM,9,45.1,weak,?,CONFIDENTIAL,45100.0,4008.0,3340.2,2544.8,1820.363713752112,3486.2518669557435,4006.836697906264 +HLA-B*15:01,AVCDKCLKF,9,51.89,weak,?,CONFIDENTIAL,51890.0,1434.1,1425.9,2322.91,762.744945580612,819.5206751963057,640.1132456383094 +HLA-B*15:01,SKISEYRHY,9,56.55,weak,?,CONFIDENTIAL,56550.0,1435.6,1678.9,2651.99,3236.554371663517,4229.655776556141,2363.137677540985 +HLA-B*15:01,KISEYRHY,8,57.15,weak,?,CONFIDENTIAL,57150.0,4275.6,3402.6,3430.92,212.9623859156265,389.45988157147883,426.76252622744016 +HLA-B*15:01,CQKPLCPEE,9,67.81,weak,?,CONFIDENTIAL,67810.0,16285.1,13486.3,11536.18,7714.102386831012,11886.001598087749,7346.684977628699 +HLA-B*15:01,LRREVYDFAF,10,69.3,weak,?,CONFIDENTIAL,69300.0,5789.7,4932.3,6139.74,1691.4770197820444,3493.9972978175706,3106.905203122733 +HLA-B*15:01,QLLRREVYDF,10,77.7,weak,?,CONFIDENTIAL,77700.0,1215.3,1582.7,2564.26,330.5604649673025,416.60424757969736,437.37861422193896 +HLA-B*15:01,FYSKISEY,8,94.5,weak,?,CONFIDENTIAL,94500.0,2369.7,2379.5,7637.92,2414.7564272356617,3321.432577617953,4414.84818994649 +HLA-A*02:01,LLMGTLGI,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,184.0,328.6,212.27,40.10507816195131,36.68413487712265,150.4233501819733 +HLA-A*02:01,LMGTLGIV,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,1875.4,3868.3,1105.59,1731.2786926325007,1034.1209486251953,3385.6201356725123 +HLA-A*02:01,EYMLDLQPETT,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,6152.0,5367.0,1548.09,19607.41628195521,22932.299772195034,21660.167247021807 +HLA-A*02:01,LRLCVQSTHV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1971.4,2131.1,1815.24,6258.1693122330225,8850.5216424582,11139.886334756673 +HLA-A*02:01,KISEYRYYC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,675.0,1585.7,2349.63,1616.7235765366324,1361.5868928858724,1663.4471790977288 +HLA-A*02:01,YSLYGTTLEQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4849.4,6125.2,2507.49,4946.262186569977,7276.920108129971,5348.447744367745 +HLA-A*02:01,DLLMGTLGI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,1327.9,1727.9,2529.15,1247.362388651159,736.5847222237112,721.9583442636213 +HLA-A*02:01,PLCDLLIRCI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4404.1,6552.8,2553.9,6227.56022017545,5538.638762408619,9368.909416015516 +HLA-A*02:01,FAFRDLCIVY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,6485.2,8256.3,3191.53,6896.565730348924,8109.559671334478,7189.8532424441355 +HLA-A*02:01,IVYRDGNPYAV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,2531.3,518.2,3287.59,291.0171642495432,384.71909049438193,563.1260951324526 +HLA-A*02:01,YCYSVYGTTL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,9502.8,8457.4,3314.52,4414.623268810618,4277.971516972154,4779.208919603183 +HLA-A*02:01,QLLRREVYDFA,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,5854.7,2327.3,3518.78,799.2711256419948,503.36698776390966,765.5631997379436 +HLA-A*02:01,MLDLQPETTDL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,4519.0,2556.8,3950.38,2691.260928057141,2899.896483807252,3845.047174100261 +HLA-A*02:01,IILECVYCK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,17699.0,14731.4,4245.82,3546.5930165011573,4096.682345418097,5340.488501547996 +HLA-A*02:01,YRDGNPYAV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7286.9,4990.8,4312.26,697.3534782821471,793.9928564089412,702.6178592295229 +HLA-A*02:01,IILECVYC,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,13575.9,16281.2,5793.17,2605.483298879635,3189.755504599269,4549.1810265154745 +HLA-A*02:01,TLRLCVQSTHV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,9657.4,5423.7,6275.13,4642.816820403671,6367.344637406844,10467.335317603565 +HLA-A*02:01,YDFAFRDLCIV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,9827.2,5663.8,6605.64,8537.612365776004,9076.15995019165,8472.794847172467 +HLA-A*02:01,YDFAFRDLCI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,9356.6,8596.9,7051.13,5783.470457750719,8886.639869166393,6900.1844605167835 +HLA-A*02:01,LLIRCINCQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,17771.5,18562.4,7167.67,6194.734449463747,6730.359385664998,9156.309395339307 +HLA-A*02:01,TLEQQYNKPL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8846.4,9944.9,7526.68,8247.187903778167,7724.006369247068,7934.689593833418 +HLA-A*02:01,LMGTLGIVC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,6752.4,7936.9,7548.2,5956.836085965389,7680.189836417857,6188.5104047798995 +HLA-A*02:01,SEYRHYCYSV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,7213.2,7818.5,7961.17,2208.7935464187963,2195.755402862796,3869.8187165363624 +HLA-A*02:01,SLYGTTLEQQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13853.8,14694.2,8398.45,4484.348332784442,5169.1361410017635,6238.559002635688 +HLA-A*02:01,TIHDIILECVY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16111.2,13565.7,8436.97,18480.247525559542,17254.18407367307,16052.805885011456 +HLA-A*02:01,DLCTELQTTI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13562.4,11451.5,8439.62,10315.064570869743,7829.124137416472,8372.603499441011 +HLA-A*02:01,LLIRCINC,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,14592.1,18081.7,9263.13,5840.7933342989,7219.689803403051,8153.439741505592 +HLA-A*02:01,KPLCDLLIRCI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,21675.5,24361.3,9568.74,11669.912353975344,12963.024986499122,6933.274830652026 +HLA-A*02:01,KQQLLRREV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,12405.4,12030.3,10473.71,11151.684959687818,13378.011377737554,9381.644580361364 +HLA-A*02:01,QLLRREVYDF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13898.1,12025.3,11086.96,11557.492136930747,8072.482127910267,9421.217765296751 +HLA-A*02:01,RLECVYCKQQL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7444.6,6179.7,11254.96,6057.102203953418,7857.069310594371,6712.316098963371 +HLA-A*02:01,LLIRCINCQK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,16704.8,17019.5,11948.67,8211.356112912066,8409.215012137936,7444.559187973554 +HLA-A*02:01,KCLKFYSKI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,17601.4,16904.7,12145.36,5452.758713298393,5650.7759692530835,5573.756294555697 +HLA-A*02:01,ILECVYCK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,28087.3,23841.6,13210.86,12045.85456890354,13370.493728100842,21677.317790126628 +HLA-A*02:01,LLRREVYDFAF,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,15235.6,13611.5,13943.72,10421.877091861914,9958.824701602422,8713.581563985184 +HLA-A*02:01,HLDKKQRFHNI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,17238.0,13408.9,13960.33,2299.22418049324,1599.8286874944306,3929.7162390308467 +HLA-A*02:01,ELQTTIHEIIL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,17333.4,13077.5,14052.78,10684.042104244922,9762.87125737261,12016.088103237638 +HLA-A*02:01,YNKPLCDLLI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,22341.3,20470.9,14169.12,10628.921221182429,11308.44710150331,6290.237739071789 +HLA-A*02:01,SEYRHYCYSL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13026.1,15061.2,14259.85,5811.169006151247,5824.826979669005,10007.41998819825 +HLA-A*02:01,SLYGTTLEQQY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,18915.2,13566.9,14538.09,9040.57917762621,9154.051955183671,7841.014786675651 +HLA-A*02:01,QQYNKPLCDLL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,13660.3,7395.5,14733.66,7881.58844606867,10235.307999333174,9186.411917724126 +HLA-A*02:01,YAVCDKCLKF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,18867.1,18812.7,15271.88,14274.15507299491,16838.86644164798,14951.32987603311 +HLA-A*02:01,VYRDGNPYAV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,18526.3,19492.7,15454.89,4585.286102298362,7438.690507727205,5895.185063371625 +HLA-A*02:01,RTLEDLLM,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,19711.8,18336.2,15875.55,2484.2089733460502,2163.61486135186,6388.379531010197 +HLA-A*02:01,ISEYRHYCYSV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,22763.2,17417.3,16198.28,2894.512011167368,2426.831196366345,5418.379048304882 +HLA-A*02:01,CMSCCRSSRT,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,12198.2,13951.6,16991.94,10535.60112853321,10118.68679835581,14725.56271574406 +HLA-A*02:01,DLYCYEQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,17409.5,16955.4,17632.1,8137.1463906061745,7442.693714332056,18847.28762692309 +HLA-A*02:01,TTLEQQYNKPL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16075.4,9390.2,17677.19,10436.028647722613,7351.251124982511,9772.915561571059 +HLA-A*02:01,YSLYGTTL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20908.9,19223.6,17993.27,2281.09855045255,1766.0101648825876,6784.524748974714 +HLA-A*02:01,LECVYCKQQLL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,18246.4,11673.4,19398.9,15988.749501063316,17994.289200286003,22286.800243045924 +HLA-A*02:01,FQDPQERPRKL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,23015.3,17750.8,20790.04,6434.987943781,7658.949352552701,7701.4660952873155 +HLA-A*02:01,DLLIRCINCQK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,33080.9,32321.3,20836.43,15381.046882179076,16312.850147876072,12752.31784017157 +HLA-A*02:01,YCYSVYGT,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,30982.1,30513.7,20902.36,6802.646468665559,5963.458511143889,11849.150764435824 +HLA-A*02:01,HVDIRTLEDLL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,26313.3,20053.4,21135.7,11756.82545898115,9757.506531027086,8429.851731645947 +HLA-A*02:01,QQLLRREVYDF,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,30678.9,27432.3,22055.0,19048.964668808807,18004.958876280023,20164.68452413133 +HLA-A*02:01,QYNKPLCDLLI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,35465.9,31893.7,23709.1,12473.319358348526,16566.3994972223,15278.271757940349 +HLA-A*02:01,GIVCPICSQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,24846.0,29028.1,24415.38,16340.00360103559,17338.576062648906,18546.03609115097 +HLA-A*02:01,YSKISEYRHYC,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,19293.2,16011.7,24619.36,20768.38521022667,21379.50661678288,19188.252615464804 +HLA-A*02:01,LQPETTDLY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,24655.3,24832.0,25371.14,15306.476435863176,19334.568885193483,15652.590707128582 +HLA-A*02:01,KISEYRHYCYS,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,22367.7,20249.9,25555.72,9021.712561571116,10503.08016267608,14106.538410439864 +HLA-A*02:01,QLNDSSEEE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,27846.4,29819.8,28772.62,14869.244790561152,16809.168241559193,12204.426798386134 +HLA-A*02:01,CVYCKQQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,22673.2,21594.1,28998.27,13189.078881145795,14659.685439640254,21627.67462792852 +HLA-A*02:01,QQLLRREVYD,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,38188.5,37815.6,30968.04,22971.137238845695,25162.71603898916,20481.405031208604 +HLA-A*02:01,VQSTHVDI,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,34280.8,31479.2,31123.22,14870.238291291284,14288.133752706222,23077.704869215453 +HLA-A*02:01,LCVQSTHVDIR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,37863.9,36133.6,34584.06,21318.04847828535,23000.069879246737,25881.846850535672 +HLA-A*02:01,PQLCTELQTTI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,14066.9,13293.0,8717.3,13500.485965757342,15988.82079411965,13075.008237186474 +HLA-A*02:01,IILECVYCKQQ,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,33495.1,30770.0,18479.01,12839.402238388291,16496.963366211512,13032.423575407904 +HLA-A*02:01,STHVDIRTL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,21370.0,21277.7,13064.73,13081.25664250346,11367.70054316108,14121.00018631782 +HLA-A*02:01,GIVCPICS,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,34852.3,34494.7,31844.36,16979.390982186476,17001.090435871018,22019.158545689672 +HLA-A*03:01,RCMSCCRSSR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,338.5,229.2,274.07,2146.151895876547,2678.6392705485628,1852.490604772033 +HLA-A*03:01,KISEYRHYCY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,421.4,625.5,572.58,508.5271761850045,198.21151382809373,295.13399784149385 +HLA-A*03:01,CMSCCRSSR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,890.9,665.7,711.79,698.3657242942412,2116.4394014354266,1511.9583619970472 +HLA-A*03:01,CLKFYSKISEY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,894.8,1363.0,1540.97,2095.081375326685,5205.889344177251,5802.133969881049 +HLA-A*03:01,DIILECVYCK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1882.1,2341.3,1829.27,6024.303744160254,4179.40804463089,5637.158934176868 +HLA-A*03:01,DLLIRCINCQK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,1145.9,2405.2,2443.06,1671.6915196553628,1513.4730710112726,1936.349688276893 +HLA-A*03:01,CVYCKQQLLRR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,2237.6,2458.8,2848.84,95.13939639605283,126.24882041983204,176.5199522745506 +HLA-A*03:01,AHYNIVTFCCK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,10306.1,7881.6,2918.19,942.6111512922834,2353.3178810853587,2133.4108950052528 +HLA-A*03:01,CIVYRDGNPY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1467.2,2175.4,3007.11,4834.8995768888535,4183.345336629446,3218.6861814278805 +HLA-A*03:01,NIRGRWTGR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8301.7,8766.1,3240.31,2543.19939076268,4158.268367969763,2273.462019112702 +HLA-A*03:01,HYNIVTFCCK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4049.9,4137.7,3307.86,2198.6174472625776,584.9455802587668,1084.223382567712 +HLA-A*03:01,LKFYSKISEY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,3145.9,4157.9,3753.5,9631.77876679148,6822.620760297989,6779.638719408612 +HLA-A*03:01,LGIVCPICSQK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,1894.1,3028.7,4665.87,4029.238428165269,8264.699832136585,7763.458517971719 +HLA-A*03:01,MSCCRSSRTR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4520.9,5366.9,4817.98,1521.4009021341074,947.6102090610506,861.4797598619441 +HLA-A*03:01,AFRDLCIVYR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4587.1,3393.3,5085.86,4400.140655805826,6190.8345548087855,5804.855243630565 +HLA-A*03:01,SLYGTTLEQQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1800.8,2198.7,5755.56,2883.4793280106846,1957.5732183517416,3642.2699172915004 +HLA-A*03:01,FAFRDLCIVY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,6733.5,7682.8,6638.96,5603.9553562641795,4502.49950017559,4077.4811835858773 +HLA-A*03:01,ILECVYCK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,3159.6,4307.9,6671.15,890.273813982895,2692.586448413381,2374.3744309074427 +HLA-A*03:01,IVYRDGNPYA,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,7084.6,8807.6,7479.27,5575.002201934725,7304.863413406947,7168.783410726695 +HLA-A*03:01,YNIVTFCCK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7521.7,6165.1,7847.85,3252.6544931259614,1437.3016960840844,2674.2028326013715 +HLA-A*03:01,AFRDLCIVY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8917.6,9238.2,7946.88,9427.562999067719,10594.479488804085,10957.51729834966 +HLA-A*03:01,TIHDIILECVY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7794.2,7411.9,8104.13,10238.983678331142,10535.356809094204,6687.412723396845 +HLA-A*03:01,YAVCDKCLK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7155.4,6883.9,8224.8,3821.649764439815,2424.348143472158,4209.584907778554 +HLA-A*03:01,KFYSKISEYRH,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,12156.0,13864.3,8573.91,8079.243506444573,13968.451334406172,17485.818462512172 +HLA-A*03:01,SEYRHYCYSLY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16141.2,13640.5,8860.23,3824.429784223868,5840.156611897132,8804.176450141538 +HLA-A*03:01,CQKPLCPEEK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,6276.4,6630.4,9041.61,7555.636156280687,9600.987179295393,11138.161583549549 +HLA-A*03:01,RLCVQSTHV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,10478.1,15291.1,9250.01,9181.889033252728,12869.854545414255,13561.35189596395 +HLA-A*03:01,CMSCCRSSRTR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,4846.3,5407.0,10382.31,1255.8368120386338,5820.3946396026795,10020.255721723788 +HLA-A*03:01,FAFRDLCIVYR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,5944.0,6144.5,10464.76,2491.416241486951,3000.0494697373656,4183.038873089809 +HLA-A*03:01,CDKCLKFYSK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,15320.0,14495.2,10654.87,4404.859869695959,2186.190658739226,2983.1005232107013 +HLA-A*03:01,TLEQQYNK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,8603.6,10288.9,10744.48,2689.6793224747407,5570.180711962954,10546.89805472796 +HLA-A*03:01,VYCKQQLLR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,16174.8,15505.3,11111.21,5567.253279410506,6462.855881066801,12767.768012515184 +HLA-A*03:01,YGTTLEQQYNK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,8477.2,6768.1,11681.38,9249.895196629821,13146.110479915269,14859.272306690418 +HLA-A*03:01,WTGRCMSCCR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8888.0,10630.0,12285.99,8769.71255533588,8526.06828795749,9365.77933071704 +HLA-A*03:01,LLMGTLGIVC,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,25372.2,25636.3,12569.3,6640.963839857213,5425.959510050151,6041.896311538562 +HLA-A*03:01,KISEYRHY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,12211.8,13743.6,12912.53,1745.7820230340333,5329.022384307455,5567.132124374539 +HLA-A*03:01,NIVTFCCK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,10964.7,13002.8,12935.6,1844.1544916120545,3736.831761832908,4925.956839391305 +HLA-A*03:01,KQRHLDKK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,14324.0,13835.5,12994.1,978.3974358896014,1889.583078871707,4983.341587821577 +HLA-A*03:01,RAHYNIVTF,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,11466.9,12923.0,13236.75,9593.774954796472,8075.12897822427,12654.867729913249 +HLA-A*03:01,AVCDKCLKF,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,18440.7,16946.0,13831.93,7889.603419329891,8646.709244506084,10614.6251828039 +HLA-A*03:01,ISEYRHYCY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15430.7,14319.7,14211.49,12713.65719886557,8762.981746819096,8380.195323653576 +HLA-A*03:01,KQRFHNIR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,14637.8,13352.3,14664.95,7402.795328586102,17833.537842691203,16238.782362526514 +HLA-A*03:01,MSCCRSSRTRR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,11276.2,11875.2,15034.96,2449.284978813199,6777.043043756836,5270.466920037933 +HLA-A*03:01,TLHEYMLDL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,19457.6,18168.3,15136.0,13478.837615421822,15576.67774404172,16919.82201004596 +HLA-A*03:01,RLCVQSTH,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,9516.8,10452.0,15734.3,5585.55143358981,11921.371380186743,15486.510604749796 +HLA-A*03:01,KQRFHNIRGRW,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16747.9,20875.5,15845.69,17769.847494111054,19599.174139326293,20086.92059187255 +HLA-A*03:01,GTLGIVCPI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,16237.1,14216.1,16709.72,12524.864051355848,12949.151893041524,13325.577079707613 +HLA-A*03:01,QLLRREVYDF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,19300.3,20194.8,17676.8,14022.340680721682,20082.35074421348,18551.78613098005 +HLA-A*03:01,LLIRCINCQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8157.2,11563.9,18800.89,12143.728454198936,9472.68106483512,9922.57257387812 +HLA-A*03:01,DLLMGTLGIV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,23381.5,25829.0,19532.01,19685.621315083717,16714.310190655182,13696.421961249798 +HLA-A*03:01,EVYDFAFR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,13702.2,15071.1,19611.21,1767.8732388699136,3858.152467319781,7339.085909331587 +HLA-A*03:01,MSCCRSSR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,13412.8,17131.7,19626.06,4265.170604589931,9705.2678010256,11207.538346703797 +HLA-A*03:01,LRLCVQSTHV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,21693.8,25703.0,19670.29,23725.232869921416,21818.993890530248,22001.21513133623 +HLA-A*03:01,STLRLCVQSTH,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,18133.0,16029.2,20787.57,6090.8665088837915,7790.524470676007,10694.070090191282 +HLA-A*03:01,QLLRREVY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20930.4,23909.5,21021.66,7983.111817600068,14737.649498897768,17877.926347847344 +HLA-A*03:01,LLRREVYDF,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,21305.1,22277.1,24721.05,15832.304015760437,19283.206536874794,20248.882622842077 +HLA-A*03:01,KCLKFYSKI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,26463.2,30831.3,28007.8,21373.22114892818,26154.45167537219,26504.28315878981 +HLA-A*03:01,MSCCRSSRT,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,24516.5,27338.6,28748.97,15119.46430226626,19740.653965912104,24027.66602289625 +HLA-A*03:01,PLCPEEKQR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,36295.1,36868.6,34912.68,15986.350453537061,23361.048188657267,25231.38625942724 +HLA-A*11:01,AGQAEPDRA,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,41723.4,40700.5,32897.81,19487.655921806832,30992.293143074872,28645.275312916296 +HLA-A*11:01,CDKCLKFYSK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8273.7,6893.5,5287.81,1057.9586125305268,1930.9392149616751,1160.6200182226905 +HLA-A*11:01,CIVYRDGNPY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1549.9,1954.0,4175.53,1201.5119232425986,1523.6402337495904,1299.5845012037664 +HLA-A*11:01,CLKFYSKISEY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7376.9,8920.5,19570.09,7637.329624943686,8607.709095106029,8762.37463560671 +HLA-A*11:01,CMSCCRSSR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,1592.3,1773.2,1842.96,488.0842002240792,1874.2298925866912,1782.2213109483835 +HLA-A*11:01,CMSCCRSSRTR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,8619.7,9396.2,12933.23,2050.42703281226,5002.305870894132,4060.2372663091705 +HLA-A*11:01,CQKPLCPEEK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,5449.0,4837.6,4576.07,3343.3340164938622,4865.293587730572,2478.4329499518435 +HLA-A*11:01,CTELQTTIHDI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,35925.5,35188.4,35050.81,22798.707627700576,28660.626685495805,29746.469768459243 +HLA-A*11:01,CVQSTHVDIR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,2449.3,2115.8,3271.2,1291.8619090634695,4487.297919064697,3476.411583807726 +HLA-A*11:01,CVYCKQQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,31728.1,31864.3,39604.52,14035.357103872793,20154.58255974632,21930.36670288617 +HLA-A*11:01,CVYCKQQLLRR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,2403.7,2456.7,4831.97,93.83898846301727,390.7621648395705,423.73524575262087 +HLA-A*11:01,DEIDGPAG,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,48003.1,47382.8,46217.22,27792.657178297242,38917.54642211169,38973.699846921714 +HLA-A*11:01,DGNPYAVCDKC,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,40538.8,40097.4,36277.0,22644.889294346005,32958.07360819781,31155.150716482636 +HLA-A*11:01,DIILECVYCKQ,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,17383.4,25455.0,12219.31,15002.464793098225,21154.070358240133,25959.531548526524 +HLA-A*11:01,DKCLKFYSK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,25328.9,27730.4,18143.61,5625.1027409749695,7487.455608354694,5159.269579738569 +HLA-A*11:01,ETTDLYCY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,28056.6,27712.1,27009.93,3114.3400173612004,8754.660161221043,11449.502370931597 +HLA-A*11:01,ETTDLYCYE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,16807.5,16298.1,23906.67,7638.863420046611,9078.933396460823,8752.514875295234 +HLA-A*11:01,EVYDFAFRD,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,33871.9,29166.3,22421.45,10000.986830999123,14992.82471561801,10471.836474467988 +HLA-A*11:01,FAFRDLCIVY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4890.6,5787.0,6695.51,2111.8075182587977,3764.62808001404,3468.643622885065 +HLA-A*11:01,FYSKISEYR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7460.3,7323.0,11508.38,7598.6440074526,9063.00748065181,7878.682800473727 +HLA-A*11:01,GIVCPICS,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,36529.9,36951.7,37710.98,12178.449899354055,22401.8645937304,21862.68336374641 +HLA-A*11:01,GIVCPICSQKP,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,5977.6,9779.0,7427.01,19797.42036602359,18897.169929317624,20931.652420488208 +HLA-A*11:01,GNPYAVCDK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5427.2,9063.5,12577.73,3810.7391846558003,6521.732590493438,5437.6556973628 +HLA-A*11:01,GTLGIVCPI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5656.2,4368.8,11138.54,6941.08461334701,9651.926068364071,7345.191953283194 +HLA-A*11:01,GTTLEQQY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,28459.9,28050.6,29129.4,4644.142127747263,11274.911093989678,12875.288108669034 +HLA-A*11:01,GTTLEQQYNKP,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,6917.7,9681.4,4733.19,14846.621207594035,14920.752522801706,15942.816579493032 +HLA-A*11:01,HYNIVTFCCK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1212.9,1213.5,1042.44,986.2134889530138,1106.5693237358985,862.0328849786329 +HLA-A*11:01,IILECVYCKQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1574.5,3232.2,2186.62,3679.051824763417,5954.129636216291,4311.148633844881 +HLA-A*11:01,IRCINCQK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,16016.2,21088.2,18778.93,8480.580280892878,17388.291093062242,15253.674597972657 +HLA-A*11:01,IVCPICSQKP,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,2826.4,4960.7,2205.49,16508.530727223904,16974.72338982387,15775.722075404898 +HLA-A*11:01,KCLKFYSK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,15541.6,15933.7,6483.71,1688.5798741481885,5655.4332857194995,7313.001651474084 +HLA-A*11:01,KFYSKISEY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,4277.8,4132.4,4210.14,4972.939038785257,9118.133117261548,8700.969290004108 +HLA-A*11:01,KFYSKISEYR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1605.3,1633.4,2366.54,1137.0639999806385,2272.9980293324465,1729.8826861340624 +HLA-A*11:01,KFYSKISEYRH,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,18415.7,19655.2,25751.96,14699.295372019302,23992.417951230054,25590.848944466867 +HLA-A*11:01,KISEYRHY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,17931.7,19198.5,15027.49,1522.6065110482944,4477.380176476408,5070.170946378111 +HLA-A*11:01,KISEYRHYC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,20196.7,19172.7,11647.81,10281.016527436794,4944.240035832017,5751.106983853338 +HLA-A*11:01,KISEYRHYCYS,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,13337.5,14596.4,11597.26,4377.158306251542,7540.125987623304,7993.637624355907 +HLA-A*11:01,KLPQLCTE,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,38181.5,38757.1,41573.79,16633.422440105976,27104.274879078985,29385.089805161864 +HLA-A*11:01,KPLCDLLIR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15434.3,15102.8,16968.61,8793.072708583251,11116.526219165933,11621.30038642246 +HLA-A*11:01,KQRFHNIR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,21443.4,19892.5,25255.0,5787.74716083292,13307.040556423251,13540.427098056638 +HLA-A*11:01,KQRFHNIRGR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4249.5,4445.0,12018.69,5409.382204732741,9711.896646958934,9812.403449787995 +HLA-A*11:01,KQRHLDKK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,23657.8,18900.6,11497.93,2586.227786574936,6783.142480139129,7998.383868129876 +HLA-A*11:01,LKFYSKISEYR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,11847.9,12677.9,15475.8,13037.329081950098,15505.198031189448,15286.376816878057 +HLA-A*11:01,MFQDPQERPRK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,10202.0,9296.4,11308.67,1280.2721339000564,1711.5512873649725,919.0610016561909 +HLA-A*11:01,MSCCRSSR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,8484.7,11909.6,13500.58,745.2206048255368,5216.293578749275,6881.621862690828 +HLA-A*11:01,MSCCRSSRT,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,22981.7,27596.0,23953.79,11060.567746376115,14862.260431497814,13589.971511163352 +HLA-A*11:01,MSCCRSSRTR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1533.6,2308.9,1643.51,903.9767868061217,2074.1432121998073,1958.2968832103518 +HLA-A*11:01,NIRGRWTGR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,14493.5,17810.6,20180.34,5890.516113854318,10879.94574628364,12143.640015284895 +HLA-A*11:01,PAGQAEPDRA,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,46355.4,44968.7,41496.95,23063.434845277046,34165.494001505336,30850.645412976253 +HLA-A*11:01,PLCPEEKQR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,36829.9,37176.6,32709.34,16598.379289006047,25603.592946354336,24689.211771860093 +HLA-A*11:01,QTTIHDIILE,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,15820.5,17922.7,25662.12,5541.484079375929,11350.789872319578,9146.047895482036 +HLA-A*11:01,RDGNPYAVCDK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,23425.8,22986.2,21483.84,2351.0427263159063,5694.4144232026865,5896.370227517439 +HLA-A*11:01,REVYDFAFR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,12364.8,10984.1,13509.78,2239.19763824527,5266.938322697817,4025.0188421705866 +HLA-A*11:01,RHYCYSLY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20679.4,18175.4,26264.11,11030.244842726494,20766.472612386984,22126.468640123534 +HLA-A*11:01,RLCVQSTHVD,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,36665.7,38873.9,31502.68,16439.925064143878,20797.42164828521,18900.914768442428 +HLA-A*11:01,RTLEDLLM,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,25073.4,25150.0,28533.91,8568.430817036431,17210.176195650718,16426.73627097718 +HLA-A*11:01,RTLEDLLMGT,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,10614.7,11547.7,17957.28,5427.7381364339035,11073.460570718235,8382.788506029578 +HLA-A*11:01,SCCRSSRTR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,18883.7,24145.6,26662.08,15485.848069987858,21890.10996332307,20287.36552220845 +HLA-A*11:01,SEYRHYCYS,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,23398.2,20096.9,25882.7,7242.909501939216,11946.170085596685,7814.238764311442 +HLA-A*11:01,SEYRHYCYSLY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,17141.7,11630.6,20957.16,4964.468160017936,10681.487881770356,11395.416258121184 +HLA-A*11:01,SKISEYRHYCY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7955.9,12019.7,3460.45,8211.261537746985,13027.182753105479,13348.301499116104 +HLA-A*11:01,SLYGTTLEQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,1994.1,2518.8,5669.4,909.8688747359337,2583.0824601605514,1509.6991300998684 +HLA-A*11:01,SSEEEDEIDG,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,46388.6,45398.5,42990.49,21625.90201824093,30902.77595538252,30192.822903541386 +HLA-A*11:01,STHVDIRTLE,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8180.6,10690.3,17396.74,2351.1514694241355,3626.466390078379,3108.056300285067 +HLA-A*11:01,STLRLCVQS,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7311.6,8398.6,11216.42,2592.2153659165165,4993.4326595202865,3624.604111059481 +HLA-A*11:01,STLRLCVQSTH,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,11210.0,8508.4,21889.29,3677.2775077249353,6870.0783172152405,6505.549577252196 +HLA-A*11:01,TFCCKCDSTLR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,22933.5,20909.8,22830.75,2175.4325392765772,7119.048522834347,6740.3866863709045 +HLA-A*11:01,TGRCMSCCR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,11664.8,14196.3,18365.21,7303.337786462746,12676.74558320295,12030.401042609656 +HLA-A*11:01,TIHDIILEC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,27744.8,24875.3,17265.29,14935.346863415803,15595.43261271422,13548.678252515494 +HLA-A*11:01,TIHDIILECVY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,3895.1,2672.8,4811.78,2174.707726321328,6132.897803971964,4242.112406686189 +HLA-A*11:01,TTDLYCYEQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,10077.9,11981.9,10163.91,2173.431967459284,5313.533654592557,3318.6427623216523 +HLA-A*11:01,TTDLYCYEQLN,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,35658.6,32336.7,29490.29,10811.590918534217,14704.748465398878,12049.104505257204 +HLA-A*11:01,TTIHDIILE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5708.2,6682.6,9740.68,2152.1711328398355,3144.269092022183,2404.548142607724 +HLA-A*11:01,TTIHDIILEC,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,20096.2,21278.2,15893.42,13869.607493932192,15474.210571434014,13922.373319334065 +HLA-A*11:01,TTLEQQYNKP,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1705.9,1893.4,709.82,14394.018049627624,10986.393844503771,8565.266976037352 +HLA-A*11:01,TTLEQQYNKPL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16816.0,14604.8,7924.39,16751.873641029164,19942.592102160306,15317.980158638191 +HLA-A*11:01,VTFCCKCDS,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15433.2,18465.4,20534.74,6336.414626546366,11300.937689146247,10910.325644877645 +HLA-A*11:01,VYCKQQLLR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8470.8,9908.1,6611.43,4227.101931069413,8653.539142274069,6781.498224130493 +HLA-A*11:01,YSKISEYR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,10650.0,13959.6,19078.77,5073.774072307504,9928.3530788146,7545.033627566686 +HLA-A*11:01,YSKISEYRH,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,23416.7,21120.8,19254.0,13898.256380507719,20758.7157315749,17581.880315582115 +HLA-A*11:01,YSLYGTTLEQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4900.2,5991.6,16898.07,5990.40340289689,8845.80405880307,7233.2704224236295 +HLA-A*24:02,RWTGRCMSCC,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,12646.1,17842.8,9956.13,2327.51469183589,4316.3125469468705,4864.483113368513 +HLA-A*24:02,IVYRDGNPYA,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,30398.7,29113.0,27617.81,14403.729281193133,19063.353259695068,18682.20111462103 +HLA-A*24:02,LLMGTLGIVC,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,41830.1,38467.6,31101.01,8535.885812364837,10566.25636941926,17589.22672256815 +HLA-A*24:02,CDSTLRLCV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,37420.4,34181.2,35314.62,17019.067445824192,19265.427300303934,21144.969105576147 +HLA-A*24:02,RWTGRCMSC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8183.3,11769.2,4275.6,1252.129180436395,3292.725140390301,2210.2280345417207 +HLA-A*24:02,KKQRFHNIRG,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,40321.0,40204.7,39485.14,18274.05257410025,19301.011905667063,23056.192391966866 +HLA-A*24:02,DFAFRDLCIV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,19689.7,20285.9,20730.97,7285.596677999693,11784.91100066803,11840.785810576412 +HLA-A*24:02,YCYSLYGTTL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,268.9,342.4,134.87,4045.001672952072,6291.939345660424,4901.339636410948 +HLA-A*24:02,CYEQLNDSSE,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,33221.5,33039.4,27771.52,10510.647969789583,12029.17312200454,19754.559503290977 +HLA-A*24:02,EYMLDLQPE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,24906.0,25762.3,13459.45,2627.735370486799,4674.805189252864,4188.678260213211 +HLA-A*24:02,LYCYEQLNDS,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,33078.8,30784.3,26307.61,7872.069624051399,9035.551260635362,21149.095121956765 +HLA-A*24:02,EYMLDLQPET,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,27655.5,25809.7,21242.99,4744.62409060371,7767.151151194414,9194.004919948033 +HLA-A*24:02,HYCYSLYGTT,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13921.3,13727.3,9117.55,4160.420166078235,7680.8767122373865,6305.814446087444 +HLA-A*24:02,CYEQLNDSS,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,31067.7,31256.9,25011.36,7807.102866221178,8956.773474358984,12966.768480464609 +HLA-A*24:02,QQYNKPLCDL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8431.5,11155.1,14362.04,14481.133400705226,18341.356262682217,22837.715700467557 +HLA-A*24:02,NPYAVCDKCL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,10467.5,15642.6,18381.11,19232.4395447782,22612.536963433042,29874.648854998188 +HLA-A*24:02,LYGTTLEQQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,28990.4,26818.0,14067.07,3472.181258108957,5467.901453685499,7824.765679419533 +HLA-A*24:02,LDKKQRFHNI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,39331.7,33720.9,24254.75,10760.48301466704,13079.386571515302,20192.747930564517 +HLA-A*24:02,LRREVYDFAF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,15282.3,13888.3,9032.62,3396.447163543621,4625.537091423434,6698.489881155511 +HLA-A*24:02,RCINCQKPL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,37134.8,37655.9,23544.46,10265.641030587249,14067.48892259074,21094.348221815093 +HLA-A*24:02,TLEDLLMGTL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,30399.7,28756.1,28965.04,11968.230862651542,14649.88784954922,26051.10082437397 +HLA-A*24:02,FYSKISEYR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,9771.4,9577.7,7663.92,2517.1746850747663,4142.750766266233,4009.092735139147 +HLA-A*24:02,QLLRREVYDF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8433.7,9138.2,6034.56,1310.3032659857092,2974.8412189658825,5017.241639230572 +HLA-A*24:02,RHLDKKQRF,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5098.1,9996.1,2766.13,624.1467030641506,1176.3738893945574,2251.6225660901514 +HLA-A*24:02,VDIRTLEDL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,31430.5,32842.3,26183.23,14396.492717335888,17405.885082392062,21649.131058989424 +HLA-A*24:02,VDIRTLEDLL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,30708.1,31901.9,23643.51,16245.343259640471,19853.677601398125,25142.400644843307 +HLA-A*24:02,DPQERPRKL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,45927.6,44371.8,40129.47,18731.668651537042,20882.49224815732,25848.272337163253 +HLA-A*24:02,LCVQSTHVDIR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,44114.8,42730.3,37951.25,23082.196613387925,25362.85581135644,34825.67527716447 +HLA-A*24:02,TFCCKCDSTLR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,26034.1,32333.2,29078.7,16550.591567148018,19665.39300949906,24965.192500271387 +HLA-A*24:02,EYMLDLQPETT,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,33132.1,29578.5,26569.63,2314.188613306457,4274.95201592503,6762.439605732876 +HLA-A*24:02,RTLEDLLMGTL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,23833.8,19335.6,26563.04,7132.363209150767,10084.0069546467,16049.337486401597 +HLA-A*24:02,CYSLYGTT,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,26920.4,27792.6,18030.1,2537.044719367281,3859.837211588529,12517.958554324397 +HLA-A*24:02,SEYRHYCYSLY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,10564.2,16609.5,9611.69,10111.367483128466,15044.378332556398,22937.54791454256 +HLA-A*24:02,QQLLRREVYDF,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,13218.7,13841.1,18489.62,2628.5987247809007,4844.5063343588,14465.954769608485 +HLA-A*24:02,REVYDFAFRDL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,8446.6,6586.4,14573.68,11115.580407908974,14349.687826574016,11849.240258871943 +HLA-A*24:02,ECVYCKQQLLR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,38119.6,37341.5,31379.52,25523.90440628299,26560.196552286587,35494.326036429564 +HLA-A*24:02,YDFAFRDLCIV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,21789.1,26267.5,16421.16,18867.044391276177,22701.055813824718,30793.33695416457 +HLA-A*24:02,GNPYAVCDKCL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,26546.4,27740.6,34978.46,16938.861890850312,20381.577819995644,27403.483742458222 +HLA-A*24:02,CLKFYSKISEY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,24856.2,23225.4,37524.57,26914.97977266992,27765.476529918862,40336.140749917526 +HLA-A*24:02,ISEYRHYCYSL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,2833.5,2355.4,3113.45,8899.099085509657,11589.442806600184,19249.411082425595 +HLA-A*24:02,EVYDFAFRDLC,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,24585.8,25415.6,22725.03,20922.26895286488,23293.65328310457,32126.65772282363 +HLA-A*24:02,YYCYSVYGTTL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,216.6,202.8,604.7,111.89359456203823,301.8856522689136,427.51753151815245 +HLA-A*24:02,YYCYSVYGTT,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,7525.9,7137.3,1947.24,1525.68790783909,3382.4220501099353,3628.565531893391 +HLA-A*24:02,SEYRYYCYSV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1054.0,2190.0,2876.35,7275.177471932455,11336.546020412681,15400.903755077848 +HLA-A*24:02,YYCYSVYGT,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7889.0,7567.3,6728.99,2629.136425290338,4638.798012449303,6811.211221578079 +HLA-A*24:02,EYRYYCYSVY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,7795.8,7867.7,7892.64,991.8631191941313,1866.2659332119367,3302.622051967073 +HLA-A*24:02,VYGTTLEQQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,28208.5,24869.1,10684.19,3000.441701810754,4928.23580615368,6186.455574963915 +HLA-B*07:02,GPAGQAEPDRA,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,14048.1,16452.5,15440.19,8439.613951352983,7297.677323820672,19040.17544763588 +HLA-B*07:02,LPQLCTELQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,11909.2,16362.1,8416.83,5938.424953192735,4843.336291632932,6641.374936153506 +HLA-B*07:02,TPTLHEYMLDL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,3949.5,5038.2,2848.26,768.4217841785478,1302.9485673908416,2715.12986266422 +HLA-B*07:02,EPDRAHYNI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,4371.2,5465.6,10667.68,7408.608322233509,7762.451996891709,12742.865461393372 +HLA-B*07:02,RCINCQKPL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5829.8,10020.6,10881.59,3948.634140996812,3630.282590768997,7602.4332938880725 +HLA-B*07:02,LPQLCTELQTT,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,11770.8,12514.7,11799.65,4419.9396490359295,3282.740576315066,8159.9436921048045 +HLA-B*07:02,YSLYGTTL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,15487.0,12208.5,23550.32,8041.795089062719,5743.020502832607,14662.043113555439 +HLA-B*07:02,GPAGQAEPD,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,18549.3,22758.7,10408.18,5409.346556132906,4792.710922930783,6776.763925503233 +HLA-B*07:02,CVYCKQQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,24775.7,17574.2,29636.79,9462.35507254124,8425.700072279475,13477.150061657196 +HLA-B*07:02,NPYAVCDKCL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,2833.6,2857.8,3554.75,1510.460666972149,1788.5132709715024,3572.3129531873565 +HLA-B*07:02,SEYRHYCYSL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,16944.8,13971.8,23377.94,11601.694482651614,11169.815939819517,14290.891903899379 +HLA-B*07:02,QPETTDLYCY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,26188.3,26393.7,28506.75,18330.593632548607,14625.753154498847,15556.322880163614 +HLA-B*15:01,DLQPETTDLY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1985.9,2981.1,1131.31,3901.182659640288,4483.832141070158,1783.8474540063705 +HLA-B*15:01,SEYRHYCYSL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4282.6,5063.9,4628.91,3965.6009998798,6776.729747724399,4161.584395180935 +HLA-B*15:01,RLCVQSTHV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,3307.3,3976.7,1399.08,991.6851693379456,782.1412939991621,668.6607439441259 +HLA-B*15:01,LMGTLGIVC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,10940.6,9196.3,2283.83,1163.2972888083507,2451.3715853407625,1714.1131992773676 +HLA-B*15:01,SLYGTTLEQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7925.2,8401.9,4879.94,3679.8327331602363,4346.2989638983645,4685.072392552245 +HLA-B*15:01,LLIRCINCQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15785.5,17114.1,7808.63,4894.483493790985,6755.436663280311,4899.414494827697 +HLA-B*15:01,LEQQYNKPL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,10517.3,11395.1,3724.69,2763.669943063591,3815.3322109175483,1596.0868186309488 +HLA-B*15:01,QAEPDRAHY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5004.4,6088.1,3473.69,2522.379797450491,4143.677865503523,3351.3820256185163 +HLA-B*15:01,GTLGIVCPI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,3304.0,3917.1,6258.59,4511.577434755824,6087.242606478117,4170.298962941786 +HLA-B*15:01,GIVCPICSQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15376.8,18112.8,6329.0,6001.218223650592,7331.933504408098,6918.57362795794 +HLA-B*15:01,QLNDSSEEE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,32349.3,31283.9,17375.87,13513.985673522251,15056.571198816013,20926.329416096352 +HLA-B*15:01,CMSCCRSSR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,17864.8,16099.6,15117.01,6856.540480813101,7400.988988509392,10515.678390013729 +HLA-B*15:01,MSCCRSSRT,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,21090.0,24486.0,20596.6,9843.743232345192,12450.37128504561,16894.533840304917 +HLA-B*15:01,RSSRTRRETQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,24184.0,26577.4,17711.83,5047.551635684806,7137.601056542866,3896.277724665923 +HLA-B*15:01,FAFRDLCIV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,4061.7,4421.6,11152.53,4739.977927422689,6404.1837745263065,6853.42945161375 +HLA-B*15:01,LIRCINCQK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,20383.5,18954.9,15499.94,6841.424715671967,9989.585883938127,12415.662202950058 +HLA-B*15:01,LMGTLGIVCPI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,3804.9,5684.1,5377.35,300.37054166544965,480.78461830160103,1357.4092613559171 +HLA-B*15:01,REVYDFAF,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,7893.8,8117.0,4471.38,319.6990871014404,329.72918502561424,730.5215018668864 +HLA-B*15:01,VQSTHVDIRTL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7355.2,4917.9,11578.08,871.4412256872432,997.933215443048,2237.2053353204565 +HLA-B*15:01,LIRCINCQKPL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,4240.5,6136.4,8293.61,1327.251814535686,2510.971864538838,5517.449886787486 +HLA-B*15:01,RLCVQSTH,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,15171.7,13984.7,17594.75,1230.1589376680622,1082.1936270282201,1195.1841288138844 +HLA-B*15:01,FYSKISEYRHY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,5921.2,6033.2,5410.21,6511.682318012961,7712.374659604434,10691.632383740738 +HLA-B*15:01,TLGIVCPI,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20397.2,18270.7,18481.22,3542.624250266721,3264.328781981469,4857.917071540425 +HLA-B*15:01,RTRRETQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20971.0,19528.8,24587.69,3000.259755732219,5335.501010276689,5763.350117362581 +HLA-B*15:01,MSCCRSSR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,27739.7,31263.0,33102.03,9088.570284361696,10481.258964209477,17024.63267992658 +HLA-B*15:01,CVYCKQQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,26148.1,21053.8,30864.02,3813.192639109835,7495.5400912868445,8313.235518311285 +HLA-B*15:01,KQRHLDKK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,29028.1,28410.4,29631.98,9377.071195923309,11672.093401923024,19848.68824116367 diff --git a/test/expensive_verify_pretrain_optimizable.py b/test/expensive_verify_pretrain_optimizable.py new file mode 100644 index 0000000000000000000000000000000000000000..618ca829c0789698d2d7a4b889fdb7b413fd1078 --- /dev/null +++ b/test/expensive_verify_pretrain_optimizable.py @@ -0,0 +1,97 @@ +# Expensive test - not run by nose. + +from mhcflurry import train_pan_allele_models_command +from mhcflurry.downloads import get_path +from mhcflurry.allele_encoding import AlleleEncoding + +import pandas +import numpy + +PRETRAIN_DATA_PATH = get_path( + "random_peptide_predictions", "predictions.csv.bz2") + +FULL_TRAIN_DF = pandas.read_csv( + get_path( + "data_curated", + "curated_training_data.no_mass_spec.csv.bz2")) +TRAIN_DF = FULL_TRAIN_DF.loc[ + (FULL_TRAIN_DF.peptide.str.len() >= 8) & + (FULL_TRAIN_DF.peptide.str.len() <= 15) +] +ALLELE_SEQUENCES = pandas.read_csv( + get_path("allele_sequences", "allele_sequences.csv"), + index_col=0).sequence +ALLELE_SEQUENCES = ALLELE_SEQUENCES.loc[ + ALLELE_SEQUENCES.index.isin(TRAIN_DF.allele) +] +TRAIN_DF = TRAIN_DF.loc[ + TRAIN_DF.allele.isin(ALLELE_SEQUENCES.index) +] +FOLDS_DF = pandas.DataFrame(index=TRAIN_DF.index) +FOLDS_DF["fold_0"] = True + +HYPERPARAMTERS = { + 'activation': 'tanh', 'allele_dense_layer_sizes': [], + 'batch_normalization': False, + 'dense_layer_l1_regularization': 0.0, + 'dense_layer_l2_regularization': 0.0, 'dropout_probability': 0.5, + 'early_stopping': True, 'init': 'glorot_uniform', + 'layer_sizes': [1024, 512], 'learning_rate': None, + 'locally_connected_layers': [], 'loss': 'custom:mse_with_inequalities', + 'max_epochs': 0, 'min_delta': 0.0, 'minibatch_size': 128, + 'optimizer': 'rmsprop', 'output_activation': 'sigmoid', 'patience': 20, + 'peptide_allele_merge_activation': '', + 'peptide_allele_merge_method': 'concatenate', + 'peptide_amino_acid_encoding': 'BLOSUM62', 'peptide_dense_layer_sizes': [], + 'peptide_encoding': {'alignment_method': 'left_pad_centered_right_pad', + 'max_length': 15, 'vector_encoding_name': 'BLOSUM62'}, + 'random_negative_affinity_max': 50000.0, + 'random_negative_affinity_min': 20000.0, 'random_negative_constant': 25, + 'random_negative_distribution_smoothing': 0.0, + 'random_negative_match_distribution': True, 'random_negative_rate': 0.2, + 'train_data': {'pretrain': True, + 'pretrain_max_epochs': 30, + 'pretrain_min_epochs': 5, + 'pretrain_patience': 3, + 'pretrain_peptides_per_step': 8, + 'pretrain_steps_per_epoch': 256}, + 'validation_split': 0.1, + 'data_dependent_initialization_method': "lsuv", +} + + +def verify_optimizable(): + predictor = train_pan_allele_models_command.train_model( + work_item_name="work-item0", + work_item_num=0, + num_work_items=1, + architecture_num=0, + num_architectures=1, + fold_num=0, + num_folds=1, + replicate_num=0, + num_replicates=1, + hyperparameters=HYPERPARAMTERS, + pretrain_data_filename=PRETRAIN_DATA_PATH, + verbose=1, + progress_print_interval=5.0, + predictor=None, + save_to=None, + constant_data={ + 'train_data': TRAIN_DF, + 'folds_df': FOLDS_DF, + 'allele_encoding': AlleleEncoding( + alleles=ALLELE_SEQUENCES.index.values, + allele_to_sequence=ALLELE_SEQUENCES.to_dict()), + }, + ) + (network,) = predictor.neural_networks + print(predictor, network) + print(network.fit_info) + pretrain_val_loss = network.fit_info[0]["val_loss"][-1] + print(pretrain_val_loss) + numpy.testing.assert_array_less(pretrain_val_loss, 0.1) + + +if __name__ == "__main__": + verify_optimizable() diff --git a/test/test_allele_encoding.py b/test/test_allele_encoding.py new file mode 100644 index 0000000000000000000000000000000000000000..caba3bd3394fe4dbcca9629596dfe916d1f4f59a --- /dev/null +++ b/test/test_allele_encoding.py @@ -0,0 +1,36 @@ +import time + +from mhcflurry.allele_encoding import AlleleEncoding +from mhcflurry.amino_acid import BLOSUM62_MATRIX +from numpy.testing import assert_equal + + +def test_allele_encoding_speed(): + encoding = AlleleEncoding( + ["A*02:01", "A*02:03", "A*02:01"], + { + "A*02:01": "AC", + "A*02:03": "AE", + } + ) + start = time.time() + encoding1 = encoding.fixed_length_vector_encoded_sequences("BLOSUM62") + assert_equal( + [ + [BLOSUM62_MATRIX["A"], BLOSUM62_MATRIX["C"]], + [BLOSUM62_MATRIX["A"], BLOSUM62_MATRIX["E"]], + [BLOSUM62_MATRIX["A"], BLOSUM62_MATRIX["C"]], + ], encoding1) + print("Simple encoding in %0.2f sec." % (time.time() - start)) + print(encoding1) + + encoding = AlleleEncoding( + ["A*02:01", "A*02:03", "A*02:01"] * int(1e5), + { + "A*02:01": "AC" * 16, + "A*02:03": "AE" * 16, + } + ) + start = time.time() + encoding1 = encoding.fixed_length_vector_encoded_sequences("BLOSUM62") + print("Long encoding in %0.2f sec." % (time.time() - start)) diff --git a/test/test_calibrate_percentile_ranks_command.py b/test/test_calibrate_percentile_ranks_command.py new file mode 100644 index 0000000000000000000000000000000000000000..a5656ac35e5480fb2771a514d5a89dfb19e1aad3 --- /dev/null +++ b/test/test_calibrate_percentile_ranks_command.py @@ -0,0 +1,81 @@ +""" +Tests for calibrate percentile ranks command +""" + +import os +import shutil +import tempfile +import subprocess + +from numpy.testing import assert_equal + +from mhcflurry import Class1AffinityPredictor +from mhcflurry.downloads import get_path + +os.environ["CUDA_VISIBLE_DEVICES"] = "" + +from mhcflurry.testing_utils import cleanup, startup +teardown = cleanup +setup = startup + +def run_and_check(n_jobs=0, delete=True, additional_args=[]): + source_models_dir = get_path("models_class1_pan", "models.with_mass_spec") + dest_models_dir = tempfile.mkdtemp(prefix="mhcflurry-test-models") + + # Save a new predictor that has no percent rank calibration data. + original_predictor = Class1AffinityPredictor.load(source_models_dir) + print("Loaded predictor", source_models_dir) + new_predictor = Class1AffinityPredictor( + class1_pan_allele_models=original_predictor.class1_pan_allele_models, + allele_to_sequence=original_predictor.allele_to_sequence, + ) + new_predictor.save(dest_models_dir) + print("Saved predictor to", dest_models_dir) + + new_predictor = Class1AffinityPredictor.load(dest_models_dir) + assert_equal(len(new_predictor.allele_to_percent_rank_transform), 0) + + args = [ + "mhcflurry-calibrate-percentile-ranks", + "--models-dir", dest_models_dir, + "--match-amino-acid-distribution-data", get_path( + "data_curated", "curated_training_data.no_mass_spec.csv.bz2"), + "--motif-summary", + "--num-peptides-per-length", "1000", + "--allele", "HLA-A*02:01", "HLA-B*07:02", + "--verbosity", "1", + "--num-jobs", str(n_jobs), + ] + additional_args + print("Running with args: %s" % args) + subprocess.check_call(args) + + new_predictor = Class1AffinityPredictor.load(dest_models_dir) + assert_equal(len(new_predictor.allele_to_percent_rank_transform), 2) + + if delete: + print("Deleting: %s" % dest_models_dir) + shutil.rmtree(dest_models_dir) + else: + print("Not deleting: %s" % dest_models_dir) + + +def test_run_serial(): + run_and_check(n_jobs=0) + + +def test_run_parallel(): + run_and_check(n_jobs=2) + + +def test_run_cluster_parallelism(delete=True): + run_and_check(n_jobs=0, additional_args=[ + '--cluster-parallelism', + '--cluster-results-workdir', '/tmp/', + '--cluster-max-retries', '0', + ], delete=delete) + + +if __name__ == "__main__": + # run_and_check(n_jobs=0, delete=False) + # run_and_check(n_jobs=2, delete=False) + test_run_cluster_parallelism(delete=False) diff --git a/test/test_changing_allele_representations.py b/test/test_changing_allele_representations.py new file mode 100644 index 0000000000000000000000000000000000000000..271cb3d976fa1f53eb4d818e8806044a54f192fa --- /dev/null +++ b/test/test_changing_allele_representations.py @@ -0,0 +1,104 @@ +import time +import pandas + +from mhcflurry.allele_encoding import AlleleEncoding +from mhcflurry.amino_acid import BLOSUM62_MATRIX +from mhcflurry.class1_affinity_predictor import Class1AffinityPredictor +from mhcflurry.downloads import get_path + +from numpy.testing import assert_equal + +from mhcflurry.testing_utils import cleanup, startup +teardown = cleanup +setup = startup + +ALLELE_TO_SEQUENCE = pandas.read_csv( + get_path( + "allele_sequences", "allele_sequences.csv"), + index_col=0).sequence.to_dict() + +HYPERPARAMETERS = { + 'activation': 'tanh', + 'allele_dense_layer_sizes': [], + 'batch_normalization': False, + 'dense_layer_l1_regularization': 0.0, + 'dense_layer_l2_regularization': 0.0, + 'dropout_probability': 0.5, + 'early_stopping': True, + 'init': 'glorot_uniform', + 'layer_sizes': [4], + 'learning_rate': None, + 'locally_connected_layers': [], + 'loss': 'custom:mse_with_inequalities', + 'max_epochs': 40, + 'minibatch_size': 128, + 'optimizer': 'rmsprop', + 'output_activation': 'sigmoid', + 'patience': 2, + 'peptide_allele_merge_activation': '', + 'peptide_allele_merge_method': 'concatenate', + 'peptide_amino_acid_encoding': 'BLOSUM62', + 'peptide_dense_layer_sizes': [], + 'peptide_encoding': { + 'alignment_method': 'left_pad_centered_right_pad', + 'max_length': 15, + 'vector_encoding_name': 'BLOSUM62', + }, + 'random_negative_affinity_max': 50000.0, + 'random_negative_affinity_min': 20000.0, + 'random_negative_constant': 0, + 'random_negative_distribution_smoothing': 0.0, + 'random_negative_match_distribution': True, + 'random_negative_rate': 0.0, + 'train_data': {}, + 'validation_split': 0.1, +} + + +def test_changing_allele_representations(): + allele1 = "HLA-A*02:01" + allele2 = "HLA-C*03:04" + allele3 = "HLA-B*07:01" + + peptide = "SIINFEKL" + + allele_to_sequence = {} + for allele in [allele1, allele2]: + allele_to_sequence[allele] = ALLELE_TO_SEQUENCE[allele] + + data1 = [] + for i in range(5000): + data1.append((allele1, peptide, 0, "=")) + data1.append((allele2, peptide, 50000, "=")) + data1 = pandas.DataFrame( + data1, columns=["allele", "peptide", "affinity", "inequality"]) + + predictor = Class1AffinityPredictor(allele_to_sequence=allele_to_sequence) + predictor.fit_class1_pan_allele_models( + n_models=1, + architecture_hyperparameters=HYPERPARAMETERS, + alleles=data1.allele.values, + peptides=data1.peptide.values, + affinities=data1.affinity.values, + inequalities=data1.inequality.values) + + (value1, value2) = predictor.predict([peptide, peptide], alleles=[allele1, allele2]) + assert value1 < 100, value1 + assert value2 > 4000, value2 + + allele_to_sequence[allele3] = ALLELE_TO_SEQUENCE[allele3] + predictor.allele_to_sequence = allele_to_sequence + predictor.clear_cache() + + (value1, value2, value3) = predictor.predict( + [peptide, peptide, peptide], + alleles=[allele1, allele2, allele3]) + assert value1 < 100, value1 + assert value2 > 4000, value2 + + + + + + + diff --git a/test/test_class1_affinity_predictor.py b/test/test_class1_affinity_predictor.py index 3df548a826a99c9936095635006855dd99502a28..aa70a25da2f657578cf9caea84505847a6158a8d 100644 --- a/test/test_class1_affinity_predictor.py +++ b/test/test_class1_affinity_predictor.py @@ -15,10 +15,22 @@ from nose.tools import eq_, assert_raises from numpy import testing from mhcflurry.downloads import get_path +from mhcflurry.testing_utils import cleanup, startup DOWNLOADED_PREDICTOR = Class1AffinityPredictor.load() -logging.basicConfig(level=logging.DEBUG) + +def setup(): + global DOWNLOADED_PREDICTOR + startup() + DOWNLOADED_PREDICTOR = Class1AffinityPredictor.load() + logging.basicConfig(level=logging.DEBUG) + + +def teardown(): + global DOWNLOADED_PREDICTOR + DOWNLOADED_PREDICTOR = None + cleanup() # To hunt down a weird warning we were seeing in pandas. @@ -52,7 +64,7 @@ def test_a1_known_epitopes_in_newly_trained_model(): df = pandas.read_csv( get_path( "data_curated", "curated_training_data.no_mass_spec.csv.bz2")) - df = df.ix[ + df = df.loc[ (df.allele == allele) & (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) @@ -138,16 +150,16 @@ def test_class1_affinity_predictor_a0205_memorize_training_data(): df = pandas.read_csv( get_path( "data_curated", "curated_training_data.no_mass_spec.csv.bz2")) - df = df.ix[ + df = df.loc[ df.allele == allele ] - df = df.ix[ + df = df.loc[ df.peptide.str.len() == 9 ] - df = df.ix[ + df = df.loc[ df.measurement_type == "quantitative" ] - df = df.ix[ + df = df.loc[ df.measurement_source == "kim2014" ] @@ -252,3 +264,4 @@ def test_predict_implementations_equivalent(): peptides=peptides, centrality_measure=centrality_measure).prediction.values testing.assert_almost_equal(pred1, pred2, decimal=2) + diff --git a/test/test_class1_neural_network.py b/test/test_class1_neural_network.py index 8ba330cff8bd19154784c879ead66b2edc40a182..47be495cb94c0f4c9133df458bc31ca97ed861df 100644 --- a/test/test_class1_neural_network.py +++ b/test/test_class1_neural_network.py @@ -13,6 +13,10 @@ from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.downloads import get_path from mhcflurry.common import random_peptides +from mhcflurry.testing_utils import cleanup, startup +teardown = cleanup +setup = startup + def test_class1_neural_network_a0205_training_accuracy(): # Memorize the dataset. @@ -38,16 +42,16 @@ def test_class1_neural_network_a0205_training_accuracy(): df = pandas.read_csv( get_path( "data_curated", "curated_training_data.no_mass_spec.csv.bz2")) - df = df.ix[ + df = df.loc[ df.allele == allele ] - df = df.ix[ + df = df.loc[ df.peptide.str.len() == 9 ] - df = df.ix[ + df = df.loc[ df.measurement_type == "quantitative" ] - df = df.ix[ + df = df.loc[ df.measurement_source == "kim2014" ] @@ -88,11 +92,10 @@ def test_class1_neural_network_a0205_training_accuracy(): def test_inequalities(): # Memorize the dataset. hyperparameters = dict( - loss="custom:mse_with_inequalities", peptide_amino_acid_encoding="one-hot", activation="tanh", - layer_sizes=[16], - max_epochs=50, + layer_sizes=[64], + max_epochs=200, minibatch_size=32, random_negative_rate=0.0, early_stopping=False, @@ -105,10 +108,11 @@ def test_inequalities(): } ], dense_layer_l1_regularization=0.0, - dropout_probability=0.0) + dropout_probability=0.0, + loss="custom:mse_with_inequalities_and_multiple_outputs") df = pandas.DataFrame() - df["peptide"] = random_peptides(1000, length=9) + df["peptide"] = random_peptides(100, length=9) # First half are binders df["binder"] = df.index < len(df) / 2 diff --git a/test/test_class1_pan.py b/test/test_class1_pan.py new file mode 100644 index 0000000000000000000000000000000000000000..0528ef60da5b6f82d4381452030cbe51c2ce83ef --- /dev/null +++ b/test/test_class1_pan.py @@ -0,0 +1,119 @@ +""" +Tests for training and predicting using Class1 pan-allele models. +""" + +from sklearn.metrics import roc_auc_score +import pandas + +from numpy.testing import assert_, assert_equal + +from mhcflurry import Class1AffinityPredictor,Class1NeuralNetwork +from mhcflurry.allele_encoding import AlleleEncoding +from mhcflurry.downloads import get_path + +from mhcflurry.testing_utils import cleanup, startup +teardown = cleanup +setup = startup + + +HYPERPARAMETERS = { + 'activation': 'tanh', + 'allele_dense_layer_sizes': [], + 'batch_normalization': False, + 'dense_layer_l1_regularization': 0.0, + 'dense_layer_l2_regularization': 0.0, + 'dropout_probability': 0.5, + 'early_stopping': True, + 'init': 'glorot_uniform', + 'layer_sizes': [64], + 'learning_rate': None, + 'locally_connected_layers': [], + 'loss': 'custom:mse_with_inequalities', + 'max_epochs': 5000, + 'minibatch_size': 256, + 'optimizer': 'rmsprop', + 'output_activation': 'sigmoid', + 'patience': 5, + 'peptide_allele_merge_activation': '', + 'peptide_allele_merge_method': 'concatenate', + 'peptide_amino_acid_encoding': 'BLOSUM62', + 'peptide_dense_layer_sizes': [], + 'peptide_encoding': { + 'alignment_method': 'left_pad_centered_right_pad', + 'max_length': 15, + 'vector_encoding_name': 'BLOSUM62', + }, + 'random_negative_affinity_max': 50000.0, + 'random_negative_affinity_min': 20000.0, + 'random_negative_constant': 25, + 'random_negative_distribution_smoothing': 0.0, + 'random_negative_match_distribution': True, + 'random_negative_rate': 0.2, + 'train_data': {}, + 'validation_split': 0.1, +} + + +ALLELE_TO_SEQUENCE = pandas.read_csv( + get_path( + "allele_sequences", "allele_sequences.csv"), + index_col=0).sequence.to_dict() + + +TRAIN_DF = pandas.read_csv( + get_path( + "data_curated", "curated_training_data.no_mass_spec.csv.bz2")) + +TRAIN_DF = TRAIN_DF.loc[TRAIN_DF.allele.isin(ALLELE_TO_SEQUENCE)] +TRAIN_DF = TRAIN_DF.loc[TRAIN_DF.peptide.str.len() >= 8] +TRAIN_DF = TRAIN_DF.loc[TRAIN_DF.peptide.str.len() <= 15] + +TRAIN_DF = TRAIN_DF.loc[ + TRAIN_DF.allele.isin(TRAIN_DF.allele.value_counts().iloc[:3].index) +] + + +MS_HITS_DF = pandas.read_csv( + get_path( + "data_curated", "curated_training_data.with_mass_spec.csv.bz2")) +MS_HITS_DF = MS_HITS_DF.loc[MS_HITS_DF.allele.isin(TRAIN_DF.allele.unique())] +MS_HITS_DF = MS_HITS_DF.loc[MS_HITS_DF.peptide.str.len() >= 8] +MS_HITS_DF = MS_HITS_DF.loc[MS_HITS_DF.peptide.str.len() <= 15] +MS_HITS_DF = MS_HITS_DF.loc[~MS_HITS_DF.peptide.isin(TRAIN_DF.peptide)] + +print("Loaded %d training and %d ms hits" % ( + len(TRAIN_DF), len(MS_HITS_DF))) + + +def test_train_simple(): + network = Class1NeuralNetwork(**HYPERPARAMETERS) + allele_encoding = AlleleEncoding( + TRAIN_DF.allele.values, + allele_to_sequence=ALLELE_TO_SEQUENCE) + network.fit( + TRAIN_DF.peptide.values, + affinities=TRAIN_DF.measurement_value.values, + allele_encoding=allele_encoding, + inequalities=TRAIN_DF.measurement_inequality.values) + + validation_df = MS_HITS_DF.copy() + validation_df["hit"] = 1 + + decoys_df = MS_HITS_DF.copy() + decoys_df["hit"] = 0 + decoys_df["allele"] = decoys_df.allele.sample(frac=1.0).values + + validation_df = pandas.concat([validation_df, decoys_df], ignore_index=True) + + predictions = network.predict( + peptides=validation_df.peptide.values, + allele_encoding=AlleleEncoding( + validation_df.allele.values, borrow_from=allele_encoding)) + + print(pandas.Series(predictions).describe()) + + score = roc_auc_score(validation_df.hit, -1 * predictions) + print("AUC", score) + + assert_(score > 0.6) + diff --git a/test/test_custom_loss.py b/test/test_custom_loss.py index f3644c66652136ca7c9f05299f1a20e6995fc8fd..98ee4ab52495b6163f15189c06969455c78062a5 100644 --- a/test/test_custom_loss.py +++ b/test/test_custom_loss.py @@ -11,8 +11,22 @@ import keras.backend as K from mhcflurry.custom_loss import CUSTOM_LOSSES +from mhcflurry.testing_utils import cleanup, startup +teardown = cleanup +setup = startup + def evaluate_loss(loss, y_true, y_pred): + y_true = numpy.array(y_true) + y_pred = numpy.array(y_pred) + if y_pred.ndim == 1: + y_pred = y_pred.reshape((len(y_pred), 1)) + if y_true.ndim == 1: + y_true = y_true.reshape((len(y_true), 1)) + + assert y_true.ndim == 2 + assert y_pred.ndim == 2 + if K.backend() == "tensorflow": session = K.get_session() y_true_var = K.constant(y_true, name="y_true") @@ -28,14 +42,13 @@ def evaluate_loss(loss, y_true, y_pred): raise ValueError("Unsupported backend: %s" % K.backend()) -def test_mse_with_inequalities(): - - loss_obj = CUSTOM_LOSSES['mse_with_inequalities'] - +def test_mse_with_inequalities(loss_obj=CUSTOM_LOSSES['mse_with_inequalities']): y_values = [0.0, 0.5, 0.8, 1.0] adjusted_y = loss_obj.encode_y(y_values) + print(adjusted_y) loss0 = evaluate_loss(loss_obj.loss, adjusted_y, y_values) + print(loss0) eq_(loss0, 0.0) adjusted_y = loss_obj.encode_y(y_values, [">", ">", ">", ">"]) @@ -64,9 +77,70 @@ def test_mse_with_inequalities(): adjusted_y = loss_obj.encode_y(y_values, ["=", "<", ">", ">"]) loss0 = evaluate_loss(loss_obj.loss, adjusted_y, [0.1, 0.6, 0.9, 1.0]) - assert_almost_equal(loss0, 0.02) + assert_almost_equal(loss0, 0.02 / 4) adjusted_y = loss_obj.encode_y(y_values, ["=", "<", "=", ">"]) loss0 = evaluate_loss(loss_obj.loss, adjusted_y, [0.1, 0.6, 0.9, 1.0]) - assert_almost_equal(loss0, 0.03) + assert_almost_equal(loss0, 0.03 / 4) + + +def test_mse_with_inequalities_and_multiple_outputs(): + loss_obj = CUSTOM_LOSSES['mse_with_inequalities_and_multiple_outputs'] + test_mse_with_inequalities(loss_obj) + + y_values = [0.0, 0.5, 0.8, 1.0] + adjusted_y = loss_obj.encode_y( + y_values, output_indices=[0, 1, 1, 1]) + loss0 = evaluate_loss( + loss_obj.loss, + adjusted_y, + [ + [0.0, 1000], + [2000, 0.5], + [3000, 0.8], + [4000, 1.0], + ]) + assert_almost_equal(loss0, 0.0) + + y_values = [0.0, 0.5, 0.8, 1.0] + adjusted_y = loss_obj.encode_y( + y_values, output_indices=[0, 1, 1, 0]) + loss0 = evaluate_loss( + loss_obj.loss, + adjusted_y, + [ + [0.1, 1000], + [2000, 0.6], + [3000, 0.8], + [1.0, 4000], + ]) + assert_almost_equal(loss0, 0.02 / 4) + + y_values = [0.0, 0.5, 0.8, 1.0] + adjusted_y = loss_obj.encode_y( + y_values, output_indices=[0, 1, 1, 0], inequalities=["=", ">", "<", "<"]) + loss0 = evaluate_loss( + loss_obj.loss, + adjusted_y, + [ + [0.1, 1000], + [2000, 0.6], + [3000, 0.8], + [1.0, 4000], + ]) + assert_almost_equal(loss0, 0.01 / 4) + + y_values = [0.0, 0.5, 0.8, 1.0] + adjusted_y = loss_obj.encode_y( + y_values, output_indices=[0, 1, 1, 0], inequalities=["=", "<", "<", "<"]) + loss0 = evaluate_loss( + loss_obj.loss, + adjusted_y, + [ + [0.1, 1000], + [2000, 0.6], + [3000, 0.8], + [1.0, 4000], + ]) + assert_almost_equal(loss0, 0.02 / 4) diff --git a/test/test_download_models_class1.py b/test/test_download_models_class1.py index be36e44fec6a8d6a5ba97a84a2543a2c12d21bd0..29a4d47a3dc12ba553e26f6fc1af93a338f543ea 100644 --- a/test/test_download_models_class1.py +++ b/test/test_download_models_class1.py @@ -5,8 +5,21 @@ from numpy.testing import assert_equal from mhcflurry import Class1AffinityPredictor, Class1NeuralNetwork +from mhcflurry.testing_utils import cleanup, startup -DOWNLOADED_PREDICTOR = Class1AffinityPredictor.load() +DOWNLOADED_PREDICTOR = None + + +def setup(): + global DOWNLOADED_PREDICTOR + startup() + DOWNLOADED_PREDICTOR = Class1AffinityPredictor.load() + + +def teardown(): + global DOWNLOADED_PREDICTOR + DOWNLOADED_PREDICTOR = None + cleanup() def predict_and_check( diff --git a/test/test_multi_output.py b/test/test_multi_output.py new file mode 100644 index 0000000000000000000000000000000000000000..452f7a767c09a653be5f37113d20b0f117f44fd7 --- /dev/null +++ b/test/test_multi_output.py @@ -0,0 +1,91 @@ +from nose.tools import eq_, assert_less, assert_greater, assert_almost_equal + +import numpy +import pandas +from numpy import testing + +numpy.random.seed(0) + +import logging +logging.getLogger('tensorflow').disabled = True + +from mhcflurry.class1_neural_network import Class1NeuralNetwork +from mhcflurry.common import random_peptides + +from mhcflurry.testing_utils import cleanup, startup +teardown = cleanup +setup = startup + + +def test_multi_output(): + hyperparameters = dict( + loss="custom:mse_with_inequalities_and_multiple_outputs", + activation="tanh", + layer_sizes=[16], + max_epochs=50, + minibatch_size=250, + random_negative_rate=0.0, + random_negative_constant=0.0, + early_stopping=False, + validation_split=0.0, + locally_connected_layers=[ + ], + dense_layer_l1_regularization=0.0, + dropout_probability=0.0, + optimizer="adam", + num_outputs=3) + + df = pandas.DataFrame() + df["peptide"] = random_peptides(10000, length=9) + df["output1"] = df.peptide.map(lambda s: s[4] == 'K').astype(int) * 49000 + 1 + df["output2"] = df.peptide.map(lambda s: s[3] == 'Q').astype(int) * 49000 + 1 + df["output3"] = df.peptide.map(lambda s: s[4] == 'K' or s[3] == 'Q').astype(int) * 49000 + 1 + + print("output1 mean", df.output1.mean()) + print("output2 mean", df.output2.mean()) + + stacked = df.set_index("peptide").stack().reset_index() + stacked.columns = ['peptide', 'output_name', 'value'] + stacked["output_index"] = stacked.output_name.map({ + "output1": 0, + "output2": 1, + "output3": 2, + }) + assert not stacked.output_index.isnull().any(), stacked + + fit_kwargs = { + 'verbose': 1, + } + + predictor = Class1NeuralNetwork(**hyperparameters) + stacked_train = stacked + predictor.fit( + stacked_train.peptide.values, + stacked_train.value.values, + output_indices=stacked_train.output_index.values, + **fit_kwargs) + + result = predictor.predict(df.peptide.values, output_index=None) + print(df.shape, result.shape) + print(result) + + df["prediction1"] = result[:,0] + df["prediction2"] = result[:,1] + df["prediction3"] = result[:,2] + + df_by_peptide = df.set_index("peptide") + + correlation = pandas.DataFrame( + numpy.corrcoef(df_by_peptide.T), + columns=df_by_peptide.columns, + index=df_by_peptide.columns) + print(correlation) + + sub_correlation = correlation.loc[ + ["output1", "output2", "output3"], + ["prediction1", "prediction2", "prediction3"], + ] + assert sub_correlation.iloc[0, 0] > 0.99, correlation + assert sub_correlation.iloc[1, 1] > 0.99, correlation + assert sub_correlation.iloc[2, 2] > 0.99, correlation + diff --git a/test/test_network_merging.py b/test/test_network_merging.py new file mode 100644 index 0000000000000000000000000000000000000000..69eab37dea033739fdb2f112b35ff3e6655cae8f --- /dev/null +++ b/test/test_network_merging.py @@ -0,0 +1,50 @@ +import logging +import numpy +import pandas +from mhcflurry import Class1AffinityPredictor, Class1NeuralNetwork +from mhcflurry.common import random_peptides +from mhcflurry.downloads import get_path + +from mhcflurry.testing_utils import cleanup, startup +logging.getLogger('tensorflow').disabled = True + +PAN_ALLELE_PREDICTOR = None + + +def setup(): + global PAN_ALLELE_PREDICTOR + startup() + PAN_ALLELE_PREDICTOR = Class1AffinityPredictor.load( + get_path("models_class1_pan", "models.with_mass_spec"), + max_models=4, + optimization_level=0,) + + +def teardown(): + global PAN_ALLELE_PREDICTOR + PAN_ALLELE_PREDICTOR = None + cleanup() + + +def test_merge(): + assert len(PAN_ALLELE_PREDICTOR.class1_pan_allele_models) == 4 + + peptides = random_peptides(100, length=9) + peptides.extend(random_peptides(100, length=10)) + peptides = pandas.Series(peptides).sample(frac=1.0) + + alleles = pandas.Series( + ["HLA-A*03:01", "HLA-B*57:01", "HLA-C*02:01"] + ).sample(n=len(peptides), replace=True) + + predictions1 = PAN_ALLELE_PREDICTOR.predict( + peptides=peptides, alleles=alleles) + + merged = Class1NeuralNetwork.merge( + PAN_ALLELE_PREDICTOR.class1_pan_allele_models) + merged_predictor = Class1AffinityPredictor( + allele_to_sequence=PAN_ALLELE_PREDICTOR.allele_to_sequence, + class1_pan_allele_models=[merged], + ) + predictions2 = merged_predictor.predict(peptides=peptides, alleles=alleles) + numpy.testing.assert_allclose(predictions1, predictions2, atol=0.1) diff --git a/test/test_predict_command.py b/test/test_predict_command.py index f4631020ff335d05d08973b32a681c2822abce39..c3f0a5c1aa22a634b06c862056c9216452849a35 100644 --- a/test/test_predict_command.py +++ b/test/test_predict_command.py @@ -6,6 +6,10 @@ from numpy.testing import assert_equal from mhcflurry import predict_command +from mhcflurry.testing_utils import cleanup, startup +teardown = cleanup +setup = startup + TEST_CSV = ''' Allele,Peptide,Experiment HLA-A0201,SYNFEKKL,17 @@ -58,7 +62,7 @@ def test_no_csv(): print(result) assert_equal(result.shape, (6, 6)) - sub_result1 = result.ix[result.peptide == "SIINFEKL"].set_index("allele") + sub_result1 = result.loc[result.peptide == "SIINFEKL"].set_index("allele") assert ( - sub_result1.ix["H-2-Kb"].mhcflurry1_prediction < - sub_result1.ix["HLA-A0201"].mhcflurry1_prediction) + sub_result1.loc["H-2-Kb"].mhcflurry1_prediction < + sub_result1.loc["HLA-A0201"].mhcflurry1_prediction) diff --git a/test/test_released_predictors_on_hpv_dataset.py b/test/test_released_predictors_on_hpv_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..26bf0227a74160187a3e385d1f633573b0400926 --- /dev/null +++ b/test/test_released_predictors_on_hpv_dataset.py @@ -0,0 +1,80 @@ +""" +Test accuracy on HPV benchmark used in MHCflurry Cell Systems 2018 paper. + +The study that generated this dataset has now been published +(Bonsack et al 2019, DOI: 10.1158/2326-6066.CIR-18-0584), and the authors +request that any work based on the HPV dataset cite this paper. +""" +import os +import pandas +from sklearn.metrics import roc_auc_score +from nose.tools import eq_, assert_less, assert_greater, assert_almost_equal + +from mhcflurry import Class1AffinityPredictor +from mhcflurry.downloads import get_path + +from mhcflurry.testing_utils import cleanup, startup + +def data_path(name): + ''' + Return the absolute path to a file in the test/data directory. + The name specified should be relative to test/data. + ''' + return os.path.join(os.path.dirname(__file__), "data", name) + + +DF = pandas.read_csv(data_path("hpv_predictions.csv")) +PREDICTORS = None + + +def setup(): + global PREDICTORS + startup() + PREDICTORS = { + 'allele-specific': Class1AffinityPredictor.load( + get_path("models_class1", "models")), + 'pan-allele': Class1AffinityPredictor.load( + get_path("models_class1_pan", "models.with_mass_spec")) +} + + +def teardown(): + global PREDICTORS + PREDICTORS = None + cleanup() + + +def test_on_hpv(df=DF): + scores_df = [] + for (name, predictor) in PREDICTORS.items(): + print("Running", name) + df[name] = predictor.predict(df.peptide, alleles=df.allele) + + for name in df.columns[8:]: + for nm_cutoff in [2000, 5000, 50000]: + labels = df["affinity"] < nm_cutoff + auc = roc_auc_score(labels.values, -1 * df[name].values) + scores_df.append((name, "auc-%dnM" % nm_cutoff, auc)) + scores_df = pandas.DataFrame( + scores_df, + columns=["predictor", "metric", "score"]) + scores_df = scores_df.pivot( + index="metric", columns="predictor", values="score") + + print("Scores") + print(scores_df) + + mean_scores = scores_df.mean() + assert_greater(mean_scores["allele-specific"], mean_scores["netmhcpan4"]) + assert_greater(mean_scores["pan-allele"], mean_scores["netmhcpan4"]) + return scores_df + + +if __name__ == '__main__': + # If run directly from python, leave the user in a shell to explore results. + setup() + result = test_on_hpv() + + # Leave in ipython + import ipdb # pylint: disable=import-error + ipdb.set_trace() diff --git a/test/test_released_predictors_well_correlated.py b/test/test_released_predictors_well_correlated.py new file mode 100644 index 0000000000000000000000000000000000000000..5040843ffa76338b5dcc0f242be7a02784d1c5b2 --- /dev/null +++ b/test/test_released_predictors_well_correlated.py @@ -0,0 +1,100 @@ +""" +Test that pan-allele and allele-specific predictors are highly correlated. +""" +from __future__ import print_function +import os +import sys +import argparse +import pandas +import numpy +from sklearn.metrics import roc_auc_score +from nose.tools import eq_, assert_less, assert_greater, assert_almost_equal + +from mhcflurry import Class1AffinityPredictor +from mhcflurry.encodable_sequences import EncodableSequences +from mhcflurry.downloads import get_path +from mhcflurry.common import random_peptides + +from mhcflurry.testing_utils import cleanup, startup + +PREDICTORS = None + + +def setup(): + global PREDICTORS + startup() + PREDICTORS = { + 'allele-specific': Class1AffinityPredictor.load( + get_path("models_class1", "models")), + 'pan-allele': Class1AffinityPredictor.load( + get_path("models_class1_pan", "models.with_mass_spec")) + } + + +def teardown(): + global PREDICTORS + PREDICTORS = None + cleanup() + + +def test_correlation( + alleles=None, + num_peptides_per_length=100, + lengths=[8, 9, 10], + debug=False): + peptides = [] + for length in lengths: + peptides.extend(random_peptides(num_peptides_per_length, length)) + + # Cache encodings + peptides = EncodableSequences.create(list(set(peptides))) + + if alleles is None: + alleles = set.intersection(*[ + set(predictor.supported_alleles) for predictor in PREDICTORS.values() + ]) + alleles = sorted(set(alleles)) + df = pandas.DataFrame(index=peptides.sequences) + + results_df = [] + for allele in alleles: + for (name, predictor) in PREDICTORS.items(): + df[name] = predictor.predict(peptides, allele=allele) + correlation = numpy.corrcoef( + numpy.log10(df["allele-specific"]), + numpy.log10(df["pan-allele"]))[0, 1] + results_df.append((allele, correlation)) + print(len(results_df), len(alleles), *results_df[-1]) + + if correlation < 0.6: + print("Warning: low correlation", allele) + df["tightest"] = df.min(1) + print(df.sort_values("tightest").iloc[:, :-1]) + if debug: + import ipdb ; ipdb.set_trace() + del df["tightest"] + + results_df = pandas.DataFrame(results_df, columns=["allele", "correlation"]) + print(results_df) + + assert_greater(results_df.correlation.mean(), 0.70) + + return results_df + + +parser = argparse.ArgumentParser(usage=__doc__) +parser.add_argument( + "--alleles", + nargs="+", + default=None, + help="Which alleles to test") + +if __name__ == '__main__': + # If run directly from python, leave the user in a shell to explore results. + setup() + args = parser.parse_args(sys.argv[1:]) + result = test_correlation(alleles=args.alleles, debug=True) + + # Leave in ipython + import ipdb # pylint: disable=import-error + ipdb.set_trace() diff --git a/test/test_speed.py b/test/test_speed.py index 79d7ab642c6ddd3b059867143252013ebcf948cb..037ae61c637a34f70d1e33eb5f382587107537c0 100644 --- a/test/test_speed.py +++ b/test/test_speed.py @@ -1,25 +1,58 @@ +""" +Profile prediction speed + +""" import numpy numpy.random.seed(0) import time import cProfile import pstats import collections +import argparse +import sys import pandas from mhcflurry import Class1AffinityPredictor from mhcflurry.encodable_sequences import EncodableSequences from mhcflurry.common import random_peptides +from mhcflurry.downloads import get_path + +from mhcflurry.testing_utils import cleanup, startup + + +ALLELE_SPECIFIC_PREDICTOR = None +PAN_ALLELE_PREDICTOR = None + + +def setup(): + global ALLELE_SPECIFIC_PREDICTOR, PAN_ALLELE_PREDICTOR + startup() + ALLELE_SPECIFIC_PREDICTOR = Class1AffinityPredictor.load( + get_path("models_class1", "models")) -DOWNLOADED_PREDICTOR = Class1AffinityPredictor.load() + PAN_ALLELE_PREDICTOR = Class1AffinityPredictor.load( + get_path("models_class1_pan", "models.with_mass_spec")) -NUM = 10000 -def test_speed(profile=False): +def teardown(): + global ALLELE_SPECIFIC_PREDICTOR, PAN_ALLELE_PREDICTOR + ALLELE_SPECIFIC_PREDICTOR = None + PAN_ALLELE_PREDICTOR = None + cleanup() + + +DEFAULT_NUM_PREDICTIONS = 10000 + + +def test_speed_allele_specific(profile=False, num=DEFAULT_NUM_PREDICTIONS): + global ALLELE_SPECIFIC_PREDICTOR starts = collections.OrderedDict() timings = collections.OrderedDict() profilers = collections.OrderedDict() + predictor = ALLELE_SPECIFIC_PREDICTOR + def start(name): starts[name] = time.time() if profile: @@ -31,15 +64,14 @@ def test_speed(profile=False): if profile: profilers[name].disable() - start("first") - DOWNLOADED_PREDICTOR.predict(["SIINFEKL"], allele="HLA-A*02:01") + predictor.predict(["SIINFEKL"], allele="HLA-A*02:01") end("first") - peptides = random_peptides(NUM) - start("pred_%d" % NUM) - DOWNLOADED_PREDICTOR.predict(peptides, allele="HLA-A*02:01") - end("pred_%d" % NUM) + peptides = random_peptides(num) + start("pred_%d" % num) + predictor.predict(peptides, allele="HLA-A*02:01") + end("pred_%d" % num) NUM2 = 10000 peptides = EncodableSequences.create(random_peptides(NUM2, length=13)) @@ -48,13 +80,13 @@ def test_speed(profile=False): end("encode_blosum_%d" % NUM2) start("pred_already_encoded_%d" % NUM2) - DOWNLOADED_PREDICTOR.predict(peptides, allele="HLA-A*02:01") + predictor.predict(peptides, allele="HLA-A*02:01") end("pred_already_encoded_%d" % NUM2) NUM_REPEATS = 100 start("pred_already_encoded_%d_%d_times" % (NUM2, NUM_REPEATS)) for _ in range(NUM_REPEATS): - DOWNLOADED_PREDICTOR.predict(peptides, allele="HLA-A*02:01") + predictor.predict(peptides, allele="HLA-A*02:01") end("pred_already_encoded_%d_%d_times" % (NUM2, NUM_REPEATS)) print("SPEED BENCHMARK") @@ -64,12 +96,77 @@ def test_speed(profile=False): (key, pstats.Stats(value)) for (key, value) in profilers.items()) +def test_speed_pan_allele(profile=False, num=DEFAULT_NUM_PREDICTIONS): + global PAN_ALLELE_PREDICTOR + starts = collections.OrderedDict() + timings = collections.OrderedDict() + profilers = collections.OrderedDict() + + predictor = PAN_ALLELE_PREDICTOR + + def start(name): + starts[name] = time.time() + if profile: + profilers[name] = cProfile.Profile() + profilers[name].enable() + + def end(name): + timings[name] = time.time() - starts[name] + if profile: + profilers[name].disable() + + start("first") + predictor.predict(["SIINFEKL"], allele="HLA-A*02:01") + end("first") + + peptides = random_peptides(num) + start("pred_%d" % num) + predictor.predict(peptides, allele="HLA-A*02:01") + end("pred_%d" % num) + + print("SPEED BENCHMARK") + print("Results:\n%s" % str(pandas.Series(timings))) + + return dict( + (key, pstats.Stats(value)) for (key, value) in profilers.items()) + + +parser = argparse.ArgumentParser(usage=__doc__) +parser.add_argument( + "--predictor", + nargs="+", + choices=["allele-specific", "pan-allele"], + default=["allele-specific", "pan-allele"], + help="Which predictors to run") + +parser.add_argument( + "--num-predictions", + type=int, + default=DEFAULT_NUM_PREDICTIONS, + help="Number of predictions to run") + if __name__ == '__main__': # If run directly from python, do profiling and leave the user in a shell # to explore results. - result = test_speed(profile=True) - result["pred_%d" % NUM].sort_stats("cumtime").reverse_order().print_stats() + args = parser.parse_args(sys.argv[1:]) + setup() + + if "allele-specific" in args.predictor: + print("Running allele-specific test") + result = test_speed_allele_specific( + profile=True, num=args.num_predictions) + result[ + "pred_%d" % args.num_predictions + ].sort_stats("cumtime").reverse_order().print_stats() + + if "pan-allele" in args.predictor: + print("Running pan-allele test") + result = test_speed_pan_allele( + profile=True, num=args.num_predictions) + result[ + "pred_%d" % args.num_predictions + ].sort_stats("cumtime").reverse_order().print_stats() # Leave in ipython locals().update(result) diff --git a/test/test_train_and_related_commands.py b/test/test_train_and_related_commands.py index 197ade0d28463f9dffc539dcf2705a3a17366a84..92efbdbda6bf56fc580adf8c70b037c1d5a04086 100644 --- a/test/test_train_and_related_commands.py +++ b/test/test_train_and_related_commands.py @@ -14,6 +14,12 @@ from numpy.testing import assert_array_less, assert_equal from mhcflurry import Class1AffinityPredictor from mhcflurry.downloads import get_path +from mhcflurry.testing_utils import cleanup, startup +teardown = cleanup +setup = startup + +os.environ["CUDA_VISIBLE_DEVICES"] = "" + HYPERPARAMETERS = [ { "n_models": 2, diff --git a/test/test_train_pan_allele_models_command.py b/test/test_train_pan_allele_models_command.py new file mode 100644 index 0000000000000000000000000000000000000000..53c5bb254de227e455aa598fd35182e5e19901eb --- /dev/null +++ b/test/test_train_pan_allele_models_command.py @@ -0,0 +1,169 @@ +""" +Tests for training and predicting using Class1 pan-allele models. +""" + +import json +import os +import shutil +import tempfile +import subprocess + +import pandas + +from numpy.testing import assert_equal, assert_array_less + +from mhcflurry import Class1AffinityPredictor,Class1NeuralNetwork +from mhcflurry.downloads import get_path + +from mhcflurry.testing_utils import cleanup, startup +teardown = cleanup +setup = startup + +os.environ["CUDA_VISIBLE_DEVICES"] = "" + + +HYPERPARAMETERS_LIST = [ +{ + 'activation': 'tanh', + 'allele_dense_layer_sizes': [], + 'batch_normalization': False, + 'dense_layer_l1_regularization': 0.0, + 'dense_layer_l2_regularization': 0.0, + 'dropout_probability': 0.5, + 'early_stopping': True, + 'init': 'glorot_uniform', + 'layer_sizes': [64], + 'learning_rate': None, + 'locally_connected_layers': [], + 'loss': 'custom:mse_with_inequalities', + 'max_epochs': 5, + 'minibatch_size': 256, + 'optimizer': 'rmsprop', + 'output_activation': 'sigmoid', + 'patience': 10, + 'peptide_allele_merge_activation': '', + 'peptide_allele_merge_method': 'concatenate', + 'peptide_amino_acid_encoding': 'BLOSUM62', + 'peptide_dense_layer_sizes': [], + 'peptide_encoding': { + 'alignment_method': 'left_pad_centered_right_pad', + 'max_length': 15, + 'vector_encoding_name': 'BLOSUM62', + }, + 'random_negative_affinity_max': 50000.0, + 'random_negative_affinity_min': 20000.0, + 'random_negative_constant': 25, + 'random_negative_distribution_smoothing': 0.0, + 'random_negative_match_distribution': True, + 'random_negative_rate': 0.2, + 'train_data': {"pretrain": False}, + 'validation_split': 0.1, +}, +{ + 'activation': 'tanh', + 'allele_dense_layer_sizes': [], + 'batch_normalization': False, + 'dense_layer_l1_regularization': 0.0, + 'dense_layer_l2_regularization': 0.0, + 'dropout_probability': 0.5, + 'early_stopping': True, + 'init': 'glorot_uniform', + 'layer_sizes': [32], + 'learning_rate': None, + 'locally_connected_layers': [], + 'loss': 'custom:mse_with_inequalities', + 'max_epochs': 5, + 'minibatch_size': 256, + 'optimizer': 'rmsprop', + 'output_activation': 'sigmoid', + 'patience': 10, + 'peptide_allele_merge_activation': '', + 'peptide_allele_merge_method': 'concatenate', + 'peptide_amino_acid_encoding': 'BLOSUM62', + 'peptide_dense_layer_sizes': [], + 'peptide_encoding': { + 'alignment_method': 'left_pad_centered_right_pad', + 'max_length': 15, + 'vector_encoding_name': 'BLOSUM62', + }, + 'random_negative_affinity_max': 50000.0, + 'random_negative_affinity_min': 20000.0, + 'random_negative_constant': 25, + 'random_negative_distribution_smoothing': 0.0, + 'random_negative_match_distribution': True, + 'random_negative_rate': 0.2, + 'train_data': { + "pretrain": False, + 'pretrain_peptides_per_epoch': 128, + 'pretrain_max_epochs': 2, + 'pretrain_max_val_loss': 0.2, + }, + 'validation_split': 0.1, +}, +][1:] + + +def run_and_check(n_jobs=0, delete=True, additional_args=[]): + models_dir = tempfile.mkdtemp(prefix="mhcflurry-test-models") + hyperparameters_filename = os.path.join( + models_dir, "hyperparameters.yaml") + with open(hyperparameters_filename, "w") as fd: + json.dump(HYPERPARAMETERS_LIST, fd) + + data_df = pandas.read_csv( + get_path("data_curated", "curated_training_data.no_mass_spec.csv.bz2")) + selected_data_df = data_df.loc[data_df.allele.str.startswith("HLA-A")] + selected_data_df.to_csv( + os.path.join(models_dir, "train_data.csv"), index=False) + + args = [ + "mhcflurry-class1-train-pan-allele-models", + "--data", os.path.join(models_dir, "train_data.csv"), + "--allele-sequences", get_path("allele_sequences", "allele_sequences.csv"), + "--hyperparameters", hyperparameters_filename, + "--out-models-dir", models_dir, + "--num-jobs", str(n_jobs), + "--ensemble-size", "2", + "--verbosity", "1", + # "--pretrain-data", get_path( + # "random_peptide_predictions", "predictions.csv.bz2"), + ] + additional_args + print("Running with args: %s" % args) + subprocess.check_call(args) + + result = Class1AffinityPredictor.load(models_dir) + predictions = result.predict( + peptides=["SLYNTVATL"], + alleles=["HLA-A*02:01"]) + assert_equal(predictions.shape, (1,)) + assert_array_less(predictions, 1000) + df = result.predict_to_dataframe( + peptides=["SLYNTVATL"], + alleles=["HLA-A*02:01"]) + print(df) + + if delete: + print("Deleting: %s" % models_dir) + shutil.rmtree(models_dir) + + +if os.environ.get("KERAS_BACKEND") != "theano": + def test_run_parallel(): + run_and_check(n_jobs=1) + run_and_check(n_jobs=2) + + +def test_run_serial(): + run_and_check(n_jobs=0) + + +def test_run_cluster_parallelism(): + run_and_check(n_jobs=0, additional_args=[ + '--cluster-parallelism', + '--cluster-results-workdir', '/tmp/' + ]) + + +if __name__ == "__main__": + # run_and_check(n_jobs=0, delete=False) + test_run_cluster_parallelism()