text: user16328: I'm using bowtie2 to build a small index. After building the index, I want to pass it to the bowtie2 alignment process. The issue is bowtie2-build outputs multiple index files with the .bt2 extension. When I try to provide these index files as an input to the Alignmnet process, it gives the following error:
  
  Error executing process > 'SAM_FOR_STRAND (1)'
  Caused by:   Process SAM_FOR_STRAND (1) terminated with an error
  exit status (255)
  Command executed:
  bowtie2 -t -x index.1.bt2 index.2.bt2 index.3.bt2 index.4.bt2
  index.rev.1.bt2 index.rev.2.bt2 -1 SRR5655560_1.atria.fastq -2
  SRR5655560_2.atria.fastq -S "SRR5655560.sam"
  Command exit status:   255
  Command output:   (empty)
  Command error:   (ERR): "index.1.bt2" does not exist or is not a
  Bowtie 2 index   Exiting now ...
  executor >  local (4) [71/c095e4] process > INDEX              [100%]
  1 of 1 ✔ [1f/35a1e6] process > GTF2BED            [100%] 1 of 1 ✔
  [fa/b1e933] process > TRIM (SRR5655560)  [100%] 1 of 1 ✔ [d6/d47ead]
  process > SAM_FOR_STRAND (1) [100%] 1 of 1, failed: 1 ✘ Error
  executing process > 'SAM_FOR_STRAND (1)'
  Caused by:   Process SAM_FOR_STRAND (1) terminated with an error
  exit status (255)
  Command executed:
  bowtie2 -t -x index.1.bt2 index.2.bt2 index.3.bt2 index.4.bt2
  index.rev.1.bt2 index.rev.2.bt2 -1 SRR5655560_1.atria.fastq -2
  SRR5655560_2.atria.fastq -S "SRR5655560.sam"
  
  The following is simplifies version of the pipeline:
  // Declare syntax version
  nextflow.enable.dsl=2
  
  /* 
   * pipeline input parameters 
   */
  
  
  params.reads = "$projectDir/data/*_{1,2}.fastq"
  params.ref_genome = "$projectDir/data/Glycine_max.Glycine_max_v2.1.dna.toplevel.fa"
  params.gtf_file = "$projectDir/data/Glycine_max.Glycine_max_v2.1.55.gtf"
  params.outdir = "results"
  
  
  
  log.info """\
  
          R N A S E Q - N F   P I P E L I N E    
          ===================================
          reads            : ${params.reads}
          reference genome : ${params.ref_genome}
          gtf              : ${params.gtf_file}
          outdir           : ${params.outdir}
          """
          .stripIndent()
  
  /*
   * define the `index` process that creates a binary index
   * given the reference genome file
   */
  
  process INDEX {
  
    input:
    path ref_genome
  
    output:
    path "index.*"
  
    script:
    """
    bowtie2-build $ref_genome index
    """
  }
  
  /*
   * define the `GTF2BED` process that creates a BED file
   * given the params.gtf_file as input. 
   */
   
  process GTF2BED {
  
      input:
      path gtf
  
      output:
      path "${gtf.baseName}.bed"
  
      script:
      """
      gtf2bed --gtf "${gtf}" --bed "${gtf.baseName}.bed"
      """
  }
  
  
  /*
   * define the `TRIM` process that creates trimmed fastq files
   * given the reads fastq file. 
   */
   
  process TRIM {
  
      tag { pair_id }
  
      input:
      tuple val(pair_id), path(reads)
  
      output:
      tuple val(pair_id), path(trimmed_reads), emit: trimmed_fastqs
      path "${pair_id}/*.atria.log*", emit: logs
  
      script:
      def (r1, r2) = reads
  
      trimmed_reads = reads.collect {
          "${pair_id}/${it.baseName}.atria.fastq"
      }
  
      """
      atria \\
          -r "${r1}" \\
          -R "${r2}" \\
          -o "${pair_id}" \\
          -t 1 \\
          -l 12 \\
          -q 30
      """
  }
  
  /*
   * define the `SAM_FOR_STRAND` process that creates a SAM file
   * to be used by `STRAND_CHECK` process to determine 
   * the strandedness of each fastq file pair. 
   */
   
  process SAM_FOR_STRAND {
  
      input:
      path index
      tuple val(pair_id), path(reads)
  
      output:
      path "${pair_id}.sam"
  
      script:
      """
      bowtie2 -x "${index.baseName}" -1 ${reads[0]} -2 ${reads[1]} -S ${pair_id}.sam
      """
  }
  
  
  workflow {
  
      index_ch = INDEX(params.ref_genome)
  
      gtf2bed_ch=GTF2BED(params.gtf_file)
  
      read_pairs_ch = Channel.fromFilePairs(params.reads, checkIfExists:true)
  
      trim_out = TRIM(read_pairs_ch)
  
      sam_for_strand_ch = SAM_FOR_STRAND(index_ch, TRIM.out.trimmed_fastqs)
  
  }
  
  I've tried passing the index argument directly to the script in the SAM_FOR_STRAND Alignmnet process, it gave the  "index.1.bt2" does not exist error. Then I tried giving the basename of the index files (as shown in the below). It still does not work, even though the index files are being created properly.
   /*
       * define the `SAM_FOR_STRAND` process that creates a SAM file
       * to be used by `STRAND_CHECK` process to determine 
       * the strandedness of each fastq file pair. 
       */
       
      process SAM_FOR_STRAND {
      
          input:
          path index
          tuple val(pair_id), path(reads)
      
          output:
          path "${pair_id}.sam"
      
          script:
          """
          bowtie2 -x "${index.baseName}" -1 ${reads[0]} -2 ${reads[1]} -S ${pair_id}.sam
          """
      }
  
  Best wishes.
  
  user10775: When we run Bowtie2, we just need to make sure we supply the index basename using -x. This is the index filename prefix minus the .X.bt2 extension. A safe assumption is that the first file in the collection of output files (sorted in lexicographical order) has the .1.bt2 suffix. We can then just strip this off to get the required prefix. For example:
  process SAM_FOR_STRAND {
  
      input:
      path index_files, stageAs: "bt2_index/*"
      tuple val(pair_id), path(reads)
  
      output:
      path "${pair_id}.sam"
  
      script:
      def idx = index_files[0].getBaseName(2)    
  
      """
      bowtie2 \\
          -x "${idx}" \\
          -1 "${reads[0]}" \\ 
          -2 "${reads[1]}" \\ 
          -S "${pair_id}.sam"
      """
  }
  
  
