I'm trying to use the code specified in this link to create a .bam file without the need for a .sam file.

Here is the code I'm using:

bwa mem -R "@RG\tID:$SAMPLE\tPL:illumina\tSM:$SAMPLE" \
    $REF_PATH/hg38.fasta \
    mapping/R1.fastq.gz \
    mapping/R2.fastq.gz | \
    samtools sort - | \
    tee mapping/$SAMPLE\.bam | \
    samtools index - mapping/$SAMPLE\.bam.bai \
    2>> log

and I get the following error:

[M::bwa_idx_load_from_disk] read 0 ALT contigs
`[E::main_mem] fail to open file ` '.

The ref path and file locations work when creating and converting a .sam to a .bam file. Any ideas?

  • $\begingroup$ The problem is not in skipping the intermediate .sam format, but already the mapping step. $\endgroup$ Commented Oct 22, 2020 at 10:40
  • 2
    $\begingroup$ That link does not contain that code — is there a different link it does come from? (Whatever tutorial it's from would benefit from an update. Writing the BAM file via tee so that you can pipe to samtools index is such a spectacular anti-pattern. Though it's unfortunate that sort is one of the subcommands that does not yet support samtools's new --write-index option.) $\endgroup$ Commented Oct 22, 2020 at 11:08
  • $\begingroup$ Ha, I was wrong, the index is indeed loaded. The reads are not... The expected log should look like this: mapping [M::bwa_idx_load_from_disk] read 0 ALT contigs [M::process] read 1006360 sequences (150000291 bp)... ... Then I would follow @Bastian Schiffthaler's answer to find what's the problem with your reads. $\endgroup$ Commented Oct 22, 2020 at 12:12
  • $\begingroup$ It turns out samtools sort does support --write-index since 1.10 after all. So this can be written more simply as bwa … | samtools sort --write-index -o mapping/$SAMPLE.bam - (plus a little more if you want to use a BAI index rather than ‑‑write-index's default CSI). $\endgroup$ Commented Nov 19, 2020 at 9:31

2 Answers 2


This is an error from bwa saying that it can't find your input files:

Here's a checklist:

  1. Check that you have no whitespace after your \ newline breaks. I.e. \ is the very last character
  2. Check that you have no whitespace in any path names
  3. Quote your variables: $REF_PATH -> "$REF_PATH"
  4. Use set -x at the top of your bash script to debug.
  5. In general, read this

Why make this so complicated with the tee command?

I don't think you even can index an unsorted bam, so you have to wait until sorting is done before you index. Indexing is really short compared to mapping and sorting, you aren't saving much by trying to do both at once.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.