<p>You should have also received the following Nextflow warning:</p>
<pre><code>WARN: Input tuple does not match tuple declaration in process `samtools_index`
</code></pre>
<p>Specifically, the problem is that the output of your <em>convert_sam_to_bam</em> process is:</p>
<pre><code>tuple val(replicateId), path(&quot;${replicateId}.Aligned.bam&quot;), path(&quot;${replicateId}.Aligned.sorted.bam&quot;)
</code></pre>
<p>But the <em>samtools_index</em> process is expecting:</p>
<pre><code>tuple val(replicateId), path(&quot;${replicateId}.Aligned.sorted.bam&quot;)
</code></pre>
<hr />
<p>If you would like to declare multiple output channels, you can use the <code>emit</code> keyword (this is documented under <a href="https://www.nextflow.io/docs/latest/process.html#additional-options" rel="nofollow noreferrer">additional options</a>) to define names for the output channel(s). For example:</p>
<pre><code>process convert_sam_to_bam {

    input:
    tuple val(replicateId), path(&quot;${replicateId}.Aligned.sam&quot;)

    output:
    tuple val(replicateId), path(&quot;<span class="math-container">${replicateId}.Aligned.bam"), emit: aligned_bam
    tuple val(replicateId), path("$</span>{replicateId}.Aligned.sorted.bam&quot;), emit: sorted_bam

    script:
    &quot;&quot;&quot;
    samtools view \\
        -b \\
        -o &quot;<span class="math-container">${replicateId}.Aligned.bam" \\
        "$</span>{replicateId}.Aligned.sam&quot;

    samtools sort \\
        -o &quot;<span class="math-container">${replicateId}.Aligned.sorted.bam" \\
        "$</span>{replicateId}.Aligned.bam&quot;
    &quot;&quot;&quot;
}
</code></pre>
<pre><code>workflow {

    ...

    samtools_index( convert_sam_to_bam.out.sorted_bam )
}
</code></pre>
<hr />
<p>Otherwise, either change the <em>convert_sam_to_bam</em> output declaration to:</p>
<pre><code>tuple val(replicateId), path(&quot;${replicateId}.Aligned.sorted.bam&quot;)
</code></pre>
<p>Or use the <a href="https://www.nextflow.io/docs/latest/operator.html#map" rel="nofollow noreferrer">map</a> operator to get what you want, for example:</p>
<pre><code>workflow {

    ...

    samtools_index(
        convert_sam_to_bam.out.map { rep, aligned, sorted -&gt; tuple( rep, sorted ) }
    )
}
</code></pre>
<hr />
<p>Note that a separate indexing process can be avoided using newer versions of <a href="https://www.htslib.org/doc/samtools.html" rel="nofollow noreferrer">samtools</a> with the <code>--write-index</code> option:</p>
<blockquote>
<p>To convert a SAM to a compressed BAM using BAI indexing: <code>samtools view --write-index in.sam -o out.bam##idx##out.bam.bai</code></p>
</blockquote>

CC BY-SA 4.0
2024-09-17T20:38:01.537Z
Thanks a lot! This was helpful.
siddhartha das
CC BY-SA 4.0
2024-09-15T15:00:55.843Z
2024-09-15T15:00:55.843Z
Steve
<p>I am a beginner to Nextflow  and using it to setup Chipseq workflow and in the workflow below the samtools_index process throws the following error:</p>
<pre><code>[E::hts_idx_push] Chromosome blocks not continuous
  [E::sam_index] Read 'FCC1L20ACXX:4:1101:1645:2230#0/1' with ref_name='chr17', ref_length=83257441, flags=16, pos=58851543 cannot be indexed
  samtools index: failed to create index for &quot;TCDD_plus_E2_ERa_Rep_1_ChIPSeq_first_1000.Aligned.sorted.bam&quot;: Inappropriate ioctl for device
</code></pre>
<p>The command executed is:</p>
<pre><code>/Users/siddhaduio.no/Desktop/All_omics_tools/samtools-1.14/samtools index TCDD_plus_E2_ERa_Rep_1_ChIPSeq_first_1000.Aligned.sorted.bam
</code></pre>
<p>However, when I index the BAM file outside of nextflow, it runs without any problems. I was wondering what might be the issue here?</p>
<pre><code>#!/usr/bin/env nextflow

nextflow.enable.dsl = 2

params.genome = '/Users/siddhaduio.no/Desktop/All_omics_tools/bowtie2-2.4.4-macos-x86_64/hg38_index/human_hg38_index.*.bt2'
params.reads = '/Volumes/matthews/AHR_ER_project_files/FASTQ/TCDD_plus_E2_ERa_Rep_{1,2,4}_ChIPSeq_first_1000.fastq'
params.results = '/Volumes/matthews/AHR_ER_project_files/FASTQ/results'



/*
* Process to align chip seq reads to genome with bowtie2
*/


process mapping {

publishDir '/Volumes/matthews/AHR_ER_project_files/FASTQ/results', mode: 'copy'

input:

path genomeDir

tuple val(replicateId), path(reads)



output:

tuple val(replicateId), path(&quot;${replicateId}.Aligned.sam&quot;)


script:

def btw2_index = genomeDir[0].simpleName

&quot;&quot;&quot;
/Users/siddhaduio.no/Desktop/All_omics_tools/bowtie2-2.4.4-macos-x86_64/bowtie2 -p 64 -q -x <span class="math-container">${btw2_index} -U $</span>{reads.join(',')} -S <span class="math-container">${replicateId}.Aligned.sam 2&gt; $</span>{replicateId}.bowtie.log


&quot;&quot;&quot;


}

process convert_sam_to_bam {



publishDir '/Volumes/matthews/AHR_ER_project_files/FASTQ/results', mode: 'copy'

input:


tuple val(replicateId), path(&quot;${replicateId}.Aligned.sam&quot;)



output:

tuple val(replicateId), path(&quot;<span class="math-container">${replicateId}.Aligned.bam"), path("$</span>{replicateId}.Aligned.sorted.bam&quot;)


script:

&quot;&quot;&quot;

/Users/siddhaduio.no/Desktop/All_omics_tools/samtools-1.14/samtools view -S -b -o <span class="math-container">${replicateId}.Aligned.bam $</span>{replicateId}.Aligned.sam 
/Users/siddhaduio.no/Desktop/All_omics_tools/samtools-1.14/samtools sort --output-fmt BAM -o <span class="math-container">${replicateId}.Aligned.sorted.bam $</span>{replicateId}.Aligned.bam
rm ${replicateId}.Aligned.sam


&quot;&quot;&quot;


}


process samtools_index {



publishDir '/Volumes/matthews/AHR_ER_project_files/FASTQ/results', mode: 'copy'

input:


tuple val(replicateId), path(&quot;${replicateId}.Aligned.sorted.bam&quot;)



output:

tuple val(replicateId), path(&quot;${replicateId}.Aligned.sorted.bam.bai&quot;)


script:

&quot;&quot;&quot;

/Users/siddhaduio.no/Desktop/All_omics_tools/samtools-1.14/samtools index ${replicateId}.Aligned.sorted.bam


&quot;&quot;&quot;


}


workflow{

reads_ch= Channel.fromPath(params.reads).map { fastq -&gt; tuple(fastq.simpleName, fastq)}
index_ch= files(params.genome)
reads_ch
index_ch
mapping(index_ch,reads_ch)
convert_sam_to_bam(mapping.out)
samtools_index(convert_sam_to_bam.out)


}

<span class="math-container">```</span>
</code></pre>

<nextflow>
Samtools index fails within nextflow workflow but not outside of it
# Samtools index fails within nextflow workflow but not outside of it

(Asked by: username_0 on 2024-09-14)

I am a beginner to Nextflow  and using it to setup Chipseq workflow and in the workflow below the samtools_index process throws the following error:
[E::hts_idx_push] Chromosome blocks not continuous
  [E::sam_index] Read 'FCC1L20ACXX:4:1101:1645:2230#0/1' with ref_name='chr17', ref_length=83257441, flags=16, pos=58851543 cannot be indexed
  samtools index: failed to create index for "TCDD_plus_E2_ERa_Rep_1_ChIPSeq_first_1000.Aligned.sorted.bam": Inappropriate ioctl for device

The command executed is:
/Users/siddhaduio.no/Desktop/All_omics_tools/samtools-1.14/samtools index TCDD_plus_E2_ERa_Rep_1_ChIPSeq_first_1000.Aligned.sorted.bam

However, when I index the BAM file outside of nextflow, it runs without any problems. I was wondering what might be the issue here?
#!/usr/bin/env nextflow

nextflow.enable.dsl = 2

params.genome = '/Users/siddhaduio.no/Desktop/All_omics_tools/bowtie2-2.4.4-macos-x86_64/hg38_index/human_hg38_index.*.bt2'
params.reads = '/Volumes/matthews/AHR_ER_project_files/FASTQ/TCDD_plus_E2_ERa_Rep_{1,2,4}_ChIPSeq_first_1000.fastq'
params.results = '/Volumes/matthews/AHR_ER_project_files/FASTQ/results'



/*
* Process to align chip seq reads to genome with bowtie2
*/


process mapping {

publishDir '/Volumes/matthews/AHR_ER_project_files/FASTQ/results', mode: 'copy'

input:

path genomeDir

tuple val(replicateId), path(reads)



output:

tuple val(replicateId), path("${replicateId}.Aligned.sam")


script:

def btw2_index = genomeDir[0].simpleName

"""
/Users/siddhaduio.no/Desktop/All_omics_tools/bowtie2-2.4.4-macos-x86_64/bowtie2 -p 64 -q -x ${btw2_index} -U ${reads.join(',')} -S ${replicateId}.Aligned.sam 2> ${replicateId}.bowtie.log


"""


}

process convert_sam_to_bam {



publishDir '/Volumes/matthews/AHR_ER_project_files/FASTQ/results', mode: 'copy'

input:


tuple val(replicateId), path("${replicateId}.Aligned.sam")



output:

tuple val(replicateId), path("${replicateId}.Aligned.bam"), path("${replicateId}.Aligned.sorted.bam")


script:

"""

/Users/siddhaduio.no/Desktop/All_omics_tools/samtools-1.14/samtools view -S -b -o ${replicateId}.Aligned.bam ${replicateId}.Aligned.sam 
/Users/siddhaduio.no/Desktop/All_omics_tools/samtools-1.14/samtools sort --output-fmt BAM -o ${replicateId}.Aligned.sorted.bam ${replicateId}.Aligned.bam
rm ${replicateId}.Aligned.sam


"""


}


process samtools_index {



publishDir '/Volumes/matthews/AHR_ER_project_files/FASTQ/results', mode: 'copy'

input:


tuple val(replicateId), path("${replicateId}.Aligned.sorted.bam")



output:

tuple val(replicateId), path("${replicateId}.Aligned.sorted.bam.bai")


script:

"""

/Users/siddhaduio.no/Desktop/All_omics_tools/samtools-1.14/samtools index ${replicateId}.Aligned.sorted.bam


"""


}


workflow{

reads_ch= Channel.fromPath(params.reads).map { fastq -> tuple(fastq.simpleName, fastq)}
index_ch= files(params.genome)
reads_ch
index_ch
mapping(index_ch,reads_ch)
convert_sam_to_bam(mapping.out)
samtools_index(convert_sam_to_bam.out)


}

```

**Tags:** nextflow

---

## 1 answers

### Answer by username_1 on 2024-09-15. Score: 2 | Accepted answer

You should have also received the following Nextflow warning:
WARN: Input tuple does not match tuple declaration in process `samtools_index`

Specifically, the problem is that the output of your convert_sam_to_bam process is:
tuple val(replicateId), path("${replicateId}.Aligned.bam"), path("${replicateId}.Aligned.sorted.bam")

But the samtools_index process is expecting:
tuple val(replicateId), path("${replicateId}.Aligned.sorted.bam")


If you would like to declare multiple output channels, you can use the emit keyword (this is documented under additional options) to define names for the output channel(s). For example:
process convert_sam_to_bam {

    input:
    tuple val(replicateId), path("${replicateId}.Aligned.sam")

    output:
    tuple val(replicateId), path("${replicateId}.Aligned.bam"), emit: aligned_bam
    tuple val(replicateId), path("${replicateId}.Aligned.sorted.bam"), emit: sorted_bam

    script:
    """
    samtools view \\
        -b \\
        -o "${replicateId}.Aligned.bam" \\
        "${replicateId}.Aligned.sam"

    samtools sort \\
        -o "${replicateId}.Aligned.sorted.bam" \\
        "${replicateId}.Aligned.bam"
    """
}

workflow {

    ...

    samtools_index( convert_sam_to_bam.out.sorted_bam )
}


Otherwise, either change the convert_sam_to_bam output declaration to:
tuple val(replicateId), path("${replicateId}.Aligned.sorted.bam")

Or use the map operator to get what you want, for example:
workflow {

    ...

    samtools_index(
        convert_sam_to_bam.out.map { rep, aligned, sorted -> tuple( rep, sorted ) }
    )
}


Note that a separate indexing process can be avoided using newer versions of samtools with the --write-index option:

To convert a SAM to a compressed BAM using BAI indexing: samtools view --write-index in.sam -o out.bam##idx##out.bam.bai

> **Comments:**
> **username_0**: Thanks a lot! This was helpful.  

---

