The bulk BCR-Seq assay is a component of the CMI-Flu prediction challenge. An overview of all the data, including links to more detailed descriptions of the other data, may be found at CMI-x .
RNA was extracted from PBMCs using the miRNeasy Mini Kit (Qiagen) bulk BCR-seq library preparation using the Takara SMART-Seq® Human BCR (with UMIs) (Takara Biosciences). Libraries were sequenced on an AVITI (Element Biosciences), targeting 1 million reads for heavy chain samples and 2 million reads for light chain samples. Processing was performed using the default nf-core/airrflow pipeline.
Bulk BCR-Seq data generated for CMI-Flu was combined with other publicly-available data.
The bulk BCR-Seq data consists of 2 tables :
publicData_bulkBCR.tsv contains both pre- and
post-vaccination measurements; 2025LJI_bulkBCR.tsv contains
pre-vaccination measures only. While these data are not directly linked
to a specific prediction task, you can leverage them to build more
robust models and improve predictions for other data types within the
2025 LJI prediction challenge cohort.
| Bulk BCR-Seq Assay | |
| Data dictionary | |
| Column | Description |
|---|---|
| participant_id | Donor ID, one for each subject in each study, in the format studyID.subjectID (links to participants.tsv) |
| timepoint | Days relative to influenza vaccination. |
| sequence_id | Unique identifier for the sequence within a sample (airrflow read/UMI identifier). |
| sequence | Nucleotide sequence of the assembled receptor read. |
| locus | Receptor locus: IGH (heavy chain), IGK or IGL (light chain). |
| v_call | IMGT V gene/allele assignment. Comma-separated when the alignment cannot resolve a single allele. |
| d_call | IMGT D gene/allele assignment. Empty for light chains and for heavy chains with no confident D assignment. |
| j_call | IMGT J gene/allele assignment. |
| c_call | Constant region (isotype) assignment, e.g. IGHM, IGHG, IGHA, IGHD, IGKC, IGLC. Allele-level where resolvable. |
| cdr3 | Nucleotide sequence of the CDR3 junction (IMGT definition, excluding the conserved anchors). |
| v_identity | Fraction of nucleotide identity to the germline V allele (0-1). Lower values indicate more somatic hypermutation. |
| d_identity | Fraction of nucleotide identity to the germline D allele (0-1). Empty where no D segment was called. |
| j_identity | Fraction of nucleotide identity to the germline J allele (0-1). |
| clone_id | Clonal cluster assignment within a study, from airrflow. Sequences sharing a clone_id are inferred to descend from a common naive B cell. NA where the sequence could not be assigned. |
| tissue | Sample type: PBMC, blood, or ASC (antibody-secreting cells). |
| study_accession | Study identifier. Links to the investigations.tsv file. |
| subject | subject ID. |
| ID | Concatenated sample-level key (participant_id, timepoint, and sequence_id). |
Data preview:
library(tidyverse)
train <- read.delim("../datasets/260512/train/publicData_bulkBCR.tsv", sep = "\t", stringsAsFactors = FALSE)
head(train)
## participant_id timepoint sequence_id
## 1 SDY2903.SUB393557 0 F09D0B_GCTTTATTACGATGATG
## 2 SDY2903.SUB393557 0 F09D0B_CTCTTTGTTTATGTTTG
## 3 SDY2903.SUB393557 0 F09D0B_CACCCAGTTATAGCTAG
## 4 SDY2903.SUB393557 0 F09D0B_CCATTATACACTCTGGG
## 5 SDY2903.SUB393557 0 F09D0B_TTCAATTAAGATTTGTG
## 6 SDY2903.SUB393557 7 F09D7B_TTAGGTAGGTTTTCGAA
## sequence
## 1 GATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACCATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCCTATGGAGACACCTTCAACAACTATGCTATCAGTTGGGTGCGACAGGCCCCCGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTCTGGAACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATAACCGCGGACGAATCCACGGGCACAGTTTACATGGAGCTGAGTAGCCTGAGAACTGAGGACACGGCCGTGTATTACTGCGCGAGAGAGGCAGGGACAGTCCCTAAATATCTCGATTTTTGGAGTGGTTATAATTGGGACAGCTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAGCATCCCCGACCAGCCCCAAGGTCTTCCCG
## 2 GATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACCATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGATCCTCGGTGAAAGTCTCCTGCAAGGCTTCTGGAGACACCTTCAGCAGGTATTCTATCAGCTGGGTGCGACAGGCCCCCGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATTTTTGGAACAGCAAGCTACGCACAGAAGTTCCAGGGCAGAGTCACGATAACCGCGGACGAATCCACGGGCACAGCCTACATGGAACTGAGCAGCCTGAGAACTGAGGACACGGCCGTGTATTACTGTGCGAGAGAGGCAGGGACAGTCCCTAAACATTTCGGTTTTTGGAGTCCTTATAATTGGGACAGCTTTGACTACTGGGGTCAGGGAACCCTGGTCACCGTCTCCTCAGCATCCCCGACCAGCCCCAAGGTCTTCCCG
## 3 GGCATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACCATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGATGACCCCGTCCAATATGATTACATTTGGGGGAGTTATCGTTTTAGGGCTCTCTCCTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAGGGAGTGCATCCGCCCCAACCCTTTTCCC
## 4 ATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACCATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGAATCCGGGTATAGCAGCAGCTGGTATCCACTGGTACTGGGGGACACCCGATACTACTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAGGGAGTGCATCCGCCCCAACCCTTTTCCC
## 5 GATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACCATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGTCCAGTCCCAGGTGCAGCTGGTGCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAAGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCAGCTATGCTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGAGGGATCATCCCTATCTTTGGTACAGCAAACTACGCACAGAAGTTCCAGGGCAGAGTCACGATTACCGCGGACGAATCCACGAGCACAGCCTACATGGAGCTGAGCAGCCTGAGATCTGAGGACACGGCCGTGTATTACTGTGCGAGAGATCGGAGTTCCCCCTCGTCGTATTATGATTACATTTGGGGGAGTTATCGCTACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAGGGAGTGCATCCGCCCCAACCCTTTTCCC
## 6 GGCATCACATAACAACCACATTCCTCCTCTAAAGAAGCCCCTGGGAGCACAGCTCATCACCATGGACTGGACCTGGAGGTTCCTCTTTGTGGTGGCAGCAGCTACAGGTGCCCAGTCCCAGTTCCAGCTGGTGCAGTCTGAGGCTGAGGTGAAGAAGCCTGGGTCCTCGGTGAGGGTCTCCTGCAAGGCTTCTGGAGGCACCTTCAGCACTTCTGCCATCACCTGGGTGCGACAGGTCCCTGGACAAGGTCTTGAGTGGATGGGAGGGATCATCCCTTACTTCGCAACTCCACACTACGCAGAGAAGTTCCAGGACAGAGCCACATTTACCGCGGACGAATCCACGGTCACAGCCTACATGGAGCTGAGCGGCCTGACATCTGAAGACACGGCCGTTTATTACTGTGCGAGAGACCCATCCATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAGCCTCCACCAAGGGCC
## locus v_call d_call j_call c_call
## 1 IGH IGHV1-69*01,IGHV1-69D*01 IGHD3-3*01 IGHJ4*02 IGHA1*01,IGHA1*04
## 2 IGH IGHV1-69*01,IGHV1-69D*01 IGHD3-3*01 IGHJ4*02 IGHA1*01,IGHA1*04
## 3 IGH IGHV1-69*01,IGHV1-69D*01 IGHD3-16*03 IGHJ4*02 IGHM*01,IGHM*03
## 4 IGH IGHV1-69*01,IGHV1-69D*01 IGHD6-13*01 IGHJ4*02 IGHM*01,IGHM*03
## 5 IGH IGHV1-69*01,IGHV1-69D*01 IGHD3-16*03 IGHJ5*02 IGHM*01,IGHM*03
## 6 IGH IGHV1-69*12 <NA> IGHJ6*03 IGHG
## cdr3
## 1 GCGAGAGAGGCAGGGACAGTCCCTAAATATCTCGATTTTTGGAGTGGTTATAATTGGGACAGCTTTGACTAC
## 2 GCGAGAGAGGCAGGGACAGTCCCTAAACATTTCGGTTTTTGGAGTCCTTATAATTGGGACAGCTTTGACTAC
## 3 GCGAGAGATGACCCCGTCCAATATGATTACATTTGGGGGAGTTATCGTTTTAGGGCTCTCTCCTTTGACTAC
## 4 GCGAGAGAATCCGGGTATAGCAGCAGCTGGTATCCACTGGTACTGGGGGACACCCGATACTACTTTGACTAC
## 5 GCGAGAGATCGGAGTTCCCCCTCGTCGTATTATGATTACATTTGGGGGAGTTATCGCTACAACTGGTTCGACCCC
## 6 GCGAGAGACCCATCCATGGACGTC
## v_identity d_identity j_identity clone_id tissue study_accession subject
## 1 0.94595 1.00000 1.00000 1 blood SDY2903 SUB393557
## 2 0.95608 0.88235 0.97727 1 blood SDY2903 SUB393557
## 3 1.00000 1.00000 1.00000 2 blood SDY2903 SUB393557
## 4 1.00000 1.00000 1.00000 3 blood SDY2903 SUB393557
## 5 1.00000 1.00000 1.00000 4 blood SDY2903 SUB393557
## 6 0.90203 NA 1.00000 5 blood SDY2903 SUB393557
## ID
## 1 SDY2903.SUB393557 _D0.SDY2903.SUB393557 .F09D0B_GCTTTATTACGATGATG
## 2 SDY2903.SUB393557 _D0.SDY2903.SUB393557 .F09D0B_CTCTTTGTTTATGTTTG
## 3 SDY2903.SUB393557 _D0.SDY2903.SUB393557 .F09D0B_CACCCAGTTATAGCTAG
## 4 SDY2903.SUB393557 _D0.SDY2903.SUB393557 .F09D0B_CCATTATACACTCTGGG
## 5 SDY2903.SUB393557 _D0.SDY2903.SUB393557 .F09D0B_TTCAATTAAGATTTGTG
## 6 SDY2903.SUB393557 _D7.SDY2903.SUB393557 .F09D7B_TTAGGTAGGTTTTCGAA
print("Public BCR-Seq studies (study x timepoint):")
## [1] "Public BCR-Seq studies (study x timepoint):"
table(train$study_accession, train$timepoint)
##
## 0 7
## 2024_UGA 154454 162910
## EXT100 74825 35902
## SDY2903 54859 62996
IGHV gene usage. The plot below shows the 20 most frequently used heavy-chain (IGH) V genes across all sequences, as a percentage of IGH sequences. Where the alignment reports several ambiguous alleles, the first is used, and allele suffixes are dropped to the gene level.
ighv <- train %>%
filter(locus == "IGH", !is.na(v_call), v_call != "") %>%
mutate(gene = str_remove(str_split_fixed(v_call, ",", 2)[, 1], "[*].*")) %>%
count(gene, name = "n") %>%
mutate(pct = 100 * n / sum(n)) %>%
slice_max(pct, n = 20)
p1 <- ggplot(ighv, aes(x = reorder(gene, pct), y = pct)) +
geom_col(fill = "#1b7837", alpha = 0.85, width = 0.7) +
coord_flip() +
labs(title = "Top 20 IGHV gene usage (public bulk BCR-Seq)",
x = NULL, y = "% of IGH sequences") +
theme_bw(base_size = 12)
p1
Clone size. Sequences are grouped into clones
(clone_id, assigned within each study). The plot below bins
clones by size (number of sequences) and shows what fraction of
sequences fall into each expansion class.
clone_size <- train %>%
filter(!is.na(clone_id)) %>%
count(study_accession, clone_id, name = "clone_size")
seqs_by_class <- clone_size %>%
mutate(class = cut(clone_size, breaks = c(0, 1, 2, 5, 20, Inf),
labels = c("1", "2", "3-5", "6-20", ">20"))) %>%
# weight by clone_size so the y-axis is the fraction of sequences, not clones;
# split by study so each class bar is stacked by each study's contribution
group_by(class, study_accession) %>%
summarise(seqs = sum(clone_size), .groups = "drop") %>%
mutate(pct_seqs = 100 * seqs / sum(seqs))
p2 <- ggplot(seqs_by_class, aes(x = class, y = pct_seqs, fill = study_accession)) +
geom_col(alpha = 0.85, width = 0.7) +
scale_fill_brewer(palette = "Set2") +
labs(title = "Clone size",
subtitle = "Share of sequences by clone size, coloured by study",
x = "Clone size (sequences)", y = "% of sequences", fill = "Study") +
theme_bw(base_size = 12)
p2