diff --git a/.gitmodules b/.gitmodules index 5ab8bd4c..7d4639eb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -895,3 +895,6 @@ [submodule "vendor/grammars/Sublime-HTTP"] path = vendor/grammars/Sublime-HTTP url = https://github.com/samsalisbury/Sublime-HTTP +[submodule "vendor/grammars/atom-language-nextflow"] + path = vendor/grammars/atom-language-nextflow + url = https://github.com/nextflow-io/atom-language-nextflow diff --git a/grammars.yml b/grammars.yml index 9265ecfd..38e1343e 100755 --- a/grammars.yml +++ b/grammars.yml @@ -195,6 +195,9 @@ vendor/grammars/atom-language-clean: vendor/grammars/atom-language-julia: - source.julia - source.julia.console +vendor/grammars/atom-language-nextflow: +- source.nextflow +- source.nextflow-groovy vendor/grammars/atom-language-p4: - source.p4 vendor/grammars/atom-language-perl6: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 6af524bc..fb645c70 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2905,6 +2905,18 @@ NewLisp: codemirror_mode: commonlisp codemirror_mime_type: text/x-common-lisp language_id: 247 +Nextflow: + type: programming + ace_mode: groovy + tm_scope: source.nextflow + color: "#3ac486" + extensions: + - ".nf" + filenames: + - "nextflow.config" + interpreters: + - nextflow + language_id: 506780613 Nginx: type: data extensions: diff --git a/samples/Nextflow/blast.nf b/samples/Nextflow/blast.nf new file mode 100644 index 00000000..1150d490 --- /dev/null +++ b/samples/Nextflow/blast.nf @@ -0,0 +1,67 @@ +#!/usr/bin/env nextflow +/* + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * For more information, please refer to + */ + +/* + * Author Paolo Di Tommaso + */ + + +params.query = "$HOME/sample.fa" +params.db = "$HOME/tools/blast-db/pdb/pdb" + +process blast { + output: + file top_hits + + """ + blastp -query ${params.query} -db ${params.db} -outfmt 6 \ + | head -n 10 \ + | cut -f 2 > top_hits + """ +} + +process extract { + input: + file top_hits + output: + file sequences + + """ + blastdbcmd -db ${params.db} -entry_batch $top_hits > sequences + """ +} + +process align { + input: + file sequences + echo true + + """ + t_coffee $sequences 2>&- | tee align_result + """ +} diff --git a/samples/Nextflow/callings.nf b/samples/Nextflow/callings.nf new file mode 100755 index 00000000..3c4b60f3 --- /dev/null +++ b/samples/Nextflow/callings.nf @@ -0,0 +1,496 @@ +#!/usr/bin/env nextflow +/* + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * For more information, please refer to + */ + + +/* + * 'CalliNGS-NF' - A Nextflow pipeline for variant calling with NGS data + * + * This pipeline that reproduces steps from the GATK best practics of SNP + * calling with RNAseq data procedure: + * https://software.broadinstitute.org/gatk/guide/article?id=3891 + * + * Anna Vlasova + * Emilio Palumbo + * Paolo Di Tommaso + * Evan Floden + */ + + +/* + * Define the default parameters + */ + +params.genome = "$baseDir/data/genome.fa" +params.variants = "$baseDir/data/known_variants.vcf.gz" +params.blacklist = "$baseDir/data/blacklist.bed" +params.reads = "$baseDir/data/reads/rep1_{1,2}.fq.gz" +params.results = "results" +params.gatk = '/usr/local/bin/GenomeAnalysisTK.jar' +params.gatk_launch = "java -jar $params.gatk" + +log.info "C A L L I N G S - N F v 1.0" +log.info "================================" +log.info "genome : $params.genome" +log.info "reads : $params.reads" +log.info "variants : $params.variants" +log.info "blacklist: $params.blacklist" +log.info "results : $params.results" +log.info "gatk : $params.gatk" +log.info "" + +/* + * Parse the input parameters + */ + +GATK = params.gatk_launch +genome_file = file(params.genome) +variants_file = file(params.variants) +blacklist_file = file(params.blacklist) +reads_ch = Channel.fromFilePairs(params.reads) + + +/********** + * PART 1: Data preparation + * + * Process 1A: Create a FASTA genome index (.fai) with samtools for GATK + */ + +process '1A_prepare_genome_samtools' { + tag "$genome.baseName" + + input: + file genome from genome_file + + output: + file "${genome}.fai" into genome_index_ch + + script: + """ + samtools faidx ${genome} + """ +} + + +/* + * Process 1B: Create a FASTA genome sequence dictionary with Picard for GATK + */ + +process '1B_prepare_genome_picard' { + tag "$genome.baseName" + + input: + file genome from genome_file + output: + file "${genome.baseName}.dict" into genome_dict_ch + + script: + """ + PICARD=`which picard.jar` + java -jar \$PICARD CreateSequenceDictionary R= $genome O= ${genome.baseName}.dict + """ +} + + +/* + * Process 1C: Create STAR genome index file. + */ + +process '1C_prepare_star_genome_index' { + tag "$genome.baseName" + + input: + file genome from genome_file + output: + file "genome_dir" into genome_dir_ch + + script: + """ + mkdir genome_dir + + STAR --runMode genomeGenerate \ + --genomeDir genome_dir \ + --genomeFastaFiles ${genome} \ + --runThreadN ${task.cpus} + """ +} + + +/* + * Process 1D: Create a file containing the filtered and recoded set of variants + */ + +process '1D_prepare_vcf_file' { + tag "$variantsFile.baseName" + + input: + file variantsFile from variants_file + file blacklisted from blacklist_file + + output: + set file("${variantsFile.baseName}.filtered.recode.vcf.gz"), file("${variantsFile.baseName}.filtered.recode.vcf.gz.tbi") into prepared_vcf_ch + + script: + """ + vcftools --gzvcf $variantsFile -c \ + --exclude-bed ${blacklisted} \ + --recode | bgzip -c \ + > ${variantsFile.baseName}.filtered.recode.vcf.gz + + tabix ${variantsFile.baseName}.filtered.recode.vcf.gz + """ +} + +/* + * END OF PART 1 + *********/ + + + +/********** + * PART 2: STAR RNA-Seq Mapping + * + * Process 2: Align RNA-Seq reads to the genome with STAR + */ + +process '2_rnaseq_mapping_star' { + tag "$replicateId" + + input: + file genome from genome_file + file genomeDir from genome_dir_ch + set replicateId, file(reads) from reads_ch + + output: + set replicateId, file('Aligned.sortedByCoord.out.bam'), file('Aligned.sortedByCoord.out.bam.bai') into aligned_bam_ch + + script: + """ + # ngs-nf-dev Align reads to genome + STAR --genomeDir $genomeDir \ + --readFilesIn $reads \ + --runThreadN ${task.cpus} \ + --readFilesCommand zcat \ + --outFilterType BySJout \ + --alignSJoverhangMin 8 \ + --alignSJDBoverhangMin 1 \ + --outFilterMismatchNmax 999 + + # 2nd pass (improve alignmets using table of splice junctions and create a new index) + mkdir genomeDir + STAR --runMode genomeGenerate \ + --genomeDir genomeDir \ + --genomeFastaFiles $genome \ + --sjdbFileChrStartEnd SJ.out.tab \ + --sjdbOverhang 75 \ + --runThreadN ${task.cpus} + + # Final read alignments + STAR --genomeDir genomeDir \ + --readFilesIn $reads \ + --runThreadN ${task.cpus} \ + --readFilesCommand zcat \ + --outFilterType BySJout \ + --alignSJoverhangMin 8 \ + --alignSJDBoverhangMin 1 \ + --outFilterMismatchNmax 999 \ + --outSAMtype BAM SortedByCoordinate \ + --outSAMattrRGline ID:$replicateId LB:library PL:illumina PU:machine SM:GM12878 + + # Index the BAM file + samtools index Aligned.sortedByCoord.out.bam + """ +} + +/* + * END OF PART 2 + ******/ + + +/********** + * PART 3: GATK Prepare Mapped Reads + * + * Process 3: Split reads that contain Ns in their CIGAR string. + * Creates k+1 new reads (where k is the number of N cigar elements) + * that correspond to the segments of the original read beside/between + * the splicing events represented by the Ns in the original CIGAR. + */ + +process '3_rnaseq_gatk_splitNcigar' { + tag "$replicateId" + + input: + file genome from genome_file + file index from genome_index_ch + file genome_dict from genome_dict_ch + set replicateId, file(bam), file(index) from aligned_bam_ch + + output: + set replicateId, file('split.bam'), file('split.bai') into splitted_bam_ch + + script: + """ + # SplitNCigarReads and reassign mapping qualities + $GATK -T SplitNCigarReads \ + -R $genome -I $bam \ + -o split.bam \ + -rf ReassignOneMappingQuality \ + -RMQF 255 -RMQT 60 \ + -U ALLOW_N_CIGAR_READS \ + --fix_misencoded_quality_scores + """ +} + +/* + * END OF PART 3 + ******/ + + +/*********** + * PART 4: GATK Base Quality Score Recalibration Workflow + * + * Process 4: Base recalibrate to detect systematic errors in base quality scores, + * select unique alignments and index + * + */ + +process '4_rnaseq_gatk_recalibrate' { + tag "$replicateId" + + input: + file genome from genome_file + file index from genome_index_ch + file dict from genome_dict_ch + set replicateId, file(bam), file(index) from splitted_bam_ch + set file(variants_file), file(variants_file_index) from prepared_vcf_ch + + output: + set sampleId, file("${replicateId}.final.uniq.bam"), file("${replicateId}.final.uniq.bam.bai") into (final_output_ch, bam_for_ASE_ch) + + script: + sampleId = replicateId.replaceAll(/[12]$/,'') + """ + # Indel Realignment and Base Recalibration + $GATK -T BaseRecalibrator \ + --default_platform illumina \ + -cov ReadGroupCovariate \ + -cov QualityScoreCovariate \ + -cov CycleCovariate \ + -knownSites ${variants_file} \ + -cov ContextCovariate \ + -R ${genome} -I ${bam} \ + --downsampling_type NONE \ + -nct ${task.cpus} \ + -o final.rnaseq.grp + + $GATK -T PrintReads \ + -R ${genome} -I ${bam} \ + -BQSR final.rnaseq.grp \ + -nct ${task.cpus} \ + -o final.bam + + # Select only unique alignments, no multimaps + (samtools view -H final.bam; samtools view final.bam| grep -w 'NH:i:1') \ + |samtools view -Sb - > ${replicateId}.final.uniq.bam + + # Index BAM files + samtools index ${replicateId}.final.uniq.bam + """ +} + +/* + * END OF PART 4 + ******/ + + + +/*********** + * PART 5: GATK Variant Calling + * + * Process 5: Call variants with GATK HaplotypeCaller. + * Calls SNPs and indels simultaneously via local de-novo assembly of + * haplotypes in an active region. + * Filter called variants with GATK VariantFiltration. + */ + + +process '5_rnaseq_call_variants' { + tag "$sampleId" + + input: + file genome from genome_file + file index from genome_index_ch + file dict from genome_dict_ch + set sampleId, file(bam), file(bai) from final_output_ch.groupTuple() + + output: + set sampleId, file('final.vcf') into vcf_files + + script: + """ + # fix absolute path in dict file + sed -i 's@UR:file:.*${genome}@UR:file:${genome}@g' $dict + echo "${bam.join('\n')}" > bam.list + + # Variant calling + $GATK -T HaplotypeCaller \ + -R $genome -I bam.list \ + -dontUseSoftClippedBases \ + -stand_call_conf 20.0 \ + -o output.gatk.vcf.gz + + # Variant filtering + $GATK -T VariantFiltration \ + -R $genome -V output.gatk.vcf.gz \ + -window 35 -cluster 3 \ + -filterName FS -filter "FS > 30.0" \ + -filterName QD -filter "QD < 2.0" \ + -o final.vcf + """ +} + +/* + * END OF PART 5 + ******/ + + +/*********** + * PART 6: Post-process variants file and prepare for Allele-Specific Expression and RNA Editing Analysis + * + * Process 6A: Post-process the VCF result + */ + +process '6A_post_process_vcf' { + tag "$sampleId" + publishDir "$params.results/$sampleId" + + input: + set sampleId, file('final.vcf') from vcf_files + set file('filtered.recode.vcf.gz'), file('filtered.recode.vcf.gz.tbi') from prepared_vcf_ch + output: + set sampleId, file('final.vcf'), file('commonSNPs.diff.sites_in_files') into vcf_and_snps_ch + + script: + ''' + grep -v '#' final.vcf | awk '$7~/PASS/' |perl -ne 'chomp($_); ($dp)=$_=~/DP\\=(\\d+)\\;/; if($dp>=8){print $_."\\n"};' > result.DP8.vcf + + vcftools --vcf result.DP8.vcf --gzdiff filtered.recode.vcf.gz --diff-site --out commonSNPs + ''' +} + +/* + * Process 6B: Prepare variants file for allele specific expression (ASE) analysis + */ + +process '6B_prepare_vcf_for_ase' { + tag "$sampleId" + publishDir "$params.results/$sampleId" + + input: + set sampleId, file('final.vcf'), file('commonSNPs.diff.sites_in_files') from vcf_and_snps_ch + output: + set sampleId, file('known_snps.vcf') into vcf_for_ASE + file('AF.histogram.pdf') into gghist_pdfs + + script: + ''' + awk 'BEGIN{OFS="\t"} $4~/B/{print $1,$2,$3}' commonSNPs.diff.sites_in_files > test.bed + + vcftools --vcf final.vcf --bed test.bed --recode --keep-INFO-all --stdout > known_snps.vcf + + grep -v '#' known_snps.vcf | awk -F '\\t' '{print $10}' \ + |awk -F ':' '{print $2}'|perl -ne 'chomp($_); \ + @v=split(/\\,/,$_); if($v[0]!=0 ||$v[1] !=0)\ + {print $v[1]/($v[1]+$v[0])."\\n"; }' |awk '$1!=1' \ + >AF.4R + + gghist.R -i AF.4R -o AF.histogram.pdf + ''' +} + + +/* + * Group data for allele-specific expression. + * + * The `bam_for_ASE_ch` emites tuples having the following structure, holding the final BAM/BAI files: + * + * ( sample_id, file_bam, file_bai ) + * + * The `vcf_for_ASE` channel emits tuples having the following structure, holding the VCF file: + * + * ( sample_id, output.vcf ) + * + * The BAMs are grouped together and merged with VCFs having the same sample id. Finally + * it creates a channel named `grouped_vcf_bam_bai_ch` emitting the following tuples: + * + * ( sample_id, file_vcf, List[file_bam], List[file_bai] ) + */ + +bam_for_ASE_ch + .groupTuple() + .phase(vcf_for_ASE) + .map{ left, right -> + def sampleId = left[0] + def bam = left[1] + def bai = left[2] + def vcf = right[1] + tuple(sampleId, vcf, bam, bai) + } + .set { grouped_vcf_bam_bai_ch } + + +/* + * Process 6C: Allele-Specific Expression analysis with GATK ASEReadCounter. + * Calculates allele counts at a set of positions after applying + * filters that are tuned for enabling allele-specific expression + * (ASE) analysis + */ + +process '6C_ASE_knownSNPs' { + tag "$sampleId" + publishDir "$params.results/$sampleId" + + input: + file genome from genome_file + file index from genome_index_ch + file dict from genome_dict_ch + set sampleId, file(vcf), file(bam), file(bai) from grouped_vcf_bam_bai_ch + + output: + file "ASE.tsv" + + script: + """ + echo "${bam.join('\n')}" > bam.list + + $GATK -R ${genome} \ + -T ASEReadCounter \ + -o ASE.tsv \ + -I bam.list \ + -sites ${vcf} + """ +} diff --git a/samples/Nextflow/filenames/nextflow.config b/samples/Nextflow/filenames/nextflow.config new file mode 100644 index 00000000..b9f59b8e --- /dev/null +++ b/samples/Nextflow/filenames/nextflow.config @@ -0,0 +1,50 @@ +aws { + region = 'eu-west-1' +} + +cloud { + autoscale { + enabled = true + minInstances = 3 + starvingTimeout = '2 min' + terminateWhenIdle = true + } + imageId = 'ami-78ds78d' + instanceProfile = 'MyRole' + instanceType = 'r4.large' + sharedStorageId = 'fs-76ds76s' + spotPrice = 0.06 + subnetId = 'subnet-8d98d7s' +} + +env { + BAR = 'world' + FOO = 'hola' +} + +mail { + from = 'paolo.ditommaso@gmail.com' + smtp { + auth = true + host = 'email-smtp.us-east-1.amazonaws.com' + password = 'my-secret' + port = 587 + starttls { + enable = true + required = true + } + user = 'my-name' + } +} + +process { + executor = 'slurm' + queue = 'cn-el7' + memory = '16GB' + cpus = 8 + container = 'user/rnaseq-nf:latest' +} + +trace { + fields = 'task_id,name,status,attempt,exit,queue' +} diff --git a/samples/Nextflow/rnaseq.nf b/samples/Nextflow/rnaseq.nf new file mode 100644 index 00000000..c493de8e --- /dev/null +++ b/samples/Nextflow/rnaseq.nf @@ -0,0 +1,135 @@ +#!/usr/bin/env nextflow +/* + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * For more information, please refer to + */ + + +/* + * Proof of concept of a RNAseq pipeline implemented with Nextflow + * + * Authors: + * - Paolo Di Tommaso + * - Emilio Palumbo + * - Evan Floden + */ + + +params.reads = "$baseDir/data/ggal/*_{1,2}.fq" +params.transcriptome = "$baseDir/data/ggal/ggal_1_48850000_49020000.Ggal71.500bpflank.fa" +params.outdir = "." +params.multiqc = "$baseDir/multiqc" + +log.info """\ + R N A S E Q - N F P I P E L I N E + =================================== + transcriptome: ${params.transcriptome} + reads : ${params.reads} + outdir : ${params.outdir} + """ + .stripIndent() + + +transcriptome_file = file(params.transcriptome) +multiqc_file = file(params.multiqc) + + +Channel + .fromFilePairs( params.reads ) + .ifEmpty { error "Cannot find any reads matching: ${params.reads}" } + .into { read_pairs_ch; read_pairs2_ch } + + +process index { + tag "$transcriptome_file.simpleName" + + input: + file transcriptome from transcriptome_file + + output: + file 'index' into index_ch + + script: + """ + salmon index --threads $task.cpus -t $transcriptome -i index + """ +} + + +process quant { + tag "$pair_id" + + input: + file index from index_ch + set pair_id, file(reads) from read_pairs_ch + + output: + file(pair_id) into quant_ch + + script: + """ + salmon quant --threads $task.cpus --libType=U -i index -1 ${reads[0]} -2 ${reads[1]} -o $pair_id + """ +} + +process fastqc { + tag "FASTQC on $sample_id" + + input: + set sample_id, file(reads) from read_pairs2_ch + + output: + file("fastqc_${sample_id}_logs") into fastqc_ch + + + script: + """ + mkdir fastqc_${sample_id}_logs + fastqc -o fastqc_${sample_id}_logs -f fastq -q ${reads} + """ +} + + +process multiqc { + publishDir params.outdir, mode:'copy' + + input: + file('*') from quant_ch.mix(fastqc_ch).collect() + file(config) from multiqc_file + + output: + file('multiqc_report.html') + + script: + """ + cp $config/* . + echo "custom_logo: \$PWD/logo.png" >> multiqc_config.yaml + multiqc . + """ +} + +workflow.onComplete { + println ( workflow.success ? "\nDone! Open the following report in your browser --> $params.outdir/multiqc_report.html\n" : "Oops .. something went wrong" ) +} \ No newline at end of file diff --git a/vendor/README.md b/vendor/README.md index bb824acb..757268ef 100644 --- a/vendor/README.md +++ b/vendor/README.md @@ -239,6 +239,7 @@ This is a list of grammars that Linguist selects to provide syntax highlighting - **NetLinx+ERB:** [amclain/sublime-netlinx](https://github.com/amclain/sublime-netlinx) - **NetLogo:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle) - **NewLisp:** [textmate/lisp.tmbundle](https://github.com/textmate/lisp.tmbundle) +- **Nextflow:** [nextflow-io/atom-language-nextflow](https://github.com/nextflow-io/atom-language-nextflow) - **Nginx:** [brandonwamboldt/sublime-nginx](https://github.com/brandonwamboldt/sublime-nginx) - **Nim:** [Varriount/NimLime](https://github.com/Varriount/NimLime) - **Ninja:** [khyo/language-ninja](https://github.com/khyo/language-ninja) diff --git a/vendor/grammars/atom-language-nextflow b/vendor/grammars/atom-language-nextflow new file mode 160000 index 00000000..a8a91d7e --- /dev/null +++ b/vendor/grammars/atom-language-nextflow @@ -0,0 +1 @@ +Subproject commit a8a91d7e10910282665a565314092397f5aa146c diff --git a/vendor/licenses/grammar/atom-language-nextflow.txt b/vendor/licenses/grammar/atom-language-nextflow.txt new file mode 100644 index 00000000..36e9934d --- /dev/null +++ b/vendor/licenses/grammar/atom-language-nextflow.txt @@ -0,0 +1,25 @@ +--- +type: grammar +name: atom-language-nextflow +license: mit +--- +Copyright (c) 2018 Paolo Di Tommaso +Copyright (c) 2014-2017 Jakehp https://github.com/Jakehp/language-groovy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file