付録E: コード例

ワークフロー例の読み方

この付録のコードは、各コードブロック直前のラベル(🧪 概念例 / 🔁 疑似コード / ⚠️ 環境依存 / ✅ 実行検証済み)に従って読み分けます。多くは処理順序、設定項目、ログ設計を説明するための断片であり、読者がそのまま本番データに適用することは想定しません。実行検証済み例として扱う場合は、入力データ、参照配列、ツールバージョン、container/conda 環境、実行profile、期待される出力、実行時間、失敗時の確認ポイントを別途固定します。

既存の公開ワークフローを使える領域では、手元の Snakemake/Nextflow 断片を書き足す前に、nf-core などの community-maintained なワークフローを候補に入れます。nf-core は Nextflow pipeline の利用・開発・貢献方法を公式ドキュメントで整理しており、導入時は pipeline release、test profile、container、ライセンス、入力サンプルシート、出力仕様を確認します(確認日: 2026-05-12)。

種類 この付録での扱い 実務で確認すること
実行検証済み tiny data とCIで再現できる短い例に限定する 入力、出力、依存関係、バージョン、実行時間、失敗時ログ
概念例 処理順序や設計意図を示す。外部ツールや入力は未固定 実行前にパス、profile、container、参照データ、ライセンスを固定
疑似コード API設計や分岐条件など、実装方針を説明する 実行可能コードと誤認されない見出し・注記
環境依存 HPC、クラウド、GPU、JIT、外部DBなどに依存する例 実行環境、リソース上限、利用規約、監査ログ

WDL / CWL の位置づけ

Nextflow と Snakemake は研究室・解析チーム内の実装や運用でよく使われます。一方、WDL と CWL は、ワークフロー記述を標準化し、実行エンジンや共有先を意識して仕様に沿って記述する場面で検討します。OpenWDL は WDL を task と workflow で構成される open standard として説明しており、CWL は command-line tool based workflows を記述する free/open standard を提供しています(確認日: 2026-05-12)。

観点 Nextflow Snakemake WDL CWL
主な用途 大規模パイプライン、クラウド/HPC、nf-core 研究室内の依存関係付き処理、ファイルベースのDAG task/workflow 単位の標準的なワークフロー記述 コマンドラインツール中心の標準的なワークフロー記述
強み profile、resume、container、community pipeline Python との親和性、ルール単位の記述 人間が読み書きしやすいDSL、scatter-gather等 仕様・実装の相互運用性、ツール記述の再利用
注意点 Nextflow自体のversion、profile、executor差を固定する conda/container、ファイル命名、rerun条件を固定する 実行エンジン、runtime、入力JSON、仕様versionを明示する CWL version、実装、DockerRequirement等を明示する
この付録での例 環境依存 環境依存 比較表のみ 比較表のみ

ゲノムデータ処理の完全な例

このコード例は統合パイプラインの制御構造を示す疑似コードです。load_dataquality_controlanalyzegenerate_report は未実装であり、入力ファイル、config.yaml、依存ライブラリ、外部ツール、検証済み環境も固定していません。 🔁 疑似コード(実行不可: 統合パイプライン制御構造の説明)

"""
完全なゲノム解析パイプラインの実装例
"""

import logging
from pathlib import Path
import yaml

class GenomicsPipeline:
    """統合ゲノム解析パイプライン"""
    
    def __init__(self, config_file):
        """
        設定ファイルからパイプラインを初期化
        
        Args:
            config_file: YAML形式の設定ファイル
        """
        with open(config_file, 'r') as f:
            self.config = yaml.safe_load(f)
            
        self.setup_logging()
        self.setup_directories()
        
    def setup_logging(self):
        """ロギングの設定"""
        logging.basicConfig(
            level=getattr(logging, self.config['logging']['level']),
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            handlers=[
                logging.FileHandler(self.config['logging']['file']),
                logging.StreamHandler()
            ]
        )
        self.logger = logging.getLogger(__name__)
        
    def setup_directories(self):
        """作業ディレクトリの作成"""
        for dir_path in ['output', 'temp', 'logs']:
            Path(self.config['paths'][dir_path]).mkdir(
                parents=True, exist_ok=True
            )
    
    def run(self):
        """パイプラインの実行"""
        try:
            self.logger.info("Starting genomics pipeline")
            
            # 1. データ読み込み
            data = self.load_data()
            
            # 2. 品質管理
            qc_data = self.quality_control(data)
            
            # 3. 解析
            results = self.analyze(qc_data)
            
            # 4. レポート生成
            self.generate_report(results)
            
            self.logger.info("Pipeline completed successfully")
            
        except Exception as e:
            self.logger.error(f"Pipeline failed: {e}")
            raise

設定ファイルの例

この設定例は構成項目の見本です。実在パス、利用可能なリソース、ツール版、データ利用条件、ログ保存先を実環境に合わせて確認してください。 🧪 概念例

# config.yaml
paths:
  input: /data/input
  output: /data/output
  temp: /data/temp
  logs: /data/logs

logging:
  level: INFO
  file: /data/logs/pipeline.log

analysis:
  min_quality: 20
  min_coverage: 10
  threads: 8

resources:
  memory: 32G
  time: 24:00:00

ミニワークフロー(Snakemake 例)

この Snakemake 例は処理順序を示す環境依存の断片です。実行には Snakemake、BWA、samtools、bcftools、参照FASTA index、入力FASTQ、conda/container定義、出力検証が必要です。実行検証済み例ではありません。 ⚠️ 環境依存(実行未検証: 要 Snakemake/BWA/samtools/bcftools と参照データ)

# Snakefile (最小例)
rule all:
    input: "results/sample.vcf"

rule map:
    input:
        ref = "ref.fa",
        r1 = "data/sample_R1.fq.gz",
        r2 = "data/sample_R2.fq.gz"
    output:
        bam = "results/sample.sorted.bam"
    shell:
        """
        bwa mem -t 8 {input.ref} {input.r1} {input.r2} \
          | samtools view -bS - \
          | samtools sort -o {output.bam}
        samtools index {output.bam}
        """

rule call:
    input:
        ref = "ref.fa",
        bam = "results/sample.sorted.bam"
    output:
        vcf = "results/sample.vcf"
    shell:
        """
        bcftools mpileup -Ou -f {input.ref} {input.bam} \
          | bcftools call -mv -Ov -o {output.vcf}
        """

ミニワークフロー(Nextflow 例)

この Nextflow 例は処理順序を示す環境依存の断片です。実行には Nextflow、BWA、samtools、bcftools、参照FASTA index、入力FASTQ、実行profile、container定義、出力検証が必要です。実行検証済み例ではありません。 ⚠️ 環境依存(実行未検証: 要 Nextflow profile/container と参照データ)

// main.nf (最小例)
params.ref = file('ref.fa')
params.r1  = file('data/sample_R1.fq.gz')
params.r2  = file('data/sample_R2.fq.gz')

process MAP {
  publishDir 'results'
  input:
    path ref
    path r1
    path r2
  output:
    path 'sample.sorted.bam'
  """
  bwa mem -t 8 $ref $r1 $r2 \
    | samtools view -bS - \
    | samtools sort -o sample.sorted.bam
  samtools index sample.sorted.bam
  """
}

process CALL {
  publishDir 'results'
  input:
    path ref
    path bam from MAP.out
  output:
    path 'sample.vcf'
  """
  bcftools mpileup -Ou -f $ref $bam \
    | bcftools call -mv -Ov -o sample.vcf
  """
}

workflow {
  ref = file(params.ref)
  r1  = file(params.r1)
  r2  = file(params.r2)
  CALL(ref, MAP(ref, r1, r2))
}

← 付録D へ 目次に戻る 次へ: 付録F →