Commit f4473b92 authored by flothoni's avatar flothoni

Merge branch 'feature-c/genescan_primer_search' of...

Merge branch 'feature-c/genescan_primer_search' of gitlab.inria.fr:vidjil/vidjil into feature-c/genescan_primer_search
parents 9b26aa37 99ed41da
Pipeline #235054 failed with stages
in 1 minute and 4 seconds
......@@ -408,6 +408,10 @@ test_server_unit:
artifacts:
reports:
junit: server/web2py/applications/vidjil/tests/test/TEST-*.xml
when: always
expire_in: 1 week
paths:
- server/web2py/ap‎plications/vidjil‎/tests/
only:
- /^feature-.*s.*\/.*$/
- /^hotfix-.*s.*\/.*$/
......@@ -432,7 +436,7 @@ ff45-server-functional:
# Benchmark
benchmark_algo:
.benchmark-algo:
image: gcc:6.3
extends: .install-algo-dependencies
stage: benchmark
......@@ -447,6 +451,16 @@ benchmark_algo:
tags:
- cidocker
benchmark-algo:
extends: .benchmark-algo
script:
- cd algo/tests ; python3 benchmark-releases.py -r 3 -b -c -i 2018.10 -i 2019.03 -i 2020.04 -i 2021.02.2 -i alpha-2102
benchmark-algo-full:
extends: .benchmark-algo
script:
- cd algo/tests ; python3 benchmark-releases.py -r 3 -bIc
# Deployment
......
#include "filter.h"
#include "math.hpp"
FilterWithACAutomaton::FilterWithACAutomaton(BioReader &origin, string seed) : originalBioReader(origin){
FilterWithACAutomaton::FilterWithACAutomaton(BioReader &origin, string seed, float keys_compress) : originalBioReader(origin){
this->filtered_sequences_nb = 0;
this->filtered_sequences_calls = 0;
buildACAutomatonToFilterBioReader(seed);
buildACAutomatonToFilterBioReader(seed, keys_compress);
}
FilterWithACAutomaton::~FilterWithACAutomaton(){
......@@ -16,7 +16,7 @@ FilterWithACAutomaton::~FilterWithACAutomaton(){
}
}
void FilterWithACAutomaton::buildACAutomatonToFilterBioReader(string seed){
void FilterWithACAutomaton::buildACAutomatonToFilterBioReader(string seed, float keys_compress){
char asciiChar;
int asciiNumber;
string currentLabel;
......@@ -32,12 +32,22 @@ void FilterWithACAutomaton::buildACAutomatonToFilterBioReader(string seed){
asciiNumber = SPECIFIC_KMERS_NUMBER;
automaton->insert(originalBioReader.sequence(0),std::string("") + char(asciiNumber), true, 0, seed);
indexes->push_back(0);
int previousAsciiNumber = asciiNumber;
int rawNumber = 0;
previousLabel = extractGeneName(originalBioReader.label(0));
for(int i = 1;i < originalBioReader.size(); ++i){
currentLabel = extractGeneName(originalBioReader.label(i));
if(currentLabel != previousLabel){
asciiNumber = SPECIFIC_KMERS_NUMBER + 1 + (int) rawNumber / keys_compress;
rawNumber++;
}
if (asciiNumber > previousAsciiNumber)
{
indexes->push_back(i);
asciiNumber++;
previousAsciiNumber = asciiNumber;
}
if(asciiNumber > 127){
cerr << WARNING_STRING << "Pre-filtering disabled" << endl;
......@@ -182,7 +192,8 @@ ostream &operator<<(ostream &out, const FilterWithACAutomaton& obj){
int total_sequences_origin = total_filtered_calls * origin_bioreader_size;
float aligned_rate = ((float)total_sequences_filtered/(float)total_sequences_origin) * 100;
out << fixed << setw(8) << total_sequences_filtered << "/"
out << right
<< fixed << setw(8) << total_sequences_filtered << "/"
<< fixed << setw(8) << total_sequences_origin << " "
<< fixed << setprecision(1) << setw(6) << aligned_rate << "%"
<< endl ;
......
......@@ -19,7 +19,7 @@ class FilterWithACAutomaton {
/* The size of the BioReader returned after filtering.*/
int filtered_sequences_nb;
FilterWithACAutomaton(BioReader &origin, string seed);
FilterWithACAutomaton(BioReader &origin, string seed, float keys_compress=1.0);
~FilterWithACAutomaton();
......@@ -93,7 +93,7 @@ class FilterWithACAutomaton {
The param "seed" is used while inserting sequences in the automaton. By default
the seed has a size of 10.
*/
void buildACAutomatonToFilterBioReader(string seed);
void buildACAutomatonToFilterBioReader(string seed, float keys_compress);
/**
* Return the vector of indexes used while building the automaton.
......
......@@ -26,7 +26,7 @@ void Germline::init(string _code, char _shortcut,
affect_5 = string(1, toupper(shortcut)) + "-" + code + "V";
affect_4 = string(1, 14 + shortcut) + "-" + code + "D";
affect_3 = string(1, tolower(shortcut)) + "-" + code + "J";
filter_5 = build_automaton ? new FilterWithACAutomaton(rep_5, this->seed_5) : nullptr;
filter_5 = build_automaton ? new FilterWithACAutomaton(rep_5, this->seed_5, KEYS_COMPRESS) : nullptr;
}
......@@ -230,23 +230,33 @@ Germline::~Germline()
}
}
void out_index_seed(ostream &out,
const Germline &germline,
string seed_x,
string affect_x)
{
size_t seed_x_span = seed_x.size();
out << " " << fixed << setprecision(3) << setw(5)
<< 100 * germline.index->getIndexLoad(KmerAffect(affect_x, 1, seed_x_span)) << "%"
<< " l" << left << setw(2) << seed_x.length()
<< " k" << left << setw(2) << seed_weight(seed_x)
<< " " << left << setw(15) << seed_x ;
}
ostream &operator<<(ostream &out, const Germline &germline)
{
out << setw(5) << left << germline.code << right << " '" << germline.shortcut << "' "
<< " ";
size_t seed_5_span = germline.seed_5.size();
size_t seed_5_w = seed_weight(germline.seed_5);
size_t seed_3_span = germline.seed_3.size();
size_t seed_3_w = seed_weight(germline.seed_3);
if (germline.index) {
out << " 0x" << hex << setw(2) << setfill('0') << germline.index->id << dec << setfill(' ') << " " ;
out << fixed << setprecision(3) << setw(8)
<< 100 * germline.index->getIndexLoad(KmerAffect(germline.affect_5, 1, seed_5_span)) << "%" << " "
<< 100 * germline.index->getIndexLoad(KmerAffect(germline.affect_3, 1, seed_3_span)) << "%";
out << " l" << germline.seed_5.length() << " k" << seed_5_w << " " << germline.seed_5 ;
out << " l" << germline.seed_3.length() << " k" << seed_3_w << " " << germline.seed_3 ;
out_index_seed(out, germline, germline.seed_5, germline.affect_5);
if (germline.rep_4.size())
out_index_seed(out, germline, germline.seed_4, germline.affect_4);
out_index_seed(out, germline, germline.seed_3, germline.affect_3);
}
out << endl;
......
......@@ -33,6 +33,7 @@ enum SEGMENTATION_METHODS {
#define PSEUDO_NOT_ANALYZED "not analyzed"
#define PSEUDO_NOT_ANALYZED_CODE 'z'
#define KEYS_COMPRESS 1.65 // enough for ~208 *01 genes (191 IGHV + ...) / 127
using namespace std;
using json = nlohmann::json;
......
......@@ -431,13 +431,20 @@ string KmerSegmenter::getInfoLineWithAffects() const
{
stringstream ss;
ss << "# "
ss << "= " << right << setw(10) << segmented_germline->code << " "
<< right << setw(3) << score << " "
<< left << setw(30)
<< getInfoLine() ;
<< getInfoLine();
if (getSegmentationStatus() != UNSEG_TOO_SHORT)
ss << getKmerAffectAnalyser()->toString();
{
ss << endl;
ss << "# " << right << setw(10) << segmented_germline->code << " "
<< getKmerAffectAnalyser()->toStringValues();
ss << endl;
ss << "$ " << right << setw(10) << segmented_germline->code << " "
<< getKmerAffectAnalyser()->toStringSigns();
}
return ss.str();
}
......
......@@ -118,6 +118,7 @@ JsonOutputWindowsMatrix::JsonOutputWindowsMatrix(SimilarityMatrix &m, float sim,
ostream &operator<<(ostream &out, const RawOutputSimilarityMatrix &outputMatrix) {
SimilarityMatrix &matrix = outputMatrix.matrix;
out << right;
out << " | " ;
for (int num = 0; num < matrix.size(); num++)
......
......@@ -88,10 +88,10 @@ string fixed_string_of_float(float number, int precision)
return ss.str();
}
string scientific_string_of_double(double number)
string scientific_string_of_double(double number, int precision)
{
stringstream ss;
ss << scientific << number ;
ss << scientific << setprecision(precision) << number ;
return ss.str();
}
......@@ -470,16 +470,14 @@ void sigintHandler(int sig_num)
}
#pragma GCC diagnostic pop
/*
Return the part of label before the star
For example:
IGHV5-51*01 -> IGHV5-51
If there is no star in the name, the whole label is returned.
IGHV10-40 -> IGHV10-40
*/
string extractGeneName(string label){
string result;
size_t pipe_pos = label.find("|");
if (pipe_pos != string::npos) {
label = label.substr(pipe_pos+1);
}
size_t star_pos;
star_pos = label.rfind("*");
if(star_pos != string::npos){
......
......@@ -108,9 +108,10 @@ extern bool global_interrupted;
void sigintHandler(int sig_num);
/*
Extract the gene name from a label. This take the whole part
before the star and returns it. If there is no star in the
name the whole label is returned.
Extract the gene name from a label.
If there is a pipe '|', consider only what is after the (first) pipe.
If there is a star '*', consider only what is before the start
M99686|IGHV5-51*01|Homo sapiens|... -> IGHV5-51
IGHV-01*05 -> IGHV-01
IGHV-7500AB -> IGHV-7500AB
*/
......@@ -128,7 +129,7 @@ bool pair_occurrence_sort(pair<T, int> a, pair<T, int> b);
string string_of_int(int number, int pad_to_width=0);
string fixed_string_of_float(float number, int precision);
string scientific_string_of_double(double number);
string scientific_string_of_double(double number, int precision=2);
string string_of_map(map <string, string> m, const string &before);
/**
......
......@@ -53,7 +53,9 @@ WindowsStorage *WindowExtractor::extract(OnlineBioReader *reads,
nb_reads++;
if (out_affects) {
*out_affects << reads->getSequence();
Sequence seq = reads->getSequence();
*out_affects << ">" << seq.label << endl
<< setw(13) << " " << seq.sequence << endl;
}
KmerMultiSegmenter kmseg(reads->getSequence(), multigermline, out_affects, nb_expected, nb_reads_for_evalue);
......@@ -114,7 +116,7 @@ WindowsStorage *WindowExtractor::extract(OnlineBioReader *reads,
// Last line of detailed affects output
if (out_affects) {
*out_affects << "#>" << seg->label << " " << seg->getInfoLine() << endl << endl;
*out_affects << "==> " << seg->label << " " << seg->getInfoLine() << endl << endl;
}
// Progress bar
......@@ -125,7 +127,9 @@ WindowsStorage *WindowExtractor::extract(OnlineBioReader *reads,
cout << "." ;
if (!(nb_reads % (PROGRESS_POINT * PROGRESS_LINE)))
cout << setw(10) << nb_reads / 1000 << "k reads " << fixed << setprecision(2) << setw(14) << bp_total / 1E6 << " Mbp" << endl ;
cout << right
<< setw(10) << nb_reads / 1000 << "k reads "
<< fixed << setprecision(2) << setw(14) << bp_total / 1E6 << " Mbp" << endl ;
cout.flush() ;
}
......
......@@ -3,8 +3,11 @@ ARCHIVE = 'http://www.vidjil.org/releases/'
DEST = 'bench/'
SRC = DEST + 'src/'
BIN = DEST + 'bin/'
GERM = DEST + 'germline/'
RUN = DEST + 'run/'
GERM_VAR = '${GERMLINE}'
OUT = 'benchmark.log'
CURRENT = 'HEAD'
......@@ -13,16 +16,18 @@ CURRENT = 'HEAD'
WARN_RATIO = 0.10
LIMIT2e5 = '-x 200000 '
LIMIT1e5 = '-x 100000 '
LIMIT1e4 = '-x 10000 '
LIMIT1e3 = '-x 1000 '
LIMIT1e2 = '-x 100 '
MULTI = '-g ../../germline/homo-sapiens.g '
IGH = '-g ../../germline/homo-sapiens.g:IGH '
MULTI = '-g ' + GERM_VAR + '/homo-sapiens.g '
IGH = '-g ' + GERM_VAR + '/homo-sapiens.g:IGH '
L4 = '../../demo/LIL-L4.fastq.gz '
S22 = '../../demo/Stanford_S22.fasta '
FILTER = '--filter-reads '
CONSENSUS_NO = '-y 0 -z 0 '
CONSENSUS_ALL = '-y all -z 0 '
DESIGNATIONS = '-c designations '
......@@ -33,6 +38,8 @@ BENCHS = OrderedDict([
('init', '-x 1 ' + MULTI + L4 + CONSENSUS_NO),
('germ', LIMIT1e5 + MULTI + L4 + '-c germlines '),
('filter', LIMIT2e5 + FILTER + MULTI + L4),
('multi-0', LIMIT1e5 + MULTI + L4 + CONSENSUS_NO),
('multi-1', LIMIT1e5 + MULTI + L4 + CONSENSUS_ALL),
('multi-a', LIMIT1e3 + MULTI + L4 + DESIGNATIONS + '-z 1000'),
......@@ -129,6 +136,8 @@ def go(cmd, log=None, time=False):
else:
flog = sys.stdout
print(cmd, end=' ')
sys.stdout.flush()
if time:
time_file = NamedTemporaryFile(mode='w+', delete=False)
cmd = "/usr/bin/time -o {} -f '%U\t%S\t%M' {}".format(time_file.name, cmd)
......@@ -137,9 +146,12 @@ def go(cmd, log=None, time=False):
flog.close()
if returncode:
print('FAILED', end=' ')
print(color(ANSI.RED, "FAILED"))
sys.stdout.flush()
raise subprocess.CalledProcessError(returncode, cmd)
elif not time:
print()
sys.stdout.flush()
return
else:
(utime, stime, mem) = [ float(i) for i in time_file.read().split() ]
......@@ -147,6 +159,7 @@ def go(cmd, log=None, time=False):
mem = mem // 1000
os.unlink(time_file.name)
print(color(ANSI.YELLOW, '%5.2fu %5.2fs %6.1fM' % (utime, stime, mem)))
sys.stdout.flush()
return (stime + utime, mem)
......@@ -173,7 +186,8 @@ def get_releases():
def install(release, tgz):
os.system('mkdir -p %s' % BIN)
print('== %s' % release)
os.system('mkdir -p %s' % GERM)
print('==', color(ANSI.MAGENTA, release))
dir = SRC + release
go('mkdir -p %s' % dir)
......@@ -183,12 +197,16 @@ def install(release, tgz):
if release == CURRENT:
go('make -C ../../algo', log)
go('cp ../../vidjil-algo %s/%s ' % (BIN, release), log)
go('make -C ../.. germline', log)
go('cp -pr ../../germline %s/%s ' % (GERM, release), log)
print()
return
go('wget %s/%s -O %s/src.tgz' % (ARCHIVE, tgz, dir), log)
go('cd %s ; tar xfz src.tgz' % dir, log)
go('cd %s/*%s* ; make vidjil-algo || make CXX=g++-6' % (dir, release), log)
go('cd %s/*%s* ; make vidjil-algo germline || make CXX=g++-6 vidjil-algo germline' % (dir, release), log)
res = go('cp %s/*%s*/vidjil* %s/%s ' % (dir, release, BIN, release), log)
go('cp -pr %s/*%s*/germline %s/%s ' % (dir, release, GERM, release), log)
print()
......@@ -201,7 +219,7 @@ def install_from_archive(install_versions):
if (not install_versions) or release in install_versions:
install(release, tgz)
except subprocess.CalledProcessError:
print("FAILED")
print(color(ANSI.RED, "Install failed "))
def installed():
return sorted([f.replace(BIN, '') for f in glob.glob('%s/*' % BIN)])
......@@ -214,10 +232,13 @@ def run_all(tag, args, retries):
print(color(ANSI.MAGENTA, '%9s' % release), end=' ')
log = RUN + '/%s-%s.log' % (tag, release)
cmd = '%s/%s ' % (BIN, release) + convert(args, release)
cmd = '%s/%-9s ' % (BIN, release) + convert(args, release)
cmd = cmd.replace(GERM_VAR, '%s/%s' % (GERM, release))
try:
benchs = []
for i in range(retries) :
if i:
print('%9s' % '', end=' ')
benchs.append(go(cmd, log, True))
time = min([b[0] for b in benchs])
mem = min([b[1] for b in benchs])
......@@ -285,7 +306,6 @@ def show_benchs(f, watched_release=None, colorize=True):
def bench_all(retries, selected_benchs):
try:
go("make -C ../.. germline")
go("make -C ../.. data")
go("make -C ../.. demo")
print()
......
......@@ -5,7 +5,8 @@
# Most sequences are not reported as 'only V', but as 'too few V/J'
1: UNSEG only V/.* 1
1: UNSEG too few V/J .* 11
# see #4730
f1: UNSEG too few V/J .* 11
1: UNSEG too few V/J .* 9
!OUTPUT_FILE: out/bug4225-j.affects
!LAUNCH: $VIDJIL_DIR/$EXEC -g $VIDJIL_DIR/germline -r 1 -1 -2 -K bug4225-j.fa
!LAUNCH: $VIDJIL_DIR/$EXEC -c windows -g $VIDJIL_DIR/germline -r 1 -1 -2 -K bug4225-j.fa
$ Show name and sequence
1:>igkj1
1:GTGGACGTTCGGCCAAGGGACCAAGGTGGAAATCAAAC
$ Display three lines per system
3:TRG
3:IGH\+
$ Find only +k and ? affects before the stretch of _ for all loci
16: seed .*(\+k| \?){28}( _)+$
16:^\#.* (k|\?){28}_+$
16:^\$.* (\+| ){28}( )+$
!OUTPUT_FILE: out/chimera-fake-half.affects
!LAUNCH: $VIDJIL_DIR/$EXEC -g $VIDJIL_DIR/germline -r 1 -4 -K ../data/chimera-fake-half.fa
!LAUNCH: $VIDJIL_DIR/$EXEC -c windows -g $VIDJIL_DIR/germline/homo-sapiens.g:TRB -r 1 -4 -K ../data/chimera-fake-half.fa
$ Find only 48 +B affects on the TRB and unexpected lines
2:^\#.* (_){40}(B){48}(_){10}
2:^\$.* (\s){40}(\+){48}(\s){10}
$ Find only +B and ? affects on the TRB and unexpected lines
2: seed .* _(\+B| \?){48} _
# upstream (19 bp) + IGHD7-27*01 (11 bp) + 92 bp + start of IGHJ1*01 (39 bp)
>NC_000014.9:c105865580-105865420 Homo sapiens chromosome 14, GRCh38.p12 Primary Assembly
TGAGCTGAGAACCACTGTGCTAACTGGGGACACAGTGATTGGCAGCTCTACAAAAACCATGCTCCCCCGG
GACCCCGGGCTGTGGGTTTCTGTAGCCCCTGGCTCAGGGCTGACTCACCGTGGCTGAATACTTCCAGCAC
TGGGGCCAGGGCACCCTGGTC
TGAGCTGAGAACCACTGTG
ctaactgggga
CACAGTGATTGGCAGCTCTACAAAAACCATGCTCCCCCGG
GACCCCGGGCTGTGGGTTTCTGTAGCCCCTGGCTCAGGGC
TGACTCACCGTG
gctgaatacttccagcactggggccagggcaccctggtc
......@@ -3,9 +3,9 @@
# Sequences outside any V(D)J locus
>too_few_vj-1
CTAGGCATGGCTCCTCTCCACAGGAAAACTCCACTCCAGTGCTCAGCTTGCACCCTGGCACAGGCCAGCAGTTGCTGGAAGTCAGACACCTGTGAAGAAC
CTAGGCATGGCTCCTCTCCACAGGAAAACTCCACTCCAGTGCTCAGCTTGCAaCCTGGCACAGGCCAGCAGTTGaTGGAAGTCcGACACCTGTGAAGAAC
>too_few_vj-2
>too_few_vj-2 #4728
GCCTCAGGCCAGCCTTCCGCTCCTTGAAGCTGGTCTCCGCACAGTGCTGGTTCCGTCACCCCCACCCAGGGAAGCAGGTCTGAGCAGCTTGTCCTGGCTG
>too_few_vj-3
......
......@@ -37,4 +37,4 @@ cttgggcagttggaacaacACTTGTTGTCACAG
gaattattataagaaactctttggcagtggaacaacactggttgtcac
>seq-seg-no-window
ctgggacaggGAATTATTAT
ctgggacaggGAATTATTATA
......@@ -3,21 +3,33 @@ gcaccatcagagagagatgaagggtcttactactgtgcctgtgacacc
acaccgataaactcatctttggaaaaggaacccgtgtgactgtggaaccaa
# without DD2 upstream, the recombination can not be detected, 'TODO' is expected here
>TRDD2*01_0//0_TRDJ1*01 [TRD+] TODO
ccttcctac
acaccgataaactcatctttggaaaaggaacccgtgtgactgtggaaccaa
# same sequence, with DD2 upstream
# same sequence, with some DD2 upstream
>TRDD2*01_0//0_TRDJ1*01 [TRD+]
TGTGccttcctac
acaccgataaactcatctttggaaaaggaacccgtgtgactgtggaaccaa
# same sequence, with more DD2 upstream
>TRDD2*01_0//0_TRDJ1*01 [TRD+]
TGTGTTTCATTGTGccttcctac
acaccgataaactcatctttggaaaaggaacccgtgtgactgtggaaccaa
# without DD2 upstream, the recombination can not be detected, 'TODO' is expected here
>TRDD2*01_0//0_TRDD3*01 [TRD+] TODO
ccttcctac
actgggggatacg
# same sequence, with DD2 upstream and DD3 downstream
# same sequence, with some DD2 upstream
>TRDD2*01_0//0_TRDD3*01 [TRD+]
GTGccttcctac
actgggggatacg
# same sequence, with more DD2 upstream and DD3 downstream
>TRDD2*01_0//0_TRDD3*01 [TRD+]
TGTGTTTCATTGTGccttcctac
actgggggatacgCACAGTGCTA
......
......@@ -2,94 +2,117 @@
!LAUNCH: (cd $VIDJIL_DIR/germline ; md5sum */*.fa || md5 -r */*.fa)
$ Check md5 in germline/, sequences split and processed from germline and other databases
1:b64be21f03b290c6850ce2cb2f1d6f02 homo-sapiens/IGHD.fa
1:6a64f90ea2d19721d410c545e9d0bb9e homo-sapiens/IGHJ.fa
1:73e6adab4faeb48b4fc2904e3a6e90f8 homo-sapiens/IGHV.fa
1:e749633dffa7c87299b46de3c81d8cfe gallus-gallus/IGHD.fa
1:c3738ee3e9fcc3c4cd242fc66df00299 gallus-gallus/IGHJ.fa
1:1ddfe402c2f539ba297992a51dce322e gallus-gallus/IGHV.fa
1:84f820d3e567520266a1a5f0d28b37fc gallus-gallus/IGLJ.fa
1:d6b431de0803ab21db803f87fc838bf2 gallus-gallus/IGLV.fa
1:709721d770caefe417763c919ee2eeb1 homo-sapiens/IGHD.fa
1:b3f1ca96a21616dc5544584a7a7d8e14 homo-sapiens/IGHJ.fa
1:d70f82b45cce4e4571c8c7ef2a3c873e homo-sapiens/IGHV.fa
1:0367825e404f753f0890b8f52aec7502 homo-sapiens/IGKJ.fa
1:820188b335764f0eb04578ea35bbb143 homo-sapiens/IGKV.fa
1:5792d273ae377b1af2e69a3a8b47b14b homo-sapiens/IGKV.fa
1:af257e110cf1ec6c38457af82a8118aa homo-sapiens/IGLJ.fa
1:d6fa96cbc4de984729154c9d2217e3d2 homo-sapiens/IGLV.fa
1:f0c43d7b0074e155aef411ea7353c23e homo-sapiens/TRAJ.fa
1:935d588445e94d575c412cb3699b6bff homo-sapiens/TRAV.fa
1:ebbe9236648bb903e9fec44752227a8a homo-sapiens/IGLV.fa
1:d50f2b2289fe2ca2e7139a47f6c68d3c homo-sapiens/TRAJ.fa
1:e2545c70e6b16c4076581becac5147be homo-sapiens/TRAV.fa
1:5b74170b9c45b9243558941bf07666ff homo-sapiens/TRBD.fa
1:b9f8390d1d18a9ef5db9ab6875e196f1 homo-sapiens/TRBJ.fa
1:6540dc6a0e4f84de208a8b1f5d9fa981 homo-sapiens/TRBV.fa
1:34015ed76474e4e5539ab4a76abee4c1 homo-sapiens/TRBJ.fa
1:be0a91d9e0a571c1cef3cca3ebc38bd4 homo-sapiens/TRBV.fa
1:7f9fe8eaf781cf87453c157a771d5aaf homo-sapiens/TRDD.fa
1:e50fc3c2f786f0b5a2b6fb5834dd3814 homo-sapiens/TRDJ.fa
1:36dbb85d696634b8ee6ba0dc7500af85 homo-sapiens/TRDV.fa
1:552cbc4883f3524fdc871fc156ecfdde homo-sapiens/TRGJ.fa
1:e50df5cf337648190bc59609fe5fb5e0 homo-sapiens/TRGV.fa
1:6f585362d727b243dd284ede15118670 mus-musculus/IGHD.fa
1:bb5815c6edb747f593edd9414ed1deb6 homo-sapiens/TRDV.fa
1:62651e35ba6725757e30113647b5ab5f homo-sapiens/TRGJ.fa
1:ee4053a508b3ed4820799135cc50e554 homo-sapiens/TRGV.fa
1:b3bca64b9f9a9891b70590a32aed9baa mus-musculus/IGHD.fa
1:218632e3e3c4fcd4c9ca7281e8976e3a mus-musculus/IGHJ.fa
1:d389ee1e204699942ec1185fad8cd3df mus-musculus/IGHV.fa
1:85d7fbbe3372dbd0d1238089fe555a7c mus-musculus/IGHV.fa
1:47568ad1ee648410b734c3b33f4a9eea mus-musculus/IGKJ.fa