#!/usr/bin/env cwl-runner
cwlVersion: v1.0
class: Workflow

label: fasta2taxa-plot

doc: |
    Input is a fasta file with n>1 samples, with sample id as sequence identifier prefix, and a sample id file.
    The workflow calls open otus and assigns taxa using greengenes. The output are taxa plots. 

requirements:
  ResourceRequirement:
    coresMax: 1
    ramMin: 1024  # just a default, could be lowered
  InlineJavascriptRequirement: {}
  StepInputExpressionRequirement: {}
  MultipleInputFeatureRequirement: {}
  SchemaDefRequirement:
    types:
      - type: enum
        name: level-type
        symbols:
          - Domain
          - Phylum
          - Class
          - Order
          - Family
          - Genus
          - Species
     
hints:
 SoftwareRequirement:
   packages:
     qiime:
       specs: [ "https://identifiers.org/rrid/RRID:SCR_008249" ]
       version: [ "1.9.1" ]



inputs:
    sample-mapping:
        type: File
    min-observations-per-otu:
        type: int?
    min-observations-per-sample:
        type: int?    
    summarize-for-taxonomic-levels:
        type: 
            type: record
            fields:
                numeric: int[]
                labels: level-type[]
    fasta-demultiplexed:
        type: File            
    

outputs:         
          
    taxa-summary-plots:
        type: Directory
        outputSource: [ plot-taxa-summary/results]

    aplha-diversity-results:
        type: File
        outputSource: alpha-diversity/alpha 
       
    beta-diversity-results:
        type: Directory
        outputSource: beta-diversity/results    
    
    error-logs:  
        type: File[]
        doc: Error logs for each step, collected by default and can be empty.
        outputSource: [ 
                cluster/stderr , 
                taxonomy/stderr , 
                otu-table/stderr , 
                sort-table/stderr , 
                filter-otus/stderr , 
                summarize-taxa/stderr , 
                plot-taxa-summary/stderr , 
                alpha-diversity/stderr ,
                beta-diversity/stderr
                 ]  
    results:
        type: 
            type: array
            items:
                - File
                - Directory
        outputSource: [ 
            # sample-mapping ,
            # join-reads/joined ,
            # join-reads/index ,
            # samples-to-fasta/fasta ,
            # samples-to-fasta/log ,
            cluster/results , 
            taxonomy/id2taxonomy ,
            taxonomy/results ,
            otu-table/table ,
            sort-table/table ,
            filter-otus/table ,
            summarize-taxa/results ,
            # alpha-diversity/alpha ,
            # beta-diversity/results
            ]              


steps:
         
    cluster:
        label: pick de novo otus
        run: ../../Tools/qiime/pick_de_novo_otus.cwl
        in:
            fasta: fasta-demultiplexed
        out: [ results , uclust , representative_set , stderr]
    taxonomy:
        label: assign taxonomy
        run: ../../Tools/qiime/assign_taxonomy.cwl
        in:
            fasta: 
                source: cluster/representative_set
                valueFrom: $(self.fasta)
        out: [stderr, results , id2taxonomy]
    otu-table:
        label: make out table
        run: ../../Tools/qiime/make_otu_table.cwl
        in:
            otu-mapping: 
                source: cluster/uclust
                valueFrom: $(self.otus)
            taxonomy-assignment:   taxonomy/id2taxonomy
        out: [ stderr , table ]
    sort-table:
        label: sort otu table by samples
        run: ../../Tools/qiime/sort_otu_table.cwl
        in: 
            otu-biom-table: otu-table/table
            sorted-sample-ids: sample-mapping
        out: [stderr, table]        

    filter-otus:
        label: remove singletons
        run: ../../Tools/qiime/filter_otus_from_otu_table.cwl
        in:
            otu-biom-table: sort-table/table
            min_observation_count:
                source: min-observations-per-otu
                default: 2
        out: [stderr , table ]

    filter-samples:
        label: remove samples with low coverage
        run: ../../Tools/qiime/filter_samples_from_otu_table.cwl
        in:
            otu-biom-table: filter-otus/table
            min_observation_count:
                source: min-observations-per-sample
                default: 100
        out: [stderr , table ]                

    summarize-taxa:
        label: list taxonomic levels
        run: ../../Tools/qiime/summarize_taxa.cwl
        in:
            otu-table: filter-samples/table
            taxonomic-level:
                source: summarize-for-taxonomic-levels
                valueFrom: $(self.numeric) 
        out: [ stderr , results , biom , txt ]  

    alpha-diversity:
        label: alpha diversity
        run: ../../Tools/qiime/alpha_diversity.cwl
        in: 
            otu-table: filter-samples/table
            method:
                default: [ chao1 , PD_whole_tree , shannon , observed_otus ]
            tree: 
                source: cluster/representative_set
                valueFrom: $(self.tree)
        out: [ stderr , alpha ]

    beta-diversity:
        label: beta diversity
        run: ../../Tools/qiime/beta_diversity_through_plots.cwl
        in: 
            otu-table: filter-samples/table
            mapping: sample-mapping
            tree:
                source: cluster/representative_set
                valueFrom: $(self.tree) 
        out: [ stderr , beta , results ]

    plot-taxa-summary:    
        label: plot summaries
        run: ../../Tools/qiime/plot_taxa_summary.cwl
        in:
            taxa-counts-files: 
                source: summarize-taxa/txt
                valueFrom:  |
                    ${ 
                        self.forEach( element => {
                                                    var res = element.location.match(/_L(\d+)/);
                                                    element.pos = res[1]
                                    } );
                        return self.sort(function(a,b){ return a.pos - b.pos } )
                    }
            labels:
                source: summarize-for-taxonomic-levels
                valueFrom: $(self.labels)
        out: [ stderr , results ]