original_text: 16328: <p>I'm using bowtie2 to build a small index. After building the index, I want to pass it to the bowtie2 alignment process. The issue is bowtie2-build outputs multiple index files with the .bt2 extension. When I try to provide these index files as an input to the Alignmnet process, it gives the following error:</p>
  <blockquote>
  <p>Error executing process &gt; 'SAM_FOR_STRAND (1)'</p>
  <p>Caused by:   Process <code>SAM_FOR_STRAND (1)</code> terminated with an error
  exit status (255)</p>
  <p>Command executed:</p>
  <p>bowtie2 -t -x index.1.bt2 index.2.bt2 index.3.bt2 index.4.bt2
  index.rev.1.bt2 index.rev.2.bt2 -1 SRR5655560_1.atria.fastq -2
  SRR5655560_2.atria.fastq -S &quot;SRR5655560.sam&quot;</p>
  <p>Command exit status:   255</p>
  <p>Command output:   (empty)</p>
  <p>Command error:   (ERR): &quot;index.1.bt2&quot; does not exist or is not a
  Bowtie 2 index   Exiting now ...</p>
  <p>executor &gt;  local (4) [71/c095e4] process &gt; INDEX              [100%]
  1 of 1 ✔ [1f/35a1e6] process &gt; GTF2BED            [100%] 1 of 1 ✔
  [fa/b1e933] process &gt; TRIM (SRR5655560)  [100%] 1 of 1 ✔ [d6/d47ead]
  process &gt; SAM_FOR_STRAND (1) [100%] 1 of 1, failed: 1 ✘ Error
  executing process &gt; 'SAM_FOR_STRAND (1)'</p>
  <p>Caused by:   Process <code>SAM_FOR_STRAND (1)</code> terminated with an error
  exit status (255)</p>
  <p>Command executed:</p>
  <p>bowtie2 -t -x index.1.bt2 index.2.bt2 index.3.bt2 index.4.bt2
  index.rev.1.bt2 index.rev.2.bt2 -1 SRR5655560_1.atria.fastq -2
  SRR5655560_2.atria.fastq -S &quot;SRR5655560.sam&quot;</p>
  </blockquote>
  <p>The following is simplifies version of the pipeline:</p>
  <pre><code>// Declare syntax version
  nextflow.enable.dsl=2
  
  /* 
   * pipeline input parameters 
   */
  
  
  params.reads = &quot;<span class="math-container">$projectDir/data/*_{1,2}.fastq"
  params.ref_genome = "$</span>projectDir/data/Glycine_max.Glycine_max_v2.1.dna.toplevel.fa&quot;
  params.gtf_file = &quot;$projectDir/data/Glycine_max.Glycine_max_v2.1.55.gtf&quot;
  params.outdir = &quot;results&quot;
  
  
  
  log.info &quot;&quot;&quot;\
  
          R N A S E Q - N F   P I P E L I N E    
          ===================================
          reads            : <span class="math-container">${params.reads}
          reference genome : $</span>{params.ref_genome}
          gtf              : <span class="math-container">${params.gtf_file}
          outdir           : $</span>{params.outdir}
          &quot;&quot;&quot;
          .stripIndent()
  
  /*
   * define the `index` process that creates a binary index
   * given the reference genome file
   */
  
  process INDEX {
  
    input:
    path ref_genome
  
    output:
    path &quot;index.*&quot;
  
    script:
    &quot;&quot;&quot;
    bowtie2-build $ref_genome index
    &quot;&quot;&quot;
  }
  
  /*
   * define the `GTF2BED` process that creates a BED file
   * given the params.gtf_file as input. 
   */
   
  process GTF2BED {
  
      input:
      path gtf
  
      output:
      path &quot;${gtf.baseName}.bed&quot;
  
      script:
      &quot;&quot;&quot;
      gtf2bed --gtf &quot;<span class="math-container">${gtf}" --bed "$</span>{gtf.baseName}.bed&quot;
      &quot;&quot;&quot;
  }
  
  
  /*
   * define the `TRIM` process that creates trimmed fastq files
   * given the reads fastq file. 
   */
   
  process TRIM {
  
      tag { pair_id }
  
      input:
      tuple val(pair_id), path(reads)
  
      output:
      tuple val(pair_id), path(trimmed_reads), emit: trimmed_fastqs
      path &quot;${pair_id}/*.atria.log*&quot;, emit: logs
  
      script:
      def (r1, r2) = reads
  
      trimmed_reads = reads.collect {
          &quot;<span class="math-container">${pair_id}/$</span>{it.baseName}.atria.fastq&quot;
      }
  
      &quot;&quot;&quot;
      atria \\
          -r &quot;<span class="math-container">${r1}" \\
          -R "$</span>{r2}&quot; \\
          -o &quot;${pair_id}&quot; \\
          -t 1 \\
          -l 12 \\
          -q 30
      &quot;&quot;&quot;
  }
  
  /*
   * define the `SAM_FOR_STRAND` process that creates a SAM file
   * to be used by `STRAND_CHECK` process to determine 
   * the strandedness of each fastq file pair. 
   */
   
  process SAM_FOR_STRAND {
  
      input:
      path index
      tuple val(pair_id), path(reads)
  
      output:
      path &quot;${pair_id}.sam&quot;
  
      script:
      &quot;&quot;&quot;
      bowtie2 -x &quot;<span class="math-container">${index.baseName}" -1 $</span>{reads[0]} -2 <span class="math-container">${reads[1]} -S $</span>{pair_id}.sam
      &quot;&quot;&quot;
  }
  
  
  workflow {
  
      index_ch = INDEX(params.ref_genome)
  
      gtf2bed_ch=GTF2BED(params.gtf_file)
  
      read_pairs_ch = Channel.fromFilePairs(params.reads, checkIfExists:true)
  
      trim_out = TRIM(read_pairs_ch)
  
      sam_for_strand_ch = SAM_FOR_STRAND(index_ch, TRIM.out.trimmed_fastqs)
  
  }
  </code></pre>
  <p>I've tried passing the <em>index</em> argument directly to the script in the SAM_FOR_STRAND Alignmnet process, it gave the  &quot;index.1.bt2&quot; does not exist error. Then I tried giving the basename of the index files (as shown in the below). It still does not work, even though the index files are being created properly.</p>
  <pre><code> /*
       * define the `SAM_FOR_STRAND` process that creates a SAM file
       * to be used by `STRAND_CHECK` process to determine 
       * the strandedness of each fastq file pair. 
       */
       
      process SAM_FOR_STRAND {
      
          input:
          path index
          tuple val(pair_id), path(reads)
      
          output:
          path &quot;${pair_id}.sam&quot;
      
          script:
          &quot;&quot;&quot;
          bowtie2 -x &quot;<span class="math-container">${index.baseName}" -1 $</span>{reads[0]} -2 <span class="math-container">${reads[1]} -S $</span>{pair_id}.sam
          &quot;&quot;&quot;
      }
  </code></pre>
  <p>Best wishes.</p>
   10775: <p>When we run Bowtie2, we just need to make sure we supply the index basename using <code>-x</code>. This is the index filename prefix minus the <code>.X.bt2</code> extension. A safe assumption is that the first file in the collection of output files (sorted in lexicographical order) has the <code>.1.bt2</code> suffix. We can then just strip this off to get the required prefix. For example:</p>
  <pre><code>process SAM_FOR_STRAND {
  
      input:
      path index_files, stageAs: &quot;bt2_index/*&quot;
      tuple val(pair_id), path(reads)
  
      output:
      path &quot;${pair_id}.sam&quot;
  
      script:
      def idx = index_files[0].getBaseName(2)    
  
      &quot;&quot;&quot;
      bowtie2 \\
          -x &quot;<span class="math-container">${idx}" \\
          -1 "$</span>{reads[0]}&quot; \\ 
          -2 &quot;<span class="math-container">${reads[1]}" \\ 
          -S "$</span>{pair_id}.sam&quot;
      &quot;&quot;&quot;
  }
  </code></pre>
  