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 .

Experimental protocol

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.

Data Standardization

Bulk BCR-Seq data generated for CMI-Flu was combined with other publicly-available data.

The 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.

Data tables

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 exploration

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