# HG changeset patch
# User galaxyp
# Date 1752065790 0
# Node ID 88e44dab298887176dce9a26617036725e702eab
planemo upload for repository https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/iedb_netmhcpan commit 0ac7534c8d9f5bfea21b998286f822784e62da08
diff -r 000000000000 -r 88e44dab2988 netmhciipan.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/netmhciipan.xml Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,104 @@
+
+ MHCii Binding prediction
+
+ netmhciipan_alleles_macros.xml
+ shared_macros.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r 88e44dab2988 netmhciipan_alleles_macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/netmhciipan_alleles_macros.xml Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,773 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r 88e44dab2988 netmhcpan.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/netmhcpan.xml Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,88 @@
+
+ MHC Binding prediction
+
+ netmhcpan_alleles_macros.xml
+ shared_macros.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r 88e44dab2988 netmhcpan_alleles_macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/netmhcpan_alleles_macros.xml Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,11490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r 88e44dab2988 nextgen_iedb_api.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nextgen_iedb_api.py Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,372 @@
+#!/usr/bin/env python
+
+"""
+This file was adapted from the iedb_apy.py file of the iedb_api tool.
+It uses the newer "Next-Generation" IEDB API, and is constrained to
+the mhci and mhcii tool groups.
+"""
+
+import argparse
+import json
+import os.path
+import re
+import sys
+import time
+import urllib.request
+from urllib.error import HTTPError
+
+# IEDB tool groups and predictor methods
+mhci_methods = ['netmhcpan_el', 'netmhcpan_ba']
+mhcii_methods = ['netmhciipan_el', 'netmhciipan_ba']
+tool_group_methods = {'mhci': mhci_methods,
+ 'mhcii': mhcii_methods}
+all_methods = set(mhci_methods + mhcii_methods)
+
+# Values for polling backoff
+max_backoff_count = 25
+init_poll_sleep = 10
+poll_retries = 50
+requests_before_backoff = 5
+
+
+def parse_alleles(allelefile):
+ """Returns a dictionary with alleles from input file."""
+ alleles = []
+ with open(allelefile, 'r') as fh:
+ for line in fh:
+ allele = line.strip()
+ alleles.append(allele)
+ return alleles
+
+
+def parse_sequence_column(sequence_file_lines, col):
+ """Sequences may come from a specific column in a TSV file.
+
+ Parse these sequences out while checking each against a regex for validity.
+ """
+ aapat = '^[ABCDEFGHIKLMNPQRSTVWY]+$'
+ sequences = []
+ for i, line in enumerate(sequence_file_lines):
+ fields = line.split('\t')
+ if len(fields) > col:
+ seq = re.sub('[_*]', '', fields[col].strip())
+ if not re.match(aapat, seq):
+ warn_err(f'Line {i}, Not a peptide: {seq}')
+ else:
+ sequences.append(seq)
+ else:
+ warn_err('Invalid value for -c/--column')
+ break
+ return sequences
+
+
+def iedb_request(req, timeout, retries, error_retry_sleep, response_fn=None, req_data=None):
+ """Handles HTTP request and exceptions. Allows for a callback to parse IEDB response."""
+ for retry in range(1, retries + 1):
+ response = None
+ try:
+ response = urllib.request.urlopen(req, req_data, timeout=timeout)
+ except HTTPError as e:
+ warn_err(f'{retry} of {retries} Error connecting to IEDB server. \
+ HTTP status code: {e.code}')
+ time.sleep(error_retry_sleep)
+ except Exception as e:
+ warn_err(f'Error getting results from IEDB server: {e}')
+ return None
+
+ if response and response.getcode() == 200:
+ # If no callback, return results
+ if not response_fn:
+ response_string = response.read().decode('utf-8')
+ response_json = json.loads(response_string)
+ return response_json
+
+ # Retry if response_fn callback deems necessary, i.e. results from job are not ready.
+ response_json = response_fn(response, retry)
+ if response_json:
+ return response_json
+ else:
+ code = response.getcode() if response else 1
+ warn_err(f'Error connecting to IEDB server. HTTP status code: {code}')
+
+ warn_err(f'No successful response from IEDB in {retries} retries')
+ return None
+
+
+def pipeline_request(url, tool_group, sequence_text, alleles, length_range,
+ methods, peptide_shift, timeout=300, retries=3, error_retry_sleep=300):
+ """Submits job to IEDB pipeline and polls API until results are ready.
+
+ Returns response JSON from IEDB.
+ """
+
+ # Set up input parameters for IEDB NetMHCPan or NetMHCIIPan job
+ input_parameters = {
+ 'alleles': alleles,
+ 'peptide_length_range': length_range,
+ 'predictors': [{'type': 'binding', 'method': m} for m in methods],
+ 'peptide_shift': peptide_shift
+ }
+
+ if peptide_shift:
+ input_parameters['peptide_shift'] = peptide_shift
+
+ stage = {
+ 'stage_number': 1,
+ 'tool_group': tool_group,
+ 'input_sequence_text': sequence_text,
+ 'input_parameters': input_parameters
+ }
+
+ params = {
+ 'pipeline_id': "",
+ 'run_stage_range': [1, 1],
+ 'stages': [stage]
+ }
+
+ req = urllib.request.Request(url, method='POST')
+ req_data = json.dumps(params).encode('utf-8')
+ req.add_header('Content-Type', 'application/json; charset=utf-8')
+ req.add_header('Content-Length', len(req_data))
+
+ # Make an initial request to submit job
+ response_json = iedb_request(req, timeout, retries, error_retry_sleep, req_data=req_data)
+ if not response_json:
+ warn_err('Initial request failed.')
+ return None
+
+ # Check response from job submission
+ warnings = response_json.get('warnings')
+ if warnings and len(warnings) > 0:
+ invalid_alleles = False
+ for warning in warnings:
+ if 'cannot predict binding for allele' in warning:
+ warn_err(f"Error: Bad allelle input. {warning}")
+ invalid_alleles = True
+ if invalid_alleles:
+ return None
+
+ warn_err(f'Warnings from IEDB: {warnings}')
+
+ errors = response_json.get('errors')
+ if errors:
+ warn_err(f'Errors from IEDB: {errors}')
+ return None
+
+ results_uri = response_json.get('results_uri')
+ if not results_uri:
+ warn_err('No results URI provided from IEDB.')
+ return None
+
+ # Callback function to rate-limit poll requests
+ def poll_response_fn(response, retry):
+ response_string = response.read().decode('utf-8')
+ response_json = json.loads(response_string)
+ if response_json['status'] != 'done':
+ if retry == poll_retries:
+ warn_err('Job not finished in maximum allowed time.')
+ backoff_count = min(retry, max_backoff_count)
+
+ # Double sleep every requests_before_backoff requests
+ sleep_duration = init_poll_sleep * 2 ** (backoff_count // requests_before_backoff)
+ time.sleep(sleep_duration)
+ return None
+ return response_json
+
+ # Submit polling for results
+ response_json = iedb_request(results_uri, timeout, poll_retries,
+ error_retry_sleep, response_fn=poll_response_fn)
+ if not response_json:
+ warn_err('Retrieving results failed.')
+ return response_json
+
+
+def warn_err(msg, exit_code=None):
+ sys.stderr.write(f"{msg}\n")
+ sys.stderr.flush()
+ if exit_code:
+ sys.exit(exit_code)
+
+
+def add_reversed_sequences(file_lines, file_format):
+ """Adds a reversed sequence after each input sequence.
+
+ Takes a plain list of sequences, or FASTA file. Each reversed FASTA sequence has
+ the same header prefixed with 'reversed_'.
+ """
+ sequences_with_reversed = []
+ if file_format == 'fasta':
+ i = 0
+ while i < len(file_lines):
+
+ # Validate header from next sequence
+ seq_header = file_lines[i]
+ if seq_header[0] != '>':
+ print('Invalid FASTA. Exiting.', file=sys.stderr)
+ sys.exit(1)
+
+ # Aggregate sequence into a single line
+ j = i + 1
+ seq = ''
+ while j < len(file_lines):
+ next_line = file_lines[j]
+ if next_line[0] == '>':
+ break
+ seq = seq + file_lines[j]
+ j += 1
+
+ # Add non-reversed sequence
+ sequences_with_reversed.append(seq_header)
+ sequences_with_reversed.append(seq)
+
+ # Add reversed header and sequence
+ rev_header = seq_header.replace('>', '>reversed_')
+ sequences_with_reversed.append(rev_header)
+
+ rev_seq = seq[::-1]
+ sequences_with_reversed.append(rev_seq)
+
+ # Advance index to what should be the next sequence header
+ i = j
+
+ # If not FASTA, should be a simple list of peptides to reverse sequentially
+ else:
+ for seq in file_lines:
+
+ # Reverse seq
+ rev_seq = f'{seq[::-1]}'
+
+ # Add original and reversed sequences
+ sequences_with_reversed.append(seq)
+ sequences_with_reversed.append(rev_seq)
+
+ return sequences_with_reversed
+
+
+def __main__():
+ # Parse Command Line
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-T', '--tool-group',
+ dest='tool_group',
+ default='mhci',
+ choices=tool_group_methods.keys(),
+ help='IEDB API Tool Group')
+ parser.add_argument('-m', '--method',
+ action="append",
+ required=True,
+ choices=all_methods,
+ help='prediction method')
+ parser.add_argument('-A', '--allelefile',
+ required=True,
+ help='File of HLA alleles')
+ parser.add_argument('-l', '--lengthrange',
+ help='length range for which to make predictions for alleles')
+ parser.add_argument('-P', '--peptide_shift',
+ type=int,
+ default=None,
+ help='Peptide Shift')
+ parser.add_argument('-i', '--input',
+ required=True,
+ help='Input file for peptide sequences '
+ + '(fasta or tabular)')
+ parser.add_argument('-c', '--column',
+ default=None,
+ help='Zero-indexed peptide column in a tabular input file')
+ parser.add_argument('-o', '--output',
+ required=True,
+ help='Output file for query results')
+ parser.add_argument('-t', '--timeout',
+ type=int,
+ default=600,
+ help='Seconds to wait for server response')
+ parser.add_argument('-r', '--retries',
+ type=int,
+ default=5,
+ help='Number of times to retry failed server query')
+ parser.add_argument('-S', '--sleep',
+ type=int,
+ default=300,
+ help='Seconds to wait between failed server query retries')
+ parser.add_argument('-R', '--add-reversed',
+ dest='add_reversed',
+ action='store_true',
+ help='Input has every other sequence reversed. Identify in output.')
+ args = parser.parse_args()
+
+ allele_string = ','.join(parse_alleles(args.allelefile))
+
+ length_range = [int(i) for i in args.lengthrange.split(',')]
+
+ pipeline_url = 'https://api-nextgen-tools.iedb.org/api/v1/pipeline'
+
+ # If sequences submitted as a file, parse out sequences.
+ try:
+ with open(args.input) as inf:
+ sequence_file_contents = inf.read()
+ except Exception as e:
+ warn_err(f'Unable to open input file: {e}', exit_code=1)
+
+ sequence_file_lines = sequence_file_contents.splitlines()
+
+ # Pick out sequences if input file has multiple columns,
+ # otherwise submit list of sequences as-is.
+ if not args.column:
+ # IEDB may take FASTA files directly, so input contents as-is
+ if args.add_reversed:
+ sequence_text = '\n'.join(add_reversed_sequences(sequence_file_lines, 'fasta'))
+ else:
+ sequence_text = sequence_file_contents
+ else:
+ sequences = parse_sequence_column(sequence_file_lines, int(args.column))
+ if args.add_reversed:
+ sequence_text = '\n'.join(add_reversed_sequences(sequences, 'tsv'))
+ else:
+ sequence_text = '\n'.join(sequences)
+
+ if len(sequence_text) == 0:
+ warn_err('Error parsing sequences', exit_code=1)
+
+ # Submit job and return results
+ results = pipeline_request(pipeline_url, args.tool_group, sequence_text,
+ allele_string, length_range, args.method,
+ peptide_shift=args.peptide_shift, timeout=args.timeout,
+ retries=args.retries, error_retry_sleep=args.sleep)
+ if not results:
+ warn_err('Job failed. Exiting.', exit_code=1)
+
+ try:
+ peptide_table = [t for t in results['data']['results'] if t['type'] == 'peptide_table'][0]
+ peptide_table_data = peptide_table['table_data']
+ peptide_table_columns = peptide_table['table_columns']
+
+ # If we reversed peptides prior to IEDB input,
+ # find column index of sequence number so we can identify which come from reversed input.
+ if args.add_reversed:
+ for i, column in enumerate(peptide_table_columns):
+ if column['display_name'] == 'seq #':
+ seq_num_index = i
+ break
+ except (KeyError, IndexError) as e:
+ warn_err(f'Error parsing IEDB results: {e}', exit_code=1)
+
+ output_path = os.path.abspath(args.output)
+ with open(output_path, 'w') as output_file:
+ # Write column names
+ display_names = '\t'.join([c['display_name'] for c in peptide_table_columns] + ['reversed'])
+ print(display_names, file=output_file)
+
+ # Write data
+ for values in peptide_table_data:
+ if args.add_reversed:
+ seq_number = values[seq_num_index]
+ # Every original input sequence is followed by its reversed sequence,
+ # so we know even sequence numbers are reversed.
+ reversed_val = str(seq_number % 2 == 0).lower()
+ else:
+ reversed_val = 'false'
+ values = '\t'.join([str(v) for v in values] + [reversed_val])
+ print(values, file=output_file)
+
+
+if __name__ == "__main__":
+ __main__()
diff -r 000000000000 -r 88e44dab2988 shared_macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/shared_macros.xml Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,70 @@
+
+
+ python
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The dataset should have one allele per line. The allele may be followed by an optional comma-separated list of peptide lengths, e.g.: @HLALEN_EXAMPLES@
+
+
+
+
+ Enter alleles separated by white space: @HLA_EXAMPLES@ (The peptide lengths may follow each allele: @HLALEN_EXAMPLES@)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10.1093/nar/gku938
+ 10.1093/nar/gkaa379
+
+
diff -r 000000000000 -r 88e44dab2988 test-data/netmhciipan_alleles.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/netmhciipan_alleles.txt Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,2 @@
+HLA-DQA1*03:01/DQB1*06:02
+HLA-DQA1*03:01/DQB1*06:04
diff -r 000000000000 -r 88e44dab2988 test-data/netmhcpan_alleles.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/netmhcpan_alleles.txt Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,2 @@
+HLA-A*01:01
+HLA-A*03:01
diff -r 000000000000 -r 88e44dab2988 test-data/outputs/netmhciipan_output_1.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/outputs/netmhciipan_output_1.tsv Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,25 @@
+seq # peptide start end peptide length allele peptide index median binding percentile netmhciipan_ba core netmhciipan_ba IC50 netmhciipan_ba percentile netmhciipan_el core netmhciipan_el score netmhciipan_el percentile reversed
+1 SLYNTVATLYCVH 1 13 13 HLA-DQA1*03:01/DQB1*06:02 1 18.5 YNTVATLYC 8082.94 13.0 YNTVATLYC 0.001374 24.0 false
+1 SLYNTVATLYCVH 1 13 13 HLA-DQA1*03:01/DQB1*06:04 1 32.0 YNTVATLYC 7720.59 26.0 YNTVATLYC 0.004061 38.0 false
+1 SLYNTVATLYCVHQ 1 14 14 HLA-DQA1*03:01/DQB1*06:02 3 21.0 YNTVATLYC 6032.08 16.0 YNTVATLYC 0.001854 26.0 false
+1 SLYNTVATLYCVHQ 1 14 14 HLA-DQA1*03:01/DQB1*06:04 3 34.0 YNTVATLYC 6352.6 32.0 YNTVATLYC 0.005576 36.0 false
+1 SLYNTVATLYCVHQR 1 15 15 HLA-DQA1*03:01/DQB1*06:02 4 19.5 YNTVATLYC 3830.59 14.0 YNTVATLYC 0.002354 25.0 false
+1 SLYNTVATLYCVHQR 1 15 15 HLA-DQA1*03:01/DQB1*06:04 4 31.5 VATLYCVHQ 4927.74 32.0 VATLYCVHQ 0.007091 31.0 false
+1 SLYNTVATLYCVHQRI 1 16 16 HLA-DQA1*03:01/DQB1*06:02 5 25.5 YNTVATLYC 3666.24 17.0 YNTVATLYC 0.00171 34.0 false
+1 SLYNTVATLYCVHQRI 1 16 16 HLA-DQA1*03:01/DQB1*06:04 5 44.5 VATLYCVHQ 4943.12 45.0 VATLYCVHQ 0.004566 44.0 false
+1 SLYNTVATLYCVHQRID 1 17 17 HLA-DQA1*03:01/DQB1*06:02 6 22.5 VATLYCVHQ 4336.07 20.0 VATLYCVHQ 0.001963 25.0 false
+1 SLYNTVATLYCVHQRID 1 17 17 HLA-DQA1*03:01/DQB1*06:04 6 39.0 VATLYCVHQ 5360.51 44.0 VATLYCVHQ 0.005333 34.0 false
+1 VATLYCVHQRIDV 6 18 13 HLA-DQA1*03:01/DQB1*06:02 2 72.0 LYCVHQRID 14712.63 60.0 LYCVHQRID 0.000202 84.0 false
+1 VATLYCVHQRIDV 6 18 13 HLA-DQA1*03:01/DQB1*06:04 2 65.5 LYCVHQRID 11515.73 59.0 LYCVHQRID 0.001467 72.0 false
+2 HVCYLTAVTNYLS 6 18 13 HLA-DQA1*03:01/DQB1*06:02 8 15.0 YLTAVTNYL 7853.97 12.0 YLTAVTNYL 0.001703 18.0 true
+2 HVCYLTAVTNYLS 6 18 13 HLA-DQA1*03:01/DQB1*06:04 8 11.15 YLTAVTNYL 5688.82 9.3 YLTAVTNYL 0.010944 13.0 true
+2 VDIRQHVCYLTAV 1 13 13 HLA-DQA1*03:01/DQB1*06:02 7 44.0 IRQHVCYLT 10896.32 32.0 IRQHVCYLT 0.000492 56.0 true
+2 VDIRQHVCYLTAV 1 13 13 HLA-DQA1*03:01/DQB1*06:04 7 56.0 IRQHVCYLT 10651.18 52.0 IRQHVCYLT 0.002092 60.0 true
+2 VDIRQHVCYLTAVT 1 14 14 HLA-DQA1*03:01/DQB1*06:02 9 45.5 IRQHVCYLT 8659.78 40.0 IRQHVCYLT 0.000878 51.0 true
+2 VDIRQHVCYLTAVT 1 14 14 HLA-DQA1*03:01/DQB1*06:04 9 59.0 QHVCYLTAV 9572.05 64.0 QHVCYLTAV 0.003219 54.0 true
+2 VDIRQHVCYLTAVTN 1 15 15 HLA-DQA1*03:01/DQB1*06:02 10 48.5 IRQHVCYLT 5717.95 35.0 IRQHVCYLT 0.000782 62.0 true
+2 VDIRQHVCYLTAVTN 1 15 15 HLA-DQA1*03:01/DQB1*06:04 10 59.0 QHVCYLTAV 6906.02 57.0 QHVCYLTAV 0.00294 61.0 true
+2 VDIRQHVCYLTAVTNY 1 16 16 HLA-DQA1*03:01/DQB1*06:02 11 53.5 IRQHVCYLT 5105.82 35.0 IRQHVCYLT 0.000575 72.0 true
+2 VDIRQHVCYLTAVTNY 1 16 16 HLA-DQA1*03:01/DQB1*06:04 11 59.5 QHVCYLTAV 5676.77 54.0 QHVCYLTAV 0.002639 65.0 true
+2 VDIRQHVCYLTAVTNYL 1 17 17 HLA-DQA1*03:01/DQB1*06:02 12 49.5 IRQHVCYLT 5050.71 29.0 IRQHVCYLT 0.000575 70.0 true
+2 VDIRQHVCYLTAVTNYL 1 17 17 HLA-DQA1*03:01/DQB1*06:04 12 43.5 YLTAVTNYL 4691.63 34.0 YLTAVTNYL 0.003269 53.0 true
diff -r 000000000000 -r 88e44dab2988 test-data/outputs/netmhciipan_output_2.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/outputs/netmhciipan_output_2.tsv Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,45 @@
+seq # peptide start end peptide length allele peptide index median binding percentile netmhciipan_el core netmhciipan_el score netmhciipan_el percentile reversed
+1 GHAHKVPRRLLKA 1 13 13 HLA-DQA1*03:01/DQB1*06:02 1 90.0 HAHKVPRRL 0.000154 90.0 false
+1 GHAHKVPRRLLKA 1 13 13 HLA-DQA1*03:01/DQB1*06:04 1 92.0 AHKVPRRLL 0.000616 92.0 false
+1 GHAHKVPRRLLKAA 1 14 14 HLA-DQA1*03:01/DQB1*06:02 2 91.0 KVPRRLLKA 0.000214 91.0 false
+1 GHAHKVPRRLLKAA 1 14 14 HLA-DQA1*03:01/DQB1*06:04 2 97.0 KVPRRLLKA 0.000538 97.0 false
+1 GHAHKVPRRLLKAAR 1 15 15 HLA-DQA1*03:01/DQB1*06:02 3 90.0 KVPRRLLKA 0.000294 90.0 false
+1 GHAHKVPRRLLKAAR 1 15 15 HLA-DQA1*03:01/DQB1*06:04 3 98.0 KVPRRLLKA 0.000465 98.0 false
+2 RAAKLLRRPVKHA 1 13 13 HLA-DQA1*03:01/DQB1*06:02 4 96.0 LLRRPVKHA 0.0001 96.0 true
+2 RAAKLLRRPVKHA 1 13 13 HLA-DQA1*03:01/DQB1*06:04 4 96.0 AAKLLRRPV 0.00044 96.0 true
+2 RAAKLLRRPVKHAH 1 14 14 HLA-DQA1*03:01/DQB1*06:02 5 93.0 LLRRPVKHA 0.000194 93.0 true
+2 RAAKLLRRPVKHAH 1 14 14 HLA-DQA1*03:01/DQB1*06:04 5 97.0 LLRRPVKHA 0.000513 97.0 true
+2 RAAKLLRRPVKHAHG 1 15 15 HLA-DQA1*03:01/DQB1*06:02 6 88.0 KLLRRPVKH 0.000321 88.0 true
+2 RAAKLLRRPVKHAHG 1 15 15 HLA-DQA1*03:01/DQB1*06:04 6 98.0 LLRRPVKHA 0.000466 98.0 true
+3 ASADADGSGSGSG 6 18 13 HLA-DQA1*03:01/DQB1*06:02 8 66.0 ADGSGSGSG 0.000379 66.0 false
+3 ASADADGSGSGSG 6 18 13 HLA-DQA1*03:01/DQB1*06:04 8 87.0 ADADGSGSG 0.000808 87.0 false
+3 ASADADGSGSGSGS 6 19 14 HLA-DQA1*03:01/DQB1*06:02 10 69.0 ADGSGSGSG 0.000512 69.0 false
+3 ASADADGSGSGSGS 6 19 14 HLA-DQA1*03:01/DQB1*06:04 10 93.0 ADADGSGSG 0.000781 93.0 false
+3 ASADADGSGSGSGSG 6 20 15 HLA-DQA1*03:01/DQB1*06:02 12 76.0 ADGSGSGSG 0.00052 76.0 false
+3 ASADADGSGSGSGSG 6 20 15 HLA-DQA1*03:01/DQB1*06:04 12 94.0 ADGSGSGSG 0.000759 94.0 false
+3 LKAADASADADGS 1 13 13 HLA-DQA1*03:01/DQB1*06:02 7 18.0 AADASADAD 0.001712 18.0 false
+3 LKAADASADADGS 1 13 13 HLA-DQA1*03:01/DQB1*06:04 7 15.0 AADASADAD 0.009489 15.0 false
+3 LKAADASADADGSG 1 14 14 HLA-DQA1*03:01/DQB1*06:02 9 6.0 DASADADGS 0.005256 6.0 false
+3 LKAADASADADGSG 1 14 14 HLA-DQA1*03:01/DQB1*06:04 9 13.0 AADASADAD 0.012678 13.0 false
+3 LKAADASADADGSGS 1 15 15 HLA-DQA1*03:01/DQB1*06:02 11 6.7 DASADADGS 0.006061 6.7 false
+3 LKAADASADADGSGS 1 15 15 HLA-DQA1*03:01/DQB1*06:04 11 23.0 DASADADGS 0.009114 23.0 false
+3 LKAADASADADGSGSG 1 16 16 HLA-DQA1*03:01/DQB1*06:02 13 6.2 DASADADGS 0.005907 6.2 false
+3 LKAADASADADGSGSG 1 16 16 HLA-DQA1*03:01/DQB1*06:04 13 21.0 DASADADGS 0.009327 21.0 false
+3 LKAADASADADGSGSGS 1 17 17 HLA-DQA1*03:01/DQB1*06:02 14 14.0 DASADADGS 0.003124 14.0 false
+3 LKAADASADADGSGSGS 1 17 17 HLA-DQA1*03:01/DQB1*06:04 14 30.0 DASADADGS 0.006008 30.0 false
+4 GSGSGSGSGDADA 1 13 13 HLA-DQA1*03:01/DQB1*06:02 15 67.0 GSGSGSGDA 0.000363 67.0 true
+4 GSGSGSGSGDADA 1 13 13 HLA-DQA1*03:01/DQB1*06:04 15 57.0 GSGSGDADA 0.00229 57.0 true
+4 GSGSGSGSGDADAS 1 14 14 HLA-DQA1*03:01/DQB1*06:02 17 63.0 GSGSGDADA 0.000608 63.0 true
+4 GSGSGSGSGDADAS 1 14 14 HLA-DQA1*03:01/DQB1*06:04 17 57.0 GSGSGDADA 0.00298 57.0 true
+4 GSGSGSGSGDADASA 1 15 15 HLA-DQA1*03:01/DQB1*06:02 19 38.0 SGSGDADAS 0.001559 38.0 true
+4 GSGSGSGSGDADASA 1 15 15 HLA-DQA1*03:01/DQB1*06:04 19 49.0 SGSGDADAS 0.004142 49.0 true
+4 GSGSGSGSGDADASAD 1 16 16 HLA-DQA1*03:01/DQB1*06:02 21 24.0 SGSGDADAS 0.00233 24.0 true
+4 GSGSGSGSGDADASAD 1 16 16 HLA-DQA1*03:01/DQB1*06:04 21 39.0 SGSGDADAS 0.005232 39.0 true
+4 GSGSGSGSGDADASADA 1 17 17 HLA-DQA1*03:01/DQB1*06:02 22 23.0 SGSGDADAS 0.00208 23.0 true
+4 GSGSGSGSGDADASADA 1 17 17 HLA-DQA1*03:01/DQB1*06:04 22 39.0 SGSGDADAS 0.004697 39.0 true
+4 SGSGDADASADAA 6 18 13 HLA-DQA1*03:01/DQB1*06:02 16 36.0 DADASADAA 0.000905 36.0 true
+4 SGSGDADASADAA 6 18 13 HLA-DQA1*03:01/DQB1*06:04 16 31.0 GDADASADA 0.005035 31.0 true
+4 SGSGDADASADAAK 6 19 14 HLA-DQA1*03:01/DQB1*06:02 18 13.0 DADASADAA 0.003314 13.0 true
+4 SGSGDADASADAAK 6 19 14 HLA-DQA1*03:01/DQB1*06:04 18 22.0 DADASADAA 0.008585 22.0 true
+4 SGSGDADASADAAKL 6 20 15 HLA-DQA1*03:01/DQB1*06:02 20 17.0 DADASADAA 0.003271 17.0 true
+4 SGSGDADASADAAKL 6 20 15 HLA-DQA1*03:01/DQB1*06:04 20 24.0 DASADAAKL 0.008697 24.0 true
diff -r 000000000000 -r 88e44dab2988 test-data/outputs/netmhciipan_output_3.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/outputs/netmhciipan_output_3.tsv Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,41 @@
+seq # peptide start end peptide length allele peptide index median binding percentile netmhciipan_el core netmhciipan_el score netmhciipan_el percentile reversed
+1 GHAHKVPRRLLKA 1 13 13 HLA-DQA1*03:01/DQB1*06:02 1 90.0 HAHKVPRRL 0.000154 90.0 false
+1 GHAHKVPRRLLKA 1 13 13 HLA-DQA1*03:01/DQB1*06:04 1 92.0 AHKVPRRLL 0.000616 92.0 false
+1 GHAHKVPRRLLKAA 1 14 14 HLA-DQA1*03:01/DQB1*06:02 2 91.0 KVPRRLLKA 0.000214 91.0 false
+1 GHAHKVPRRLLKAA 1 14 14 HLA-DQA1*03:01/DQB1*06:04 2 97.0 KVPRRLLKA 0.000538 97.0 false
+1 GHAHKVPRRLLKAAR 1 15 15 HLA-DQA1*03:01/DQB1*06:02 3 90.0 KVPRRLLKA 0.000294 90.0 false
+1 GHAHKVPRRLLKAAR 1 15 15 HLA-DQA1*03:01/DQB1*06:04 3 98.0 KVPRRLLKA 0.000465 98.0 false
+2 RAAKLLRRPVKHA 1 13 13 HLA-DQA1*03:01/DQB1*06:02 4 96.0 LLRRPVKHA 0.0001 96.0 true
+2 RAAKLLRRPVKHA 1 13 13 HLA-DQA1*03:01/DQB1*06:04 4 96.0 AAKLLRRPV 0.00044 96.0 true
+2 RAAKLLRRPVKHAH 1 14 14 HLA-DQA1*03:01/DQB1*06:02 5 93.0 LLRRPVKHA 0.000194 93.0 true
+2 RAAKLLRRPVKHAH 1 14 14 HLA-DQA1*03:01/DQB1*06:04 5 97.0 LLRRPVKHA 0.000513 97.0 true
+2 RAAKLLRRPVKHAHG 1 15 15 HLA-DQA1*03:01/DQB1*06:02 6 88.0 KLLRRPVKH 0.000321 88.0 true
+2 RAAKLLRRPVKHAHG 1 15 15 HLA-DQA1*03:01/DQB1*06:04 6 98.0 LLRRPVKHA 0.000466 98.0 true
+3 LKAADASADADGS 1 13 13 HLA-DQA1*03:01/DQB1*06:02 7 18.0 AADASADAD 0.001712 18.0 false
+3 LKAADASADADGS 1 13 13 HLA-DQA1*03:01/DQB1*06:04 7 15.0 AADASADAD 0.009489 15.0 false
+3 LKAADASADADGSG 1 14 14 HLA-DQA1*03:01/DQB1*06:02 9 6.0 DASADADGS 0.005256 6.0 false
+3 LKAADASADADGSG 1 14 14 HLA-DQA1*03:01/DQB1*06:04 9 13.0 AADASADAD 0.012678 13.0 false
+3 LKAADASADADGSGS 1 15 15 HLA-DQA1*03:01/DQB1*06:02 11 6.7 DASADADGS 0.006061 6.7 false
+3 LKAADASADADGSGS 1 15 15 HLA-DQA1*03:01/DQB1*06:04 11 23.0 DASADADGS 0.009114 23.0 false
+3 LKAADASADADGSGSG 1 16 16 HLA-DQA1*03:01/DQB1*06:02 12 6.2 DASADADGS 0.005907 6.2 false
+3 LKAADASADADGSGSG 1 16 16 HLA-DQA1*03:01/DQB1*06:04 12 21.0 DASADADGS 0.009327 21.0 false
+3 LKAADASADADGSGSGS 1 17 17 HLA-DQA1*03:01/DQB1*06:02 13 14.0 DASADADGS 0.003124 14.0 false
+3 LKAADASADADGSGSGS 1 17 17 HLA-DQA1*03:01/DQB1*06:04 13 30.0 DASADADGS 0.006008 30.0 false
+3 SADADGSGSGSGS 7 19 13 HLA-DQA1*03:01/DQB1*06:02 8 64.0 ADGSGSGSG 0.000403 64.0 false
+3 SADADGSGSGSGS 7 19 13 HLA-DQA1*03:01/DQB1*06:04 8 93.0 ADGSGSGSG 0.000582 93.0 false
+3 SADADGSGSGSGSG 7 20 14 HLA-DQA1*03:01/DQB1*06:02 10 67.0 ADGSGSGSG 0.000549 67.0 false
+3 SADADGSGSGSGSG 7 20 14 HLA-DQA1*03:01/DQB1*06:04 10 93.0 ADGSGSGSG 0.000778 93.0 false
+4 GSGDADASADAAK 7 19 13 HLA-DQA1*03:01/DQB1*06:02 15 8.0 DADASADAA 0.002983 8.0 true
+4 GSGDADASADAAK 7 19 13 HLA-DQA1*03:01/DQB1*06:04 15 25.0 DADASADAA 0.006234 25.0 true
+4 GSGDADASADAAKL 7 20 14 HLA-DQA1*03:01/DQB1*06:02 17 8.0 DADASADAA 0.004474 8.0 true
+4 GSGDADASADAAKL 7 20 14 HLA-DQA1*03:01/DQB1*06:04 17 14.0 DASADAAKL 0.012547 14.0 true
+4 GSGSGSGSGDADA 1 13 13 HLA-DQA1*03:01/DQB1*06:02 14 67.0 GSGSGSGDA 0.000363 67.0 true
+4 GSGSGSGSGDADA 1 13 13 HLA-DQA1*03:01/DQB1*06:04 14 57.0 GSGSGDADA 0.00229 57.0 true
+4 GSGSGSGSGDADAS 1 14 14 HLA-DQA1*03:01/DQB1*06:02 16 63.0 GSGSGDADA 0.000608 63.0 true
+4 GSGSGSGSGDADAS 1 14 14 HLA-DQA1*03:01/DQB1*06:04 16 57.0 GSGSGDADA 0.00298 57.0 true
+4 GSGSGSGSGDADASA 1 15 15 HLA-DQA1*03:01/DQB1*06:02 18 38.0 SGSGDADAS 0.001559 38.0 true
+4 GSGSGSGSGDADASA 1 15 15 HLA-DQA1*03:01/DQB1*06:04 18 49.0 SGSGDADAS 0.004142 49.0 true
+4 GSGSGSGSGDADASAD 1 16 16 HLA-DQA1*03:01/DQB1*06:02 19 24.0 SGSGDADAS 0.00233 24.0 true
+4 GSGSGSGSGDADASAD 1 16 16 HLA-DQA1*03:01/DQB1*06:04 19 39.0 SGSGDADAS 0.005232 39.0 true
+4 GSGSGSGSGDADASADA 1 17 17 HLA-DQA1*03:01/DQB1*06:02 20 23.0 SGSGDADAS 0.00208 23.0 true
+4 GSGSGSGSGDADASADA 1 17 17 HLA-DQA1*03:01/DQB1*06:04 20 39.0 SGSGDADAS 0.004697 39.0 true
diff -r 000000000000 -r 88e44dab2988 test-data/outputs/netmhcpan_output_1.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/outputs/netmhcpan_output_1.tsv Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,23 @@
+seq # peptide start end peptide length allele peptide index median binding percentile netmhcpan_ba core netmhcpan_ba icore netmhcpan_ba IC50 netmhcpan_ba percentile netmhcpan_el core netmhcpan_el icore netmhcpan_el score netmhcpan_el percentile reversed
+1 ATLYCVHQ 7 14 8 HLA-A*01:01 7 54.0 ATLYCVHQ- ATLYCVHQ 38595.18 64.0 ATLYCVHQ- ATLYCVHQ 0.00013 44.0 false
+1 ATLYCVHQ 7 14 8 HLA-A*03:01 7 33.5 ATL-YCVHQ ATLYCVHQ 31351.02 37.0 ATL-YCVHQ ATLYCVHQ 8.7e-05 30.0 false
+1 CVHQRIDV 11 18 8 HLA-A*01:01 11 43.0 CVHQRID-V CVHQRIDV 35795.47 48.0 CVHQRID-V CVHQRIDV 0.000181 38.0 false
+1 CVHQRIDV 11 18 8 HLA-A*03:01 11 63.5 CVHQRIDV- CVHQRIDV 37646.15 63.0 CVHQRIDV- CVHQRIDV 9e-06 64.0 false
+1 LYCVHQRI 9 16 8 HLA-A*01:01 9 57.0 LYC-VHQRI LYCVHQRI 37217.26 56.0 LYC-VHQRI LYCVHQRI 6.3e-05 58.0 false
+1 LYCVHQRI 9 16 8 HLA-A*03:01 9 59.0 -LYCVHQRI LYCVHQRI 36274.66 56.0 -LYCVHQRI LYCVHQRI 1e-05 62.0 false
+1 LYNTVATL 2 9 8 HLA-A*01:01 2 41.5 LYN-TVATL LYNTVATL 36724.46 53.0 LYN-TVATL LYNTVATL 0.000283 30.0 false
+1 LYNTVATL 2 9 8 HLA-A*03:01 2 37.0 -LYNTVATL LYNTVATL 32799.34 42.0 -LYNTVATL LYNTVATL 7.3e-05 32.0 false
+1 NTVATLYC 4 11 8 HLA-A*01:01 4 32.5 NTVATLYC- NTVATLYC 31263.96 29.0 NTVATLYC- NTVATLYC 0.000198 36.0 false
+1 NTVATLYC 4 11 8 HLA-A*03:01 4 56.5 NTV-ATLYC NTVATLYC 36752.28 58.0 NTV-ATLYC NTVATLYC 1.5e-05 55.0 false
+1 SLYNTVAT 1 8 8 HLA-A*01:01 1 46.0 SLYNTVAT- SLYNTVAT 37726.09 59.0 SLYNTVAT- SLYNTVAT 0.000231 33.0 false
+1 SLYNTVAT 1 8 8 HLA-A*03:01 1 16.5 SLYNTVAT- SLYNTVAT 22359.43 18.0 SLYNTVAT- SLYNTVAT 0.000601 15.0 false
+1 TLYCVHQR 8 15 8 HLA-A*01:01 8 37.0 TLY-CVHQR TLYCVHQR 34958.03 44.0 TLY-CVHQR TLYCVHQR 0.000295 30.0 false
+1 TLYCVHQR 8 15 8 HLA-A*03:01 8 3.7 TLY-CVHQR TLYCVHQR 5298.0 4.3 TLY-CVHQR TLYCVHQR 0.025039 3.1 false
+1 TVATLYCV 5 12 8 HLA-A*01:01 5 22.0 TVA-TLYCV TVATLYCV 26730.83 18.0 TVA-TLYCV TVATLYCV 0.000376 26.0 false
+1 TVATLYCV 5 12 8 HLA-A*03:01 5 41.5 TVATL-YCV TVATLYCV 30907.44 36.0 TVATL-YCV TVATLYCV 2.5e-05 47.0 false
+1 VATLYCVH 6 13 8 HLA-A*01:01 6 56.5 VAT-LYCVH VATLYCVH 37247.88 56.0 VAT-LYCVH VATLYCVH 6.6e-05 57.0 false
+1 VATLYCVH 6 13 8 HLA-A*03:01 6 43.5 VA-TLYCVH VATLYCVH 33868.64 46.0 VA-TLYCVH VATLYCVH 3.7e-05 41.0 false
+1 YCVHQRID 10 17 8 HLA-A*01:01 10 94.5 YCVHQRID- YCVHQRID 45507.15 99.0 YCVHQRID- YCVHQRID 8e-06 90.0 false
+1 YCVHQRID 10 17 8 HLA-A*03:01 10 98.0 YCVHQRID- YCVHQRID 46081.89 100.0 YCVHQRID- YCVHQRID 1e-06 96.0 false
+1 YNTVATLY 3 10 8 HLA-A*01:01 3 1.9 Y-NTVATLY YNTVATLY 8274.43 2.1 Y-NTVATLY YNTVATLY 0.040463 1.7 false
+1 YNTVATLY 3 10 8 HLA-A*03:01 3 29.0 Y-NTVATLY YNTVATLY 30714.42 35.0 Y-NTVATLY YNTVATLY 0.000178 23.0 false
diff -r 000000000000 -r 88e44dab2988 test-data/outputs/netmhcpan_output_2.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/outputs/netmhcpan_output_2.tsv Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,45 @@
+seq # peptide start end peptide length allele peptide index median binding percentile netmhcpan_el core netmhcpan_el icore netmhcpan_el score netmhcpan_el percentile reversed
+1 AHKVPRRL 3 10 8 HLA-A*01:01 3 32.0 -AHKVPRRL AHKVPRRL 0.000256 32.0 false
+1 AHKVPRRL 3 10 8 HLA-A*03:01 3 31.0 AHKVP-RRL AHKVPRRL 8.1e-05 31.0 false
+1 GHAHKVPR 1 8 8 HLA-A*01:01 1 60.0 GHAHKVPR- GHAHKVPR 5.7e-05 60.0 false
+1 GHAHKVPR 1 8 8 HLA-A*03:01 1 24.0 GHAHKVP-R GHAHKVPR 0.00015 24.0 false
+1 HAHKVPRR 2 9 8 HLA-A*01:01 2 31.0 HAH-KVPRR HAHKVPRR 0.000265 31.0 false
+1 HAHKVPRR 2 9 8 HLA-A*03:01 2 11.0 HAH-KVPRR HAHKVPRR 0.001191 11.0 false
+1 HKVPRRLL 4 11 8 HLA-A*01:01 4 34.0 HKVPRR-LL HKVPRRLL 0.000217 34.0 false
+1 HKVPRRLL 4 11 8 HLA-A*03:01 4 43.0 HKV-PRRLL HKVPRRLL 3.3e-05 43.0 false
+1 KVPRRLLK 5 12 8 HLA-A*01:01 5 28.0 KVP-RRLLK KVPRRLLK 0.000335 28.0 false
+1 KVPRRLLK 5 12 8 HLA-A*03:01 5 0.71 KV-PRRLLK KVPRRLLK 0.273931 0.71 false
+1 PRRLLKAA 7 14 8 HLA-A*01:01 7 85.0 PRR-LLKAA PRRLLKAA 1.3e-05 85.0 false
+1 PRRLLKAA 7 14 8 HLA-A*03:01 7 71.0 PRR-LLKAA PRRLLKAA 6e-06 71.0 false
+1 RRLLKAAR 8 15 8 HLA-A*01:01 8 72.0 RRLLK-AAR RRLLKAAR 2.9e-05 72.0 false
+1 RRLLKAAR 8 15 8 HLA-A*03:01 8 17.0 R-RLLKAAR RRLLKAAR 0.00038 17.0 false
+1 VPRRLLKA 6 13 8 HLA-A*01:01 6 46.0 VPR-RLLKA VPRRLLKA 0.000115 46.0 false
+1 VPRRLLKA 6 13 8 HLA-A*03:01 6 38.0 VPR-RLLKA VPRRLLKA 4.7e-05 38.0 false
+2 AADASADA 3 10 8 HLA-A*01:01 11 28.0 AADASADA- AADASADA 0.000318 28.0 false
+2 AADASADA 3 10 8 HLA-A*03:01 11 74.0 AADASADA- AADASADA 5e-06 74.0 false
+2 ADADGSGS 8 15 8 HLA-A*01:01 16 72.0 ADADGSGS- ADADGSGS 3e-05 72.0 false
+2 ADADGSGS 8 15 8 HLA-A*03:01 16 88.0 ADADGSGS- ADADGSGS 2e-06 88.0 false
+2 ADASADAD 4 11 8 HLA-A*01:01 12 95.0 ADASADAD- ADASADAD 5e-06 95.0 false
+2 ADASADAD 4 11 8 HLA-A*03:01 12 100.0 ADASADAD- ADASADAD 0.0 100.0 false
+2 ADGSGSGS 10 17 8 HLA-A*01:01 18 77.0 -ADGSGSGS ADGSGSGS 2.2e-05 77.0 false
+2 ADGSGSGS 10 17 8 HLA-A*03:01 18 96.0 ADGSGSGS- ADGSGSGS 1e-06 96.0 false
+2 ASADADGS 6 13 8 HLA-A*01:01 14 41.0 ASADADGS- ASADADGS 0.000149 41.0 false
+2 ASADADGS 6 13 8 HLA-A*03:01 14 78.0 ASADADGS- ASADADGS 4e-06 78.0 false
+2 DADGSGSG 9 16 8 HLA-A*01:01 17 42.0 DADGSGSG- DADGSGSG 0.00014 42.0 false
+2 DADGSGSG 9 16 8 HLA-A*03:01 17 88.0 DADGSGSG- DADGSGSG 2e-06 88.0 false
+2 DASADADG 5 12 8 HLA-A*01:01 13 92.0 DASADADG- DASADADG 7e-06 92.0 false
+2 DASADADG 5 12 8 HLA-A*03:01 13 100.0 DASADADG- DASADADG 0.0 100.0 false
+2 DGSGSGSG 11 18 8 HLA-A*01:01 19 92.0 DGSGSGSG- DGSGSGSG 7e-06 92.0 false
+2 DGSGSGSG 11 18 8 HLA-A*03:01 19 96.0 DGSGSGSG- DGSGSGSG 1e-06 96.0 false
+2 GSGSGSGS 12 19 8 HLA-A*01:01 20 59.0 GSGSGSGS- GSGSGSGS 6e-05 59.0 false
+2 GSGSGSGS 12 19 8 HLA-A*03:01 20 82.0 GSGSGSGS- GSGSGSGS 3e-06 82.0 false
+2 KAADASAD 2 9 8 HLA-A*01:01 10 66.0 KAADASAD- KAADASAD 4.1e-05 66.0 false
+2 KAADASAD 2 9 8 HLA-A*03:01 10 78.0 KAADASAD- KAADASAD 4e-06 78.0 false
+2 LKAADASA 1 8 8 HLA-A*01:01 9 81.0 -LKAADASA LKAADASA 1.7e-05 81.0 false
+2 LKAADASA 1 8 8 HLA-A*03:01 9 82.0 -LKAADASA LKAADASA 3e-06 82.0 false
+2 SADADGSG 7 14 8 HLA-A*01:01 15 29.0 SADADGSG- SADADGSG 0.000311 29.0 false
+2 SADADGSG 7 14 8 HLA-A*03:01 15 82.0 SADADGSG- SADADGSG 3e-06 82.0 false
+2 SGSGSGSG 13 20 8 HLA-A*01:01 21 72.0 SGSGSGSG- SGSGSGSG 2.9e-05 72.0 false
+2 SGSGSGSG 13 20 8 HLA-A*03:01 21 71.0 SGSGSGSG- SGSGSGSG 6e-06 71.0 false
+3 KDLGYDYS 1 8 8 HLA-A*01:01 22 83.0 KDLGYDYS- KDLGYDYS 1.5e-05 83.0 false
+3 KDLGYDYS 1 8 8 HLA-A*03:01 22 88.0 KDLGYDYS- KDLGYDYS 2e-06 88.0 false
diff -r 000000000000 -r 88e44dab2988 test-data/outputs/netmhcpan_output_3.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/outputs/netmhcpan_output_3.tsv Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,213 @@
+seq # peptide start end peptide length allele peptide index median binding percentile netmhcpan_el core netmhcpan_el icore netmhcpan_el score netmhcpan_el percentile reversed
+1 AHKVPRRL 3 10 8 HLA-A*01:01 3 32.0 -AHKVPRRL AHKVPRRL 0.000256 32.0 false
+1 AHKVPRRL 3 10 8 HLA-A*03:01 3 31.0 AHKVP-RRL AHKVPRRL 8.1e-05 31.0 false
+1 AHKVPRRLL 3 11 9 HLA-A*01:01 11 19.0 AHKVPRRLL AHKVPRRLL 0.000661 19.0 false
+1 AHKVPRRLL 3 11 9 HLA-A*03:01 11 17.0 AHKVPRRLL AHKVPRRLL 0.000388 17.0 false
+1 AHKVPRRLLK 3 12 10 HLA-A*01:01 18 25.0 AHKVPRLLK AHKVPRRLLK 0.000412 25.0 false
+1 AHKVPRRLLK 3 12 10 HLA-A*03:01 18 4.2 AHKVPRLLK AHKVPRRLLK 0.012934 4.2 false
+1 AHKVPRRLLKA 3 13 11 HLA-A*01:01 24 43.0 AVPRRLLKA AHKVPRRLLKA 0.000133 43.0 false
+1 AHKVPRRLLKA 3 13 11 HLA-A*03:01 24 21.0 AHKVPRLLK AHKVPRRLLK 0.000241 21.0 false
+1 AHKVPRRLLKAA 3 14 12 HLA-A*01:01 29 68.0 AHKVPRRLA AHKVPRRLLKAA 3.8e-05 68.0 false
+1 AHKVPRRLLKAA 3 14 12 HLA-A*03:01 29 46.0 AHKVPRLLK AHKVPRRLLK 2.6e-05 46.0 false
+1 AHKVPRRLLKAAR 3 15 13 HLA-A*01:01 33 81.0 AHKVPRAAR AHKVPRRLLKAAR 1.7e-05 81.0 false
+1 AHKVPRRLLKAAR 3 15 13 HLA-A*03:01 33 24.0 AHKVPRAAR AHKVPRRLLKAAR 0.00015 24.0 false
+1 GHAHKVPR 1 8 8 HLA-A*01:01 1 60.0 GHAHKVPR- GHAHKVPR 5.7e-05 60.0 false
+1 GHAHKVPR 1 8 8 HLA-A*03:01 1 24.0 GHAHKVP-R GHAHKVPR 0.00015 24.0 false
+1 GHAHKVPRR 1 9 9 HLA-A*01:01 9 36.0 GHAHKVPRR GHAHKVPRR 0.000197 36.0 false
+1 GHAHKVPRR 1 9 9 HLA-A*03:01 9 6.2 GHAHKVPRR GHAHKVPRR 0.004884 6.2 false
+1 GHAHKVPRRL 1 10 10 HLA-A*01:01 16 26.0 GHAHVPRRL GHAHKVPRRL 0.000366 26.0 false
+1 GHAHKVPRRL 1 10 10 HLA-A*03:01 16 29.0 GAHKVPRRL GHAHKVPRRL 0.0001 29.0 false
+1 GHAHKVPRRLL 1 11 11 HLA-A*01:01 22 37.0 GHAHPRRLL GHAHKVPRRLL 0.000185 37.0 false
+1 GHAHKVPRRLL 1 11 11 HLA-A*03:01 22 34.0 GHAHPRRLL GHAHKVPRRLL 6.3e-05 34.0 false
+1 GHAHKVPRRLLK 1 12 12 HLA-A*01:01 27 49.0 GHAPRRLLK GHAHKVPRRLLK 9.9e-05 49.0 false
+1 GHAHKVPRRLLK 1 12 12 HLA-A*03:01 27 11.0 GHAPRRLLK GHAHKVPRRLLK 0.001287 11.0 false
+1 GHAHKVPRRLLKA 1 13 13 HLA-A*01:01 31 68.0 GHAHKVLKA GHAHKVPRRLLKA 3.7e-05 68.0 false
+1 GHAHKVPRRLLKA 1 13 13 HLA-A*03:01 31 56.0 GHAPRRLLK GHAHKVPRRLLK 1.4e-05 56.0 false
+1 GHAHKVPRRLLKAA 1 14 14 HLA-A*01:01 34 92.0 GHAHKVPRA GHAHKVPRRLLKAA 7e-06 92.0 false
+1 GHAHKVPRRLLKAA 1 14 14 HLA-A*03:01 34 82.0 GHAHLLKAA GHAHKVPRRLLKAA 3e-06 82.0 false
+1 HAHKVPRR 2 9 8 HLA-A*01:01 2 31.0 HAH-KVPRR HAHKVPRR 0.000265 31.0 false
+1 HAHKVPRR 2 9 8 HLA-A*03:01 2 11.0 HAH-KVPRR HAHKVPRR 0.001191 11.0 false
+1 HAHKVPRRL 2 10 9 HLA-A*01:01 10 7.2 HAHKVPRRL HAHKVPRRL 0.003229 7.2 false
+1 HAHKVPRRL 2 10 9 HLA-A*03:01 10 11.0 HAHKVPRRL HAHKVPRRL 0.001421 11.0 false
+1 HAHKVPRRLL 2 11 10 HLA-A*01:01 17 20.0 HAHKVPRLL HAHKVPRRLL 0.000613 20.0 false
+1 HAHKVPRRLL 2 11 10 HLA-A*03:01 17 26.0 HAHKVPRLL HAHKVPRRLL 0.000126 26.0 false
+1 HAHKVPRRLLK 2 12 11 HLA-A*01:01 23 14.0 HAHKVPLLK HAHKVPRRLLK 0.001179 14.0 false
+1 HAHKVPRRLLK 2 12 11 HLA-A*03:01 23 1.3 HAHKVPLLK HAHKVPRRLLK 0.135325 1.3 false
+1 HAHKVPRRLLKA 2 13 12 HLA-A*01:01 28 46.0 HAHKVPLKA HAHKVPRRLLKA 0.000117 46.0 false
+1 HAHKVPRRLLKA 2 13 12 HLA-A*03:01 28 19.0 HAHKVPLLK HAHKVPRRLLK 0.000299 19.0 false
+1 HAHKVPRRLLKAA 2 14 13 HLA-A*01:01 32 74.0 HAHKVPRAA HAHKVPRRLLKAA 2.6e-05 74.0 false
+1 HAHKVPRRLLKAA 2 14 13 HLA-A*03:01 32 46.0 HAHKVPLLK HAHKVPRRLLK 2.7e-05 46.0 false
+1 HAHKVPRRLLKAAR 2 15 14 HLA-A*01:01 35 74.0 HAHKVPAAR HAHKVPRRLLKAAR 2.7e-05 74.0 false
+1 HAHKVPRRLLKAAR 2 15 14 HLA-A*03:01 35 30.0 HAHKVPAAR HAHKVPRRLLKAAR 8.9e-05 30.0 false
+1 HKVPRRLL 4 11 8 HLA-A*01:01 4 34.0 HKVPRR-LL HKVPRRLL 0.000217 34.0 false
+1 HKVPRRLL 4 11 8 HLA-A*03:01 4 43.0 HKV-PRRLL HKVPRRLL 3.3e-05 43.0 false
+1 HKVPRRLLK 4 12 9 HLA-A*01:01 12 26.0 HKVPRRLLK HKVPRRLLK 0.000376 26.0 false
+1 HKVPRRLLK 4 12 9 HLA-A*03:01 12 2.8 HKVPRRLLK HKVPRRLLK 0.030755 2.8 false
+1 HKVPRRLLKA 4 13 10 HLA-A*01:01 19 34.0 HVPRRLLKA HKVPRRLLKA 0.000226 34.0 false
+1 HKVPRRLLKA 4 13 10 HLA-A*03:01 19 25.0 HKVPRRLLK HKVPRRLLK 0.000141 25.0 false
+1 HKVPRRLLKAA 4 14 11 HLA-A*01:01 25 55.0 HKVPRRLLA HKVPRRLLKAA 7.4e-05 55.0 false
+1 HKVPRRLLKAA 4 14 11 HLA-A*03:01 25 50.0 HKVPRRLLK HKVPRRLLK 2e-05 50.0 false
+1 HKVPRRLLKAAR 4 15 12 HLA-A*01:01 30 71.0 HKVPRRLLR HKVPRRLLKAAR 3.2e-05 71.0 false
+1 HKVPRRLLKAAR 4 15 12 HLA-A*03:01 30 20.0 KVPRRLLKR KVPRRLLKAAR 0.000259 20.0 false
+1 KVPRRLLK 5 12 8 HLA-A*01:01 5 28.0 KVP-RRLLK KVPRRLLK 0.000335 28.0 false
+1 KVPRRLLK 5 12 8 HLA-A*03:01 5 0.71 KV-PRRLLK KVPRRLLK 0.273931 0.71 false
+1 KVPRRLLKA 5 13 9 HLA-A*01:01 13 15.0 KVPRRLLKA KVPRRLLKA 0.000947 15.0 false
+1 KVPRRLLKA 5 13 9 HLA-A*03:01 13 4.7 KVPRRLLKA KVPRRLLKA 0.009838 4.7 false
+1 KVPRRLLKAA 5 14 10 HLA-A*01:01 20 45.0 KVPRRLLKA KVPRRLLKAA 0.00012 45.0 false
+1 KVPRRLLKAA 5 14 10 HLA-A*03:01 20 16.0 KVPRRLLKA KVPRRLLKAA 0.000437 16.0 false
+1 KVPRRLLKAAR 5 15 11 HLA-A*01:01 26 33.0 KVPRRLLKR KVPRRLLKAAR 0.000244 33.0 false
+1 KVPRRLLKAAR 5 15 11 HLA-A*03:01 26 2.7 KVPRRLLAR KVPRRLLKAAR 0.032122 2.7 false
+1 PRRLLKAA 7 14 8 HLA-A*01:01 7 85.0 PRR-LLKAA PRRLLKAA 1.3e-05 85.0 false
+1 PRRLLKAA 7 14 8 HLA-A*03:01 7 71.0 PRR-LLKAA PRRLLKAA 6e-06 71.0 false
+1 PRRLLKAAR 7 15 9 HLA-A*01:01 15 68.0 PRRLLKAAR PRRLLKAAR 3.7e-05 68.0 false
+1 PRRLLKAAR 7 15 9 HLA-A*03:01 15 27.0 PRRLLKAAR PRRLLKAAR 0.000112 27.0 false
+1 RRLLKAAR 8 15 8 HLA-A*01:01 8 72.0 RRLLK-AAR RRLLKAAR 2.9e-05 72.0 false
+1 RRLLKAAR 8 15 8 HLA-A*03:01 8 17.0 R-RLLKAAR RRLLKAAR 0.00038 17.0 false
+1 VPRRLLKA 6 13 8 HLA-A*01:01 6 46.0 VPR-RLLKA VPRRLLKA 0.000115 46.0 false
+1 VPRRLLKA 6 13 8 HLA-A*03:01 6 38.0 VPR-RLLKA VPRRLLKA 4.7e-05 38.0 false
+1 VPRRLLKAA 6 14 9 HLA-A*01:01 14 30.0 VPRRLLKAA VPRRLLKAA 0.000287 30.0 false
+1 VPRRLLKAA 6 14 9 HLA-A*03:01 14 22.0 VPRRLLKAA VPRRLLKAA 0.000195 22.0 false
+1 VPRRLLKAAR 6 15 10 HLA-A*01:01 21 62.0 VPRRLKAAR VPRRLLKAAR 5.2e-05 62.0 false
+1 VPRRLLKAAR 6 15 10 HLA-A*03:01 21 18.0 VPRRLLAAR VPRRLLKAAR 0.000361 18.0 false
+2 AADASADA 3 10 8 HLA-A*01:01 38 28.0 AADASADA- AADASADA 0.000318 28.0 false
+2 AADASADA 3 10 8 HLA-A*03:01 38 74.0 AADASADA- AADASADA 5e-06 74.0 false
+2 AADASADAD 3 11 9 HLA-A*01:01 51 30.0 AADASADAD AADASADAD 0.000295 30.0 false
+2 AADASADAD 3 11 9 HLA-A*03:01 51 88.0 AADASADAD AADASADAD 2e-06 88.0 false
+2 AADASADADG 3 12 10 HLA-A*01:01 63 50.0 AADASADAG AADASADADG 9.5e-05 50.0 false
+2 AADASADADG 3 12 10 HLA-A*03:01 63 96.0 AADASADAG AADASADADG 1e-06 96.0 false
+2 AADASADADGS 3 13 11 HLA-A*01:01 74 43.0 AADASADAS AADASADADGS 0.000135 43.0 false
+2 AADASADADGS 3 13 11 HLA-A*03:01 74 96.0 AADASADAS AADASADADGS 1e-06 96.0 false
+2 AADASADADGSG 3 14 12 HLA-A*01:01 84 65.0 AADASADSG AADASADADGSG 4.4e-05 65.0 false
+2 AADASADADGSG 3 14 12 HLA-A*03:01 84 96.0 ASADADGSG AADASADADGSG 1e-06 96.0 false
+2 AADASADADGSGS 3 15 13 HLA-A*01:01 93 45.0 AADASGSGS AADASADADGSGS 0.00012 45.0 false
+2 AADASADADGSGS 3 15 13 HLA-A*03:01 93 96.0 AADASGSGS AADASADADGSGS 1e-06 96.0 false
+2 AADASADADGSGSG 3 16 14 HLA-A*01:01 101 79.0 AADDGSGSG AADASADADGSGSG 1.9e-05 79.0 false
+2 AADASADADGSGSG 3 16 14 HLA-A*03:01 101 100.0 AADDGSGSG AADASADADGSGSG 0.0 100.0 false
+2 ADADGSGS 8 15 8 HLA-A*01:01 43 72.0 ADADGSGS- ADADGSGS 3e-05 72.0 false
+2 ADADGSGS 8 15 8 HLA-A*03:01 43 88.0 ADADGSGS- ADADGSGS 2e-06 88.0 false
+2 ADADGSGSG 8 16 9 HLA-A*01:01 56 48.0 ADADGSGSG ADADGSGSG 0.000105 48.0 false
+2 ADADGSGSG 8 16 9 HLA-A*03:01 56 71.0 ADADGSGSG ADADGSGSG 6e-06 71.0 false
+2 ADADGSGSGS 8 17 10 HLA-A*01:01 68 21.0 AADGSGSGS ADADGSGSGS 0.000564 21.0 false
+2 ADADGSGSGS 8 17 10 HLA-A*03:01 68 62.0 AADGSGSGS ADADGSGSGS 1e-05 62.0 false
+2 ADADGSGSGSG 8 18 11 HLA-A*01:01 79 80.0 ADADGSGSG ADADGSGSGSG 1.8e-05 80.0 false
+2 ADADGSGSGSG 8 18 11 HLA-A*03:01 79 96.0 ADASGSGSG ADADGSGSGSG 1e-06 96.0 false
+2 ADADGSGSGSGS 8 19 12 HLA-A*01:01 89 82.0 AGSGSGSGS ADADGSGSGSGS 1.6e-05 82.0 false
+2 ADADGSGSGSGS 8 19 12 HLA-A*03:01 89 88.0 AGSGSGSGS ADADGSGSGSGS 2e-06 88.0 false
+2 ADADGSGSGSGSG 8 20 13 HLA-A*01:01 98 95.0 ASGSGSGSG ADADGSGSGSGSG 5e-06 95.0 false
+2 ADADGSGSGSGSG 8 20 13 HLA-A*03:01 98 100.0 ADADGSGSG ADADGSGSGSGSG 0.0 100.0 false
+2 ADASADAD 4 11 8 HLA-A*01:01 39 95.0 ADASADAD- ADASADAD 5e-06 95.0 false
+2 ADASADAD 4 11 8 HLA-A*03:01 39 100.0 ADASADAD- ADASADAD 0.0 100.0 false
+2 ADASADADG 4 12 9 HLA-A*01:01 52 88.0 ADASADADG ADASADADG 1e-05 88.0 false
+2 ADASADADG 4 12 9 HLA-A*03:01 52 96.0 ADASADADG ADASADADG 1e-06 96.0 false
+2 ADASADADGS 4 13 10 HLA-A*01:01 64 78.0 AASADADGS ADASADADGS 2.1e-05 78.0 false
+2 ADASADADGS 4 13 10 HLA-A*03:01 64 96.0 AASADADGS ADASADADGS 1e-06 96.0 false
+2 ADASADADGSG 4 14 11 HLA-A*01:01 75 76.0 ASADADGSG ADASADADGSG 2.3e-05 76.0 false
+2 ADASADADGSG 4 14 11 HLA-A*03:01 75 96.0 ASADADGSG ADASADADGSG 1e-06 96.0 false
+2 ADASADADGSGS 4 15 12 HLA-A*01:01 85 51.0 AADADGSGS ADASADADGSGS 8.7e-05 51.0 false
+2 ADASADADGSGS 4 15 12 HLA-A*03:01 85 96.0 AADADGSGS ADASADADGSGS 1e-06 96.0 false
+2 ADASADADGSGSG 4 16 13 HLA-A*01:01 94 98.0 ADADGSGSG ADASADADGSGSG 3e-06 98.0 false
+2 ADASADADGSGSG 4 16 13 HLA-A*03:01 94 100.0 ADADGSGSG ADASADADGSGSG 0.0 100.0 false
+2 ADASADADGSGSGS 4 17 14 HLA-A*01:01 102 66.0 AADGSGSGS ADASADADGSGSGS 4.2e-05 66.0 false
+2 ADASADADGSGSGS 4 17 14 HLA-A*03:01 102 96.0 AADGSGSGS ADASADADGSGSGS 1e-06 96.0 false
+2 ADGSGSGS 10 17 8 HLA-A*01:01 45 77.0 -ADGSGSGS ADGSGSGS 2.2e-05 77.0 false
+2 ADGSGSGS 10 17 8 HLA-A*03:01 45 96.0 ADGSGSGS- ADGSGSGS 1e-06 96.0 false
+2 ADGSGSGSG 10 18 9 HLA-A*01:01 58 77.0 ADGSGSGSG ADGSGSGSG 2.2e-05 77.0 false
+2 ADGSGSGSG 10 18 9 HLA-A*03:01 58 82.0 ADGSGSGSG ADGSGSGSG 3e-06 82.0 false
+2 ADGSGSGSGS 10 19 10 HLA-A*01:01 70 66.0 AGSGSGSGS ADGSGSGSGS 4.2e-05 66.0 false
+2 ADGSGSGSGS 10 19 10 HLA-A*03:01 70 66.0 AGSGSGSGS ADGSGSGSGS 8e-06 66.0 false
+2 ADGSGSGSGSG 10 20 11 HLA-A*01:01 81 83.0 ASGSGSGSG ADGSGSGSGSG 1.5e-05 83.0 false
+2 ADGSGSGSGSG 10 20 11 HLA-A*03:01 81 96.0 ASGSGSGSG ADGSGSGSGSG 1e-06 96.0 false
+2 ASADADGS 6 13 8 HLA-A*01:01 41 41.0 ASADADGS- ASADADGS 0.000149 41.0 false
+2 ASADADGS 6 13 8 HLA-A*03:01 41 78.0 ASADADGS- ASADADGS 4e-06 78.0 false
+2 ASADADGSG 6 14 9 HLA-A*01:01 54 36.0 ASADADGSG ASADADGSG 0.000204 36.0 false
+2 ASADADGSG 6 14 9 HLA-A*03:01 54 68.0 ASADADGSG ASADADGSG 7e-06 68.0 false
+2 ASADADGSGS 6 15 10 HLA-A*01:01 66 13.0 ASDADGSGS ASADADGSGS 0.00129 13.0 false
+2 ASADADGSGS 6 15 10 HLA-A*03:01 66 44.0 ASADAGSGS ASADADGSGS 3e-05 44.0 false
+2 ASADADGSGSG 6 16 11 HLA-A*01:01 77 53.0 ASADGSGSG ASADADGSGSG 7.9e-05 53.0 false
+2 ASADADGSGSG 6 16 11 HLA-A*03:01 77 78.0 ASADGSGSG ASADADGSGSG 4e-06 78.0 false
+2 ASADADGSGSGS 6 17 12 HLA-A*01:01 87 17.0 ASDGSGSGS ASADADGSGSGS 0.000796 17.0 false
+2 ASADADGSGSGS 6 17 12 HLA-A*03:01 87 56.0 ASAGSGSGS ASADADGSGSGS 1.4e-05 56.0 false
+2 ASADADGSGSGSG 6 18 13 HLA-A*01:01 96 74.0 ASADGSGSG ASADADGSGSGSG 2.6e-05 74.0 false
+2 ASADADGSGSGSG 6 18 13 HLA-A*03:01 96 96.0 ASADGSGSG ASADADGSGSGSG 1e-06 96.0 false
+2 ASADADGSGSGSGS 6 19 14 HLA-A*01:01 104 68.0 ASADSGSGS ASADADGSGSGSGS 3.7e-05 68.0 false
+2 ASADADGSGSGSGS 6 19 14 HLA-A*03:01 104 82.0 ASADSGSGS ASADADGSGSGSGS 3e-06 82.0 false
+2 DADGSGSG 9 16 8 HLA-A*01:01 44 42.0 DADGSGSG- DADGSGSG 0.00014 42.0 false
+2 DADGSGSG 9 16 8 HLA-A*03:01 44 88.0 DADGSGSG- DADGSGSG 2e-06 88.0 false
+2 DADGSGSGS 9 17 9 HLA-A*01:01 57 16.0 DADGSGSGS DADGSGSGS 0.000893 16.0 false
+2 DADGSGSGS 9 17 9 HLA-A*03:01 57 62.0 DADGSGSGS DADGSGSGS 1e-05 62.0 false
+2 DADGSGSGSG 9 18 10 HLA-A*01:01 69 46.0 DADGSGSSG DADGSGSGSG 0.000113 46.0 false
+2 DADGSGSGSG 9 18 10 HLA-A*03:01 69 88.0 DADGSGSSG DADGSGSGSG 2e-06 88.0 false
+2 DADGSGSGSGS 9 19 11 HLA-A*01:01 80 50.0 DADGSGSGS DADGSGSGSGS 9.5e-05 50.0 false
+2 DADGSGSGSGS 9 19 11 HLA-A*03:01 80 88.0 DADGSGSGS DADGSGSGSGS 2e-06 88.0 false
+2 DADGSGSGSGSG 9 20 12 HLA-A*01:01 90 62.0 DADGSGSSG DADGSGSGSGSG 5e-05 62.0 false
+2 DADGSGSGSGSG 9 20 12 HLA-A*03:01 90 96.0 DADSGSGSG DADGSGSGSGSG 1e-06 96.0 false
+2 DASADADG 5 12 8 HLA-A*01:01 40 92.0 DASADADG- DASADADG 7e-06 92.0 false
+2 DASADADG 5 12 8 HLA-A*03:01 40 100.0 DASADADG- DASADADG 0.0 100.0 false
+2 DASADADGS 5 13 9 HLA-A*01:01 53 73.0 DASADADGS DASADADGS 2.8e-05 73.0 false
+2 DASADADGS 5 13 9 HLA-A*03:01 53 88.0 DASADADGS DASADADGS 2e-06 88.0 false
+2 DASADADGSG 5 14 10 HLA-A*01:01 65 78.0 DSADADGSG DASADADGSG 2e-05 78.0 false
+2 DASADADGSG 5 14 10 HLA-A*03:01 65 100.0 DSADADGSG DASADADGSG 0.0 100.0 false
+2 DASADADGSGS 5 15 11 HLA-A*01:01 76 60.0 DADADGSGS DASADADGSGS 5.7e-05 60.0 false
+2 DASADADGSGS 5 15 11 HLA-A*03:01 76 88.0 ASADAGSGS ASADADGSGS 2e-06 88.0 false
+2 DASADADGSGSG 5 16 12 HLA-A*01:01 86 90.0 DAADGSGSG DASADADGSGSG 8e-06 90.0 false
+2 DASADADGSGSG 5 16 12 HLA-A*03:01 86 100.0 DAADGSGSG DASADADGSGSG 0.0 100.0 false
+2 DASADADGSGSGS 5 17 13 HLA-A*01:01 95 71.0 DADGSGSGS DASADADGSGSGS 3.1e-05 71.0 false
+2 DASADADGSGSGS 5 17 13 HLA-A*03:01 95 96.0 DADGSGSGS DASADADGSGSGS 1e-06 96.0 false
+2 DASADADGSGSGSG 5 18 14 HLA-A*01:01 103 100.0 DASSGSGSG DASADADGSGSGSG 1e-06 100.0 false
+2 DASADADGSGSGSG 5 18 14 HLA-A*03:01 103 100.0 DASSGSGSG DASADADGSGSGSG 0.0 100.0 false
+2 DGSGSGSG 11 18 8 HLA-A*01:01 46 92.0 DGSGSGSG- DGSGSGSG 7e-06 92.0 false
+2 DGSGSGSG 11 18 8 HLA-A*03:01 46 96.0 DGSGSGSG- DGSGSGSG 1e-06 96.0 false
+2 DGSGSGSGS 11 19 9 HLA-A*01:01 59 56.0 DGSGSGSGS DGSGSGSGS 6.9e-05 56.0 false
+2 DGSGSGSGS 11 19 9 HLA-A*03:01 59 74.0 DGSGSGSGS DGSGSGSGS 5e-06 74.0 false
+2 DGSGSGSGSG 11 20 10 HLA-A*01:01 71 57.0 DGSGSGGSG DGSGSGSGSG 6.5e-05 57.0 false
+2 DGSGSGSGSG 11 20 10 HLA-A*03:01 71 96.0 DGSGSGSSG DGSGSGSGSG 1e-06 96.0 false
+2 GSGSGSGS 12 19 8 HLA-A*01:01 47 59.0 GSGSGSGS- GSGSGSGS 6e-05 59.0 false
+2 GSGSGSGS 12 19 8 HLA-A*03:01 47 82.0 GSGSGSGS- GSGSGSGS 3e-06 82.0 false
+2 GSGSGSGSG 12 20 9 HLA-A*01:01 60 53.0 GSGSGSGSG GSGSGSGSG 7.9e-05 53.0 false
+2 GSGSGSGSG 12 20 9 HLA-A*03:01 60 71.0 GSGSGSGSG GSGSGSGSG 6e-06 71.0 false
+2 KAADASAD 2 9 8 HLA-A*01:01 37 66.0 KAADASAD- KAADASAD 4.1e-05 66.0 false
+2 KAADASAD 2 9 8 HLA-A*03:01 37 78.0 KAADASAD- KAADASAD 4e-06 78.0 false
+2 KAADASADA 2 10 9 HLA-A*01:01 50 19.0 KAADASADA KAADASADA 0.000659 19.0 false
+2 KAADASADA 2 10 9 HLA-A*03:01 50 30.0 KAADASADA KAADASADA 8.7e-05 30.0 false
+2 KAADASADAD 2 11 10 HLA-A*01:01 62 68.0 KADASADAD KAADASADAD 3.8e-05 68.0 false
+2 KAADASADAD 2 11 10 HLA-A*03:01 62 88.0 KAADASADA KAADASADA 2e-06 88.0 false
+2 KAADASADADG 2 12 11 HLA-A*01:01 73 86.0 KAADASADG KAADASADADG 1.2e-05 86.0 false
+2 KAADASADADG 2 12 11 HLA-A*03:01 73 96.0 KAADASADA KAADASADA 1e-06 96.0 false
+2 KAADASADADGS 2 13 12 HLA-A*01:01 83 80.0 KAADASAGS KAADASADADGS 1.8e-05 80.0 false
+2 KAADASADADGS 2 13 12 HLA-A*03:01 83 78.0 KAADASAGS KAADASADADGS 4e-06 78.0 false
+2 KAADASADADGSG 2 14 13 HLA-A*01:01 92 88.0 KAADASASG KAADASADADGSG 1e-05 88.0 false
+2 KAADASADADGSG 2 14 13 HLA-A*03:01 92 96.0 KAADASASG KAADASADADGSG 1e-06 96.0 false
+2 KAADASADADGSGS 2 15 14 HLA-A*01:01 100 83.0 KADADGSGS KAADASADADGSGS 1.5e-05 83.0 false
+2 KAADASADADGSGS 2 15 14 HLA-A*03:01 100 88.0 KAADAGSGS KAADASADADGSGS 2e-06 88.0 false
+2 LKAADASA 1 8 8 HLA-A*01:01 36 81.0 -LKAADASA LKAADASA 1.7e-05 81.0 false
+2 LKAADASA 1 8 8 HLA-A*03:01 36 82.0 -LKAADASA LKAADASA 3e-06 82.0 false
+2 LKAADASAD 1 9 9 HLA-A*01:01 49 99.0 LKAADASAD LKAADASAD 2e-06 99.0 false
+2 LKAADASAD 1 9 9 HLA-A*03:01 49 100.0 LKAADASAD LKAADASAD 0.0 100.0 false
+2 LKAADASADA 1 10 10 HLA-A*01:01 61 49.0 LAADASADA LKAADASADA 9.6e-05 49.0 false
+2 LKAADASADA 1 10 10 HLA-A*03:01 61 78.0 LAADASADA LKAADASADA 4e-06 78.0 false
+2 LKAADASADAD 1 11 11 HLA-A*01:01 72 81.0 LADASADAD LKAADASADAD 1.7e-05 81.0 false
+2 LKAADASADAD 1 11 11 HLA-A*03:01 72 100.0 LADASADAD LKAADASADAD 0.0 100.0 false
+2 LKAADASADADG 1 12 12 HLA-A*01:01 82 100.0 LKAADASAG LKAADASADADG 1e-06 100.0 false
+2 LKAADASADADG 1 12 12 HLA-A*03:01 82 100.0 LKAADASAG LKAADASADADG 0.0 100.0 false
+2 LKAADASADADGS 1 13 13 HLA-A*01:01 91 99.0 LASADADGS LKAADASADADGS 2e-06 99.0 false
+2 LKAADASADADGS 1 13 13 HLA-A*03:01 91 100.0 KAADASAGS KAADASADADGS 0.0 100.0 false
+2 LKAADASADADGSG 1 14 14 HLA-A*01:01 99 99.0 LSADADGSG LKAADASADADGSG 2e-06 99.0 false
+2 LKAADASADADGSG 1 14 14 HLA-A*03:01 99 100.0 LSADADGSG LKAADASADADGSG 0.0 100.0 false
+2 SADADGSG 7 14 8 HLA-A*01:01 42 29.0 SADADGSG- SADADGSG 0.000311 29.0 false
+2 SADADGSG 7 14 8 HLA-A*03:01 42 82.0 SADADGSG- SADADGSG 3e-06 82.0 false
+2 SADADGSGS 7 15 9 HLA-A*01:01 55 8.0 SADADGSGS SADADGSGS 0.002732 8.0 false
+2 SADADGSGS 7 15 9 HLA-A*03:01 55 57.0 SADADGSGS SADADGSGS 1.3e-05 57.0 false
+2 SADADGSGSG 7 16 10 HLA-A*01:01 67 23.0 SADDGSGSG SADADGSGSG 0.000462 23.0 false
+2 SADADGSGSG 7 16 10 HLA-A*03:01 67 78.0 SAADGSGSG SADADGSGSG 4e-06 78.0 false
+2 SADADGSGSGS 7 17 11 HLA-A*01:01 78 19.0 SADASGSGS SADADGSGSGS 0.00069 19.0 false
+2 SADADGSGSGS 7 17 11 HLA-A*03:01 78 78.0 SADGSGSGS SADADGSGSGS 4e-06 78.0 false
+2 SADADGSGSGSG 7 18 12 HLA-A*01:01 88 48.0 SADSGSGSG SADADGSGSGSG 0.000101 48.0 false
+2 SADADGSGSGSG 7 18 12 HLA-A*03:01 88 96.0 SADSGSGSG SADADGSGSGSG 1e-06 96.0 false
+2 SADADGSGSGSGS 7 19 13 HLA-A*01:01 97 35.0 SADGSGSGS SADADGSGSGSGS 0.000213 35.0 false
+2 SADADGSGSGSGS 7 19 13 HLA-A*03:01 97 88.0 SASGSGSGS SADADGSGSGSGS 2e-06 88.0 false
+2 SADADGSGSGSGSG 7 20 14 HLA-A*01:01 105 78.0 SADSGSGSG SADADGSGSGSGSG 2e-05 78.0 false
+2 SADADGSGSGSGSG 7 20 14 HLA-A*03:01 105 100.0 SADADGSSG SADADGSGSGSGSG 0.0 100.0 false
+2 SGSGSGSG 13 20 8 HLA-A*01:01 48 72.0 SGSGSGSG- SGSGSGSG 2.9e-05 72.0 false
+2 SGSGSGSG 13 20 8 HLA-A*03:01 48 71.0 SGSGSGSG- SGSGSGSG 6e-06 71.0 false
+3 KDLGYDYS 1 8 8 HLA-A*01:01 106 83.0 KDLGYDYS- KDLGYDYS 1.5e-05 83.0 false
+3 KDLGYDYS 1 8 8 HLA-A*03:01 106 88.0 KDLGYDYS- KDLGYDYS 2e-06 88.0 false
diff -r 000000000000 -r 88e44dab2988 test-data/seqs.fa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/seqs.fa Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,6 @@
+>peptide1
+GHAHKVPRRLLKAAR
+>peptide2
+LKAADASADADGSGSGSGSG
+>peptide3
+KDLGYDYS
diff -r 000000000000 -r 88e44dab2988 test-data/seqs.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/seqs.tsv Wed Jul 09 12:56:30 2025 +0000
@@ -0,0 +1,3 @@
+peptide1 16 GHAHKVPRRLLKAAR
+peptide2 21 LKAADASADADGSGSGSGSG
+peptide3 8 KDLGYDYS