# Use inline javascript when specifying input string

**URL:** <https://cwl.discourse.group/t/use-inline-javascript-when-specifying-input-string/963>\
**Category:** CWL Questions\
**Created:** [November 26, 2024, 5:55pm UTC](https://cwl.discourse.group/t/use-inline-javascript-when-specifying-input-string/963 "2024-11-26T17:55:53Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![skgo](https://avatars.discourse-cdn.com/v4/letter/s/7cd45c/32.png) [@skgo](https://cwl.discourse.group/u/skgo)\
**Post date:** [November 26, 2024, 5:55pm UTC](https://cwl.discourse.group/t/use-inline-javascript-when-specifying-input-string/963/1 "2024-11-26T17:55:53Z")

</div>

Is it possible to use inline javascript in order to construct an input string in a workflow? Below is an example of my workflow:

```auto
cwlVersion: v1.2
class: Workflow

requirements:
  InlineJavascriptRequirement: {}

inputs:
  sampleID:
    type: string
  fastq1:
    type: File
  fastq2:
    type: File
  library: 
    type: string
  platform:
    type: string
  platformUnit:
    type: string

outputs:
  out:
    type: File
    outputSource: GATK_AddOrReplaceReadGroups/output_bam

steps:
  GATK_FastqToSam:
    run: ../../tools/GATK/GATK_FastqToSam.cwl
    in:
      fastq1: fastq1
      fastq2: fastq2
      output: $(inputs.sampleID + ".bam") 
      SM: sampleID
    out: [output_bam]
  GATK_AddOrReplaceReadGroups:
    run: ../../tools/GATK/GATK_AddOrReplaceReadGroups.cwl
    in:
      bam:
        source: GATK_FastqToSam/output_bam
      output: $(inputs.sampleID + ".RG.bam") 
      SM: sampleID
      LB: library
      PL: platform
      PU: platformUnit
    out: [output_bam]

```

Specifically, when specifying the input parameter named “output” I would like to concatenate the sampleID string to another string. You can see I’ve tried to do it like so

```auto
output: $(inputs.sampleID + ".RG.bam") 

```

However, cwltool gives me the following error:

```auto
ERROR Tool definition failed validation:
convert_fastq_to_bam.cwl:27:1: checking field 'steps'
convert_fastq_to_bam.cwl:36:3: checking object
                                 'convert_fastq_to_bam.cwl#GATK_AddOrReplaceReadGroups'
convert_fastq_to_bam.cwl:38:5: checking field 'in'
convert_fastq_to_bam.cwl:41:7: checking object
                                     'convert_fastq_to_bam.cwl#GATK_AddOrReplaceReadGroups/output'
                                       Field 'source' references unknown identifier
                                       '$(inputs.sampleID + ".RG.bam")', tried
                                       file:///Users/me/Documents/cwl-demo-pipeline/workflows/alignment/convert_fastq_to_bam.cwl#$(inputs.sampleID
                                       + ".RG.bam")

```

---

<div class="post-metadata">

**Author:** ![tetron](https://yyz2.discourse-cdn.com/free1/user_avatar/cwl.discourse.group/tetron/32/40_2.png) [@tetron](https://cwl.discourse.group/u/tetron)\
**Post date:** [November 27, 2024, 3:17pm UTC](https://cwl.discourse.group/t/use-inline-javascript-when-specifying-input-string/963/2 "2024-11-27T15:17:06Z")

</div>

> [@skgo](#):
>
> ```auto
> GATK_FastqToSam:
> run: ../../tools/GATK/GATK_FastqToSam.cwl
> in:
> fastq1: fastq1
> fastq2: fastq2
> output: $(inputs.sampleID + ".bam") 
> SM: sampleID
> out: [output_bam]
> 
> ```

Yes, you want to do this:

```auto
      output: { valueFrom: '$(inputs.sampleID + ".bam")' }

```

---

<div class="post-metadata">

**Author:** ![mrc](https://yyz2.discourse-cdn.com/free1/user_avatar/cwl.discourse.group/mrc/32/3_2.png) [@mrc](https://cwl.discourse.group/u/mrc)\
**Post date:** [November 27, 2024, 3:49pm UTC](https://cwl.discourse.group/t/use-inline-javascript-when-specifying-input-string/963/3 "2024-11-27T15:49:51Z")

</div>

> [@tetron](#):
>
> ` output: { valueFrom: '$(inputs.sampleID + ".bam")' }`

Or even more concisely ` output: { valueFrom: $(inputs.sampleID).bam }`

---

<div class="post-metadata">

**Author:** ![tetron](https://yyz2.discourse-cdn.com/free1/user_avatar/cwl.discourse.group/tetron/32/40_2.png) [@tetron](https://cwl.discourse.group/u/tetron)\
**Post date:** [November 27, 2024, 4:03pm UTC](https://cwl.discourse.group/t/use-inline-javascript-when-specifying-input-string/963/4 "2024-11-27T16:03:09Z")

</div>

> [@mrc](#):
>
> Or even more concisely ` output: { valueFrom: $(inputs.sampleID).bam }

Michael meant to write:

`output: { valueFrom: $(inputs.sampleID).bam }`

Michael’s version is actually much better, as it is a plain parameter substitution and avoids doing any Javascript evaluation at all.

---

<div class="post-metadata">

**Author:** ![skgo](https://avatars.discourse-cdn.com/v4/letter/s/7cd45c/32.png) [@skgo](https://cwl.discourse.group/u/skgo)\
**Post date:** [December 3, 2024, 4:52pm UTC](https://cwl.discourse.group/t/use-inline-javascript-when-specifying-input-string/963/5 "2024-12-03T16:52:05Z")

</div>

Thank you for your help. I’m trying to run my workflow with the following command:

```auto
cwltool convert_fastq_to_bam.cwl --fastq1 ../../test_data/mysample_R1_001.fastq.gz --fastq2 ../../test_data/mysample_R2_001.fastq.gz --library "Solexa-272222" --platform "illumina" --platformUnit "H0164ALXX140820.2" --sampleID "mysample"

```

but am getting this error:

```auto
INFO [workflow] start
INFO [workflow] starting step GATK_FastqToSam
Expecting value: line 1 column 1 (char 0)
script was:
01 "use strict";
02 var inputs = {
03 "SM": "mysample",
04 "fastq1": {
05 "class": "File",
06 "location": "file:///Users/me/Documents/projects/cwl-demo-pipeline/test_data/mysample_R1_001.fastq.gz",
07 "size": 70944943,
08 "basename": "mysample_R1_001.fastq.gz",
09 "nameroot": "mysample_R1_001.fastq",
10 "nameext": ".gz"
11 },
12 "fastq2": {
13 "class": "File",
14 "location": "file:///Users/me/Documents/projects/cwl-demo-pipeline/test_data/mysample_R2_001.fastq.gz",
15 "size": 77256188,
16 "basename": "mysample_R2_001.fastq.gz",
17 "nameroot": "mysample_R2_001.fastq",
18 "nameext": ".gz"
19 },
20 "output": null
21 };
22 var self = null;
23 var runtime = {
24 "tmpdir": null,
25 "outdir": null
26 };
27 (function(){return ((inputs.sampleID));})()
stdout was: 'undefined'
stderr was: ''

```

Below is what my workflow currently looks like:

```auto
cwlVersion: v1.2
class: Workflow

requirements:
  InlineJavascriptRequirement: {}
  StepInputExpressionRequirement: {}

inputs:
  sampleID:
    type: string
  fastq1:
    type: File
  fastq2:
    type: File
  library: 
    type: string
  platform:
    type: string
  platformUnit:
    type: string

outputs:
  out:
    type: File
    outputSource: GATK_AddOrReplaceReadGroups/output_bam

steps:
  GATK_FastqToSam:
    run: ../../tools/GATK/GATK_FastqToSam.cwl
    in:
      fastq1: fastq1
      fastq2: fastq2
      output: { valueFrom: $(inputs.sampleID).bam }
      SM: sampleID
    out: [output_bam]
  GATK_AddOrReplaceReadGroups:
    run: ../../tools/GATK/GATK_AddOrReplaceReadGroups.cwl
    in:
      bam:
        source: GATK_FastqToSam/output_bam
      output: { valueFrom: $(inputs.sampleID).RG.bam }
      SM: sampleID
      LB: library
      PL: platform
      PU: platformUnit
    out: [output_bam]

```

Is there something I’m overlooking?

edit:  
For what it’s worth, tetron’s original answer runs but produces `undefined.bam` as the value of `output`.

---

<div class="post-metadata">

**Author:** ![mrc](https://yyz2.discourse-cdn.com/free1/user_avatar/cwl.discourse.group/mrc/32/3_2.png) [@mrc](https://cwl.discourse.group/u/mrc)\
**Post date:** [December 3, 2024, 5:06pm UTC](https://cwl.discourse.group/t/use-inline-javascript-when-specifying-input-string/963/6 "2024-12-03T17:06:04Z")

</div>

> [@tetron](#):
>
> output: { valueFrom: $(inputs.sampleID).bam }

Try `output: { valueFrom: $(inputs.SM).bam }`
