20251106_calderon_rotation.Rproj
apa.csl
assets
barcodes
berkeley_ucsf_bioe_logo.png
Library design for multiplexed CRISPR screens to assess barcode swapping
November 6, 2025
Library design for multiplexed CRISPR screens to assess barcode swapping
November 6, 2025

Gene-enhancer associations (Fishilevich et al., 2017)
Gene-enhancer associations (Fishilevich et al., 2017)
Liebler (2014)
Cohen (2018)
Golden Gate assembly of single lentiviral vectors encoding CRISPR/Cas9 and multiple sgRNA expression cassettes. (Kabadi, Ousterout, Hilton, & Gersbach, 2014)
Enter Cas12A (Cofsky et al., 2020)
Cas12A Library
upload.sh
top_right.png
top_right_logo.png
theme
teal_stripe_background.png
gene gene_effect z_score mean stddev
1 ISCU -3.299316 -3.034026 -2.017645 0.4224325
depmap_K562_CRISPR_z_scores |>
filter(abs(z_score) > 3) |>
arrange(gene_effect) |>
head(71) |>
select(gene) |>
write.table("depmap_essential_genes_70.tsv",sep = "\t", row.names = FALSE)
depmap_K562_CRISPR_z_scores |>
arrange(desc(gene_effect)) |>
head(20) |>
select(gene) |>
write.table("depmap_proliferative_genes_20.tsv",sep = "\t", row.names = FALSE)
depmap_K562_CRISPR_z_scores |>
arrange(abs(gene_effect)) |>
head(30) |>
select(gene) |>
write.table("depmap_non-essential_genes_20.tsv",sep = "\t", row.names = FALSE)# CONSTANTS FROM HSUING ET AL
WTDR <- "AATTTCTACTCTTGTAGAT"
DR1 <- "AATTTCTACTGTCGTAGAT"
DR3 <- "AATTTCTACTCTAGTAGAT"
DR8 <- "AATTTCTCCTCTAGGAGAT"
DR10 <- "AATTCCTACTCTCGTAGGT"
# LIBRARY CONSTANT REGIONS
CLONING_SITE <- "GTAGATCGAGACGGTTGTATTTGTACGTCTCAAATTTCTCCTCT"
END_HOMOLOGY <- "ACTGCTTTTTGCTTGTACT"
# Database sources for barcodes, guides
#barcodes generated using https://github.com/finkelsteinlab/freebarcodes
barcodes <- readLines("barcodes/barcodes12-2.txt")
# dolcetto from https://www.addgene.org/pooled-library/broadgpp-human-crispri-dolcetto/
# dolcetto file: https://media.addgene.org/cms/filer_public/1c/59/1c59fe51-ef6e-44bf-963a-598edadcd66f/broadgpp-dolcetto-targets-seta.txt
dolcetto <- read.delim("broadgpp-dolcetto-targets-seta.txt", stringsAsFactors = FALSE)
dolcetto_guides_from_genes <- function(dolcetto_df, genes, group_name) {
dolcetto_df %>%
filter(Annotated.Gene.Symbol %in% genes$gene) %>%
select(-Annotated.Gene.ID) %>%
rename(
gene = Annotated.Gene.Symbol,
guide = Barcode.Sequence
) %>%
mutate(group = group_name) %>%
arrange(gene) %>%
group_by(gene) %>%
mutate(guide_num = row_number()) %>%
ungroup() %>%
pivot_wider(
id_cols = c(gene, group),
names_from = guide_num,
values_from = guide,
names_prefix = "guide"
) %>%
select(group, gene, starts_with("guide"))
}
depmap_70_essential <- read.table("depmap_essential_genes_70.tsv", sep = "\t", header = TRUE)
essential <- dolcetto_guides_from_genes(dolcetto, depmap_70_essential, "essential")
depmap_20_nonessential <- read.table("depmap_non-essential_genes_20.tsv", sep = "\t", header = TRUE)
nonessential <- dolcetto_guides_from_genes(dolcetto, depmap_20_nonessential, "non-essential")
ntc <- dolcetto %>%
# Filter only "NO-TARGET" rows
filter(Annotated.Gene.Symbol == "NO-TARGET") %>%
# Drop unnecessary column
select(-Annotated.Gene.ID) %>%
# Rename columns
rename(
gene = Annotated.Gene.Symbol,
guide = Barcode.Sequence
) %>%
# Add a group column (optional)
# Arrange by gene (though all are "NO-TARGET")
arrange(gene) %>%
# Assign group numbers for every 3 rows
mutate(group_id = (row_number() - 1) %/% 3 + 1) %>%
# Number guides within each group
group_by(group_id) %>%
mutate(guide_number = row_number()) %>%
ungroup() %>%
# Pivot wider so each group becomes one row
pivot_wider(
id_cols = group_id,
names_from = guide_number,
values_from = guide,
names_prefix = "guide"
) %>%
#ok now we have essential, nonessential, and ntc as dfs with these 5 columns:
#group, gene, guide1, guide2, guide3
full_library <- bind_rows(essential, nonessential, ntc)
full_library <- bind_cols( full_library, barcode = barcodes[1:nrow(full_library)])
full_library <- full_library %>%
mutate(dr1 = WTDR) %>%
mutate(dr2 = DR1) %>%
mutate(cs = CLONING_SITE) %>%
mutate(end_homol = END_HOMOLOGY ) %>%
select(group, gene, dr1, guide1, dr2, guide2, cs, barcode, end_homol)
idt_library <- full_library %>%
mutate(
sequence = paste0(dr1, guide1, dr2, guide2, cs, barcode, end_homol),
`Pool name` = "cas12_essentiality_screen" # replace with the desired pool value
) %>%
select(`Pool name`, sequence)
write_xlsx(idt_library, "idt_library_cas12_screen.xlsx")# A tibble: 6 × 7
dr1 guide1 dr2 guide2 cs barcode end_homol
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 AATTTCTACTCTTGTAGAT CGAGGACGGGCCGGGCACGA AATTT… CGGGC… AATT… AACAAC… AATTCCTA…
2 AATTTCTACTCTTGTAGAT GCCTTCGAGTCCTGGGGCGG AATTT… GCGGC… AATT… AACAAC… AATTCCTA…
3 AATTTCTACTCTTGTAGAT GACGCGGCGCTGCTCCATGG AATTT… GCGCG… AATT… AACAAG… AATTCCTA…
4 AATTTCTACTCTTGTAGAT CAGCCCTCGCGTGTACCTGA AATTT… CCTGA… AATT… AACACC… AATTCCTA…
5 AATTTCTACTCTTGTAGAT ACCGAAAGGGCCATGACGCG AATTT… GAAAG… AATT… AACAGG… AATTCCTA…
6 AATTTCTACTCTTGTAGAT CACCGAATTGAAGAGCATCA AATTT… GCGAT… AATT… AACCAC… AATTCCTA…
# A tibble: 6 × 7
dr1 guide1 dr2 guide2 barcode cs end_homol
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 AATTTCTACTCTTGTAGAT CGAGGACGGGCCGGGCACGA AATTT… CGGGC… AACAAC… AATT… AATTCCTA…
2 AATTTCTACTCTTGTAGAT GCCTTCGAGTCCTGGGGCGG AATTT… GCGGC… AACAAC… AATT… AATTCCTA…
3 AATTTCTACTCTTGTAGAT GACGCGGCGCTGCTCCATGG AATTT… GCGCG… AACAAG… AATT… AATTCCTA…
4 AATTTCTACTCTTGTAGAT CAGCCCTCGCGTGTACCTGA AATTT… CCTGA… AACACC… AATT… AATTCCTA…
5 AATTTCTACTCTTGTAGAT ACCGAAAGGGCCATGACGCG AATTT… GAAAG… AACAGG… AATT… AATTCCTA…
6 AATTTCTACTCTTGTAGAT CACCGAATTGAAGAGCATCA AATTT… GCGAT… AACCAC… AATT… AATTCCTA…

Show flow data


Thank you!


Source: Diego