Workflow and code used in Mandleywala K. et al 2026 manuscript, "A dietary pan-amino acid dropout screen in vivo reveals a critical role for histidine in T-ALL"
- Abstract
- Reference genomes and annotations
- Computational platform
- Requirements
- Indexing
- Read processing and alignment
- Citation
Dietary interventions show therapeutic potential in cancer, but systematic comparisons are lacking. We performed a dietary pan-amino acid dropout screen in an orthotopic model of NOTCH1-driven T-cell acute lymphoblastic leukemia and identified histidine depletion as uniquely antileukemic. Histidine-restricted diets extended survival of leukemic mice in a dose-dependent manner, while remaining well-tolerated. Mechanistically, multiomic profiling revealed that histidine deprivation-induced ribosome stalling activates GCN2 to suppress cholesterol biosynthesis pathways critical for leukemic proliferation. Dietary cholesterol supplementation partially reverted the antileukemic effects of histidine restriction in vivo. These findings couple histidine levels and translational control to cholesterol metabolism, which can be therapeutically exploited for cancer treatment. Our results suggest that defined dietary amino acid restrictions may expose broader therapeutic opportunities in diseases beyond cancer.
The reference genomes for human (GRCh38; annotation version 113) were obtained from ENSEMBL.
Genome indexing, read alignment and major parts of the processing for next generation sequencing data were done on Euler HPC cluster at ETH, Zurich.
The modules in the codes below refers to applications and libraries available on Euler.
- Python
- R
- STAR
- Bowtie
- Samtools
- Cutadapt
- Subread
- Bedtools
R libraries:
- Tidyverse
- DESeq2
- AnnotationHub
- ensembldb
- org.Hs.eg.db
Create a gentrome file for salmon.
# Extract Genome fasta headers
grep "^>" <(gunzip -c Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz) | cut -d " " -f 1 > decoys.txt
# Remove all ">"
sed -i.bak -e 's/>//g' decoys.txt
# Catenate transcriptome and Genome
cat Homo_sapiens.GRCh38.cdna.all.fa.gz Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz > Homo_sapiens_GRCh38_v113_gentrome.fa.gz
Proceed with indexing:
# Load modules
module load stack/2024-06
module load python/3.11.6
module load star/2.7.10b
module load bowtie/1.3.1
module load samtools/1.17
module load pigz/2.7-oktqzxd
# Directories
dir_in="/path/to/dir"
gen_in="/path/to/dir"
THREADS=128
# Safety first
set -e
# Increase ulimit for STAR
ulimit -n 10240
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Unzipping Genome and Annotation"
echo "-------------------------"
# Unzip for STAR
pigz -p "$THREADS" -d "$gen_in"/*.gz
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Done Unzipping Genome and Annotation"
echo "-------------------------"
echo "-------------------------"
echo "Indexing Genome using STAR"
echo "-------------------------"
# Build Index
STAR \
--runThreadN "$THREADS" \
--runMode genomeGenerate \
--genomeDir "$gen_in"/ \
--genomeFastaFiles "$gen_in"/Homo_sapiens.GRCh38.dna.primary_assembly.fa \
--sjdbGTFfile "$gen_in"/Homo_sapiens.GRCh38.113.gtf \
--sjdbOverhang 99
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Indexing non-target RNA fasta using Bowtie"
echo "-------------------------"
bowtie-build \
--threads "$THREADS" \
"$gen_in"/non_target_rna.fa \
"$gen_in"/non_target_rna
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Indexing CDS fasta using Bowtie"
echo "-------------------------"
bowtie-build \
--threads "$THREADS" \
"$gen_in"/GRCh38_ensembl_cds_plus18_annot.fa \
"$gen_in"/GRCh38_ensembl_cds_plus18_annot
# Index genome for Salmon
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Indexing Genome using Salmon"
echo "-------------------------"
salmon index \
--threads "$THREADS" \
--decoys "$gen_in"/decoys.txt \
--transcripts "$gen_in"/Homo_sapiens_GRCh38_v113_gentrome.fa.gz \
--index "$gen_in"/salmon_index \
--kmerLen 31
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Indexing done!"
echo "-------------------------"
For samples where only RNA-seq was performed:
# Load modules
module load stack/2024-06
module load python/3.11.6
module load star/2.7.10b
module load openjdk/17.0.8.1_1
module load fastqc/0.12.1
module load samtools/1.17
module load subread/2.0.6
module load py-dnaio/0.10.0-l2umcaf
module load py-xopen/1.6.0-o55adyx
module load py-cutadapt/4.4-jfcyzb5
module load pigz/2.7-oktqzxd
# Directories
dir_in="/path/to/dir"
gen_in="/path/to/dir"
THREADS=128
# Safety first
set -e
# Increase ulimit for STAR
ulimit -n 10240
# Quantifying
for file in "$dir_in"/*qc_R1.fastq.gz; do
base=$(basename "$file" _qc_R1.fastq.gz)
date +"%d-%m-%Y %T"
echo "-------------------------"
echo Quantifying "$base"
echo "-------------------------"
salmon quant \
--threads 128 \
--index "$gen_in"/salmon_index \
--libType A \
--gcBias \
--seqBias \
--useVBOpt \
--validateMappings \
--mates1 "$dir_in"/${base}_qc_R1.fastq.gz \
--mates2 "$dir_in"/${base}_qc_R2.fastq.gz \
--output "$dir_in"/${base}_quant
date +"%d-%m-%Y %T"
echo "-------------------------"
echo Done with "$base"
echo "-------------------------"
done
For samples which have matched ribosome profiling data:
Note: featureCounts crashes when -T > 64
# Load modules
module load stack/2024-06
module load python/3.11.6
module load star/2.7.10b
module load openjdk/17.0.8.1_1
module load fastqc/0.12.1
module load samtools/1.17
module load subread/2.0.6
module load py-dnaio/0.10.0-l2umcaf
module load py-xopen/1.6.0-o55adyx
module load py-cutadapt/4.4-jfcyzb5
module load pigz/2.7-oktqzxd
# Directories
dir_in="/path/to/dir"
gen_in="/path/to/dir"
THREADS=128
# Safety first
set -e
# Increase ulimit for STAR
ulimit -n 8192
# QC reads
for file in "$dir_in"/*_R1.fastq.gz; do
base=$(basename "$file" _R1.fastq.gz)
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Cutadapt working on "${base}""
echo "-------------------------"
cutadapt \
-j "$THREADS" \
-q 25 \
-m 25 \
--poly-a \
-a AGATCGGAAGAGCACACGTCTGAACTCCAGTCA \
-A AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT \
-o "$dir_in"/${base}_qc_R1.fastq.gz \
-p "$dir_in"/${base}_qc_R2.fastq.gz \
"$dir_in"/${base}_R1.fastq.gz \
"$dir_in"/${base}_R2.fastq.gz \
1> "$dir_in"/${base}_qc_cutadapt_log.txt
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Cutadapt done processing $base"
echo "-------------------------"
done
# Map with STAR
for file in "$dir_in"/*qc_R1.fastq.gz; do
base=$(basename "$file" _qc_R1.fastq.gz)
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "STAR aligning $base"
echo "-------------------------"
STAR \
--runThreadN "$THREADS" \
--outSAMtype BAM SortedByCoordinate \
--outFilterMultimapNmax 1 \
--genomeDir "$gen_in"/ \
--readFilesCommand gunzip -c \
--readFilesIn "$dir_in"/${base}_qc_R1.fastq.gz "$dir_in"/${base}_qc_R2.fastq.gz \
--outFileNamePrefix "$dir_in"/${base}_ \
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "STAR done aligning $base"
echo "-------------------------"
echo "-------------------------"
echo "Samtool indexing: "${base}_Aligned.sortedByCoord.out.bam""
echo "-------------------------"
# Index the BAM file
samtools index \
-@ "$THREADS" \
"$dir_in"/${base}_Aligned.sortedByCoord.out.bam
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Samtool DONE indexing: "${base}_Aligned.sortedByCoord.out.bam""
echo "-------------------------"
done
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "featureCounts initiating"
echo "-------------------------"
# Exon Counts
featureCounts \
-p \
-T 64 \
-t CDS \
-g gene_id \
-a "$gen_in"/Homo_sapiens.GRCh38.113.gtf \
-o "$dir_in"/jurkat_cds_counts_rawfile_tmp.txt \
"$dir_in"/*Aligned.sortedByCoord.out.bam 2> "$dir_in"/Featurecount_cds_count_log.txt
# Biotypes
featureCounts \
-p \
-T 64 \
-t exon \
-g gene_biotype \
-a "$gen_in"/Homo_sapiens.GRCh38.113.gtf \
-o "$dir_in"/jurkat_biotype_counts_rawfile_tmp.txt \
"$dir_in"/*Aligned.sortedByCoord.out.bam 2> "$dir_in"/Featurecount_biotype_counts_log.txt
# Remove first row
awk '(NR>1)' "$dir_in"/jurkat_cds_counts_rawfile_tmp.txt > "$dir_in"/jurkat_cds_counts_rawfile.txt
awk '(NR>1)' "$dir_in"/jurkat_biotype_counts_rawfile_tmp.txt > "$dir_in"/jurkat_biotype_counts_rawfile.txt
# For HCT
cut -f 1,7- "$dir_in"/jurkat_cds_counts_rawfile.txt > "$dir_in"/jurkat_cds_counts_processed.txt
cut -f 1,7- "$dir_in"/jurkat_biotype_counts_rawfile.txt > "$dir_in"/jurkat_biotype_counts_processed.txt
rm "$dir_in"/jurkat_cds_counts_rawfile_tmp.txt
rm "$dir_in"/jurkat_biotype_counts_rawfile_tmp.txt
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "featureCounts done!"
echo "-------------------------"
echo "-------------------------"
echo "DONE!"
echo "-------------------------"
module load stack/2024-06
module load python/3.11.6
module load bowtie/1.3.1
module load py-dnaio/0.10.0-l2umcaf
module load py-xopen/1.6.0-o55adyx
module load py-cutadapt/4.4-jfcyzb5
module load openjdk/17.0.8.1_1
module load fastqc/0.12.1
module load samtools/1.17
module load pigz/2.7-oktqzxd
# Directories
dir_in="/path/to/dir"
gen_in="/path/to/dir"
THREADS=128
BT_THREADS=118
# Safety first
set -e
for file in "$dir_in"/*.fastq.gz; do
base=$(basename "$file" .fastq.gz)
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Cutadapt working on "${base}""
echo "-------------------------"
cutadapt \
-j "$THREADS" \
--quality-cutoff 30 \
--minimum-length 25 \
--cut 3 \
--no-indels \
--discard-untrimmed \
--adapter CTGTAGGCACCATCAAT \
--output "$dir_in"/${base}_no_adapter.fastq.gz \
"$file" \
1> "$dir_in"/${base}_adapter_removal_cutadapt_log.txt
cutadapt \
-j "$THREADS" \
--quality-cutoff 30 \
--minimum-length 25 \
--cut -6 \
--output "$dir_in"/${base}_clean.fastq.gz \
"$dir_in"/${base}_no_adapter.fastq.gz \
1> "$dir_in"/${base}_trim_cutadapt_log.txt
# remove temporary file
rm "$dir_in"/${base}_no_adapter.fastq.gz
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "Cutadapt done processing "${base}""
echo "-------------------------"
done
# Map to non-target
for file in "$dir_in"/*_clean.fastq.gz; do
base=$(basename "$file" _clean.fastq.gz)
echo "-------------------------"
echo "Bowtie aligning "$base" to non-target RNA"
echo "-------------------------"
bowtie \
--threads "$THREADS" \
--chunkmbs 320 \
--time \
--best \
--sam \
--un "$dir_in"/${base}_no_ncrna.fastq \
-x "$gen_in"/non_target_rna \
-q "$file" \
2> "$dir_in"/${base}_non_target_rna_map_log.txt \
1> /dev/null
echo "-------------------------"
echo "Compressing fastq"
echo "-------------------------"
pigz -p "$THREADS" "$dir_in"/${base}_no_ncrna.fastq
echo "-------------------------"
echo "Bowtie DONE aligning "$base" to non-target RNA"
echo "-------------------------"
done
# Map
for file in "$dir_in"/*_no_ncrna.fastq.gz; do
base=$(basename "$file" _no_ncrna.fastq.gz)
echo "-------------------------"
echo "Bowtie aligning "$base" to CDS"
echo "-------------------------"
bowtie \
--threads "$BT_THREADS" \
--chunkmbs 320 \
--time \
--best \
-v 1 \
-m 1 \
--norc \
--strata \
--sam \
-x "$gen_in"/GRCh38_ensembl_cds_plus18_annot \
-q "$file" \
2> "$dir_in"/${base}_cds_map_log.txt | \
samtools view \
-@ 10 \
-h -bS -F 4 > "$dir_in"/${base}_cds_unsorted.bam
echo "-------------------------"
echo "Samtool sorting: "${base}_cds_unsorted.bam""
echo "-------------------------"
# Sort the BAM file
samtools sort \
-@ "$THREADS" \
-o "$dir_in"/${base}_cds_sorted.bam "$dir_in"/${base}_cds_unsorted.bam
echo "-------------------------"
echo "Samtool indexing: "${base}_cds_sorted.bam""
echo "-------------------------"
# Index the BAM file
samtools index \
-@ "$THREADS" \
"$dir_in"/${base}_cds_sorted.bam
echo "-------------------------"
echo "Cleaning up: Removing unsorted BAM files"
echo "-------------------------"
rm "$dir_in"/${base}_cds_unsorted.bam
echo "-------------------------"
echo "Bowtie DONE aligning "$base""
echo "-------------------------"
done
date +"%d-%m-%Y %T"
echo "-------------------------"
echo "EVERYTHING DONE!"
echo "-------------------------"
A dietary pan-amino acid dropout screen in vivo reveals a critical role for histidine in T-ALL.
Komal Mandleywala, Simona Ulrich, Victoria da Silva-Diz, Puneet Sharma, Christopher Thai, Oekyung Kim, Maya Aleksandrova, Gwendolyn Chung, Cristian Eggers, Dieter Lütjohann, Tanaya Kulkarni, Amartya Singh, M. Elena Díaz-Rubio, Michael Wierer, Sebastian A. Leidel, Xiaoyang Su, Eileen P. White, Joshua D. Rabinowitz, Raphael J. Morscher, Daniel Herranz bioRxiv 2025.12.21.694897; doi: https://doi.org/10.64898/2025.12.21.694897