Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

About

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"

Table of contents

Abstract

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.

Reference genomes and annotations

The reference genomes for human (GRCh38; annotation version 113) were obtained from ENSEMBL.

Computational platform

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.

Requirements

  • Python
  • R
  • STAR
  • Bowtie
  • Samtools
  • Cutadapt
  • Subread
  • Bedtools

R libraries:

  • Tidyverse
  • DESeq2
  • AnnotationHub
  • ensembldb
  • org.Hs.eg.db

Indexing

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 "-------------------------"

Read processing and alignment

RNA-seq

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 "-------------------------"

Ribosome profiling

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 "-------------------------"

Citation

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

About

Workflow and code used in Mandleywala K. et al 2026 manuscript

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors