{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "fastp",
  "description": "An ultra-fast all-in-one FASTQ preprocessor (QC/adapters/trimming/filtering/splitting/merging...).\n\nFeatures:\n\n  - comprehensive quality profiling for both before and after filtering data (quality curves, base contents, KMER, Q20/Q30, GC Ratio, duplication, adapter contents...)\n  - filter out bad reads (too low quality, too short, or too many N...)\n  - cut low quality bases for per read in its 5' and 3' by evaluating the mean quality from a sliding window (like Trimmomatic but faster).\n  - trim all reads in front and tail\n  - cut adapters. Adapter sequences can be automatically detected, which means you don't have to input the adapter sequences to trim them.\n  - correct mismatched base pairs in overlapped regions of paired end reads, if one base is with high quality while the other is with ultra low quality\n  - trim polyG in 3' ends, which is commonly seen in NovaSeq/NextSeq data. Trim polyX in 3' ends to remove unwanted polyX tailing (i.e. polyA tailing for mRNA-Seq data)\n  - preprocess unique molecular identifier (UMI) enabled data, shift UMI to sequence name.\n  - report JSON format result for further interpreting.\n  - visualize quality control and filtering results on a single HTML page (like FASTQC but faster and more informative).\n  - split the output to multiple files (0001.R1.gz, 0002.R1.gz...) to support parallel processing. Two modes can be used, limiting the total split file number, or limitting the lines of each split file.\n  - support long reads (data from PacBio / Nanopore devices).\n  - support reading from STDIN and writing to STDOUT\n  - support interleaved input\n  - support ultra-fast FASTQ-level deduplication\n",
  "type": "object",
  "$defs": {
    "inputs": {
      "title": "Inputs",
      "type": "object",
      "description": "`fastp` supports both single-end (SE) and paired-end (PE) input.\n\n- for SE data, you only have to specify read1 input by `-i` or `--in1`.\n- for PE data, you should also specify read2 input by `-I` or `--in2`.\n",
      "properties": {
        "in1": {
          "type": "string",
          "format": "path",
          "exists": true,
          "description": "Input FastQ file",
          "help_text": "Type: `file`, multiple: `False`, required, direction: `input`, example: `\"in.R1.fq.gz\"`. "
        },
        "in2": {
          "type": "string",
          "format": "path",
          "description": "Input FastQ file",
          "help_text": "Type: `file`, multiple: `False`, direction: `input`, example: `\"in.R2.fq.gz\"`. "
        }
      }
    },
    "outputs": {
      "title": "Outputs",
      "type": "object",
      "description": "\n- for SE data, you only have to specify read1 output by `-o` or `--out1`.\n- for PE data, you should also specify read2 output by `-O` or `--out2`.\n- if you don't specify the output file names, no output files will be written, but the QC will still be done for both data before and after filtering.\n- the output will be gzip-compressed if its file name ends with `.gz`\n",
      "properties": {
        "out1": {
          "type": "string",
          "format": "path",
          "description": "The single-end or paired-end R1 reads that pass QC",
          "help_text": "Type: `file`, multiple: `False`, required, default: `\"$id.$key.out1.gz\"`, direction: `output`, example: `\"out.R1.fq.gz\"`. ",
          "default": "$id.$key.out1.gz"
        },
        "out2": {
          "type": "string",
          "format": "path",
          "description": "The paired-end R2 reads that pass QC",
          "help_text": "Type: `file`, multiple: `False`, default: `\"$id.$key.out2.gz\"`, direction: `output`, example: `\"out.R2.fq.gz\"`. ",
          "default": "$id.$key.out2.gz"
        },
        "unpaired1": {
          "type": "string",
          "format": "path",
          "description": "Store the reads that `read1` passes filters but its paired `read2` doesn't.",
          "help_text": "Type: `file`, multiple: `False`, default: `\"$id.$key.unpaired1.gz\"`, direction: `output`, example: `\"unpaired.R1.fq.gz\"`. ",
          "default": "$id.$key.unpaired1.gz"
        },
        "unpaired2": {
          "type": "string",
          "format": "path",
          "description": "Store the reads that `read2` passes filters but its paired `read1` doesn't.",
          "help_text": "Type: `file`, multiple: `False`, default: `\"$id.$key.unpaired2.gz\"`, direction: `output`, example: `\"unpaired.R2.fq.gz\"`. ",
          "default": "$id.$key.unpaired2.gz"
        },
        "failed_out": {
          "type": "string",
          "format": "path",
          "description": "Store the reads that fail filters.\n\nIf one read failed and is written to --failed_out, its failure reason will be appended to its read name",
          "help_text": "Type: `file`, multiple: `False`, default: `\"$id.$key.failed_out.gz\"`, direction: `output`, example: `\"failed.fq.gz\"`. ",
          "default": "$id.$key.failed_out.gz"
        },
        "overlapped_out": {
          "type": "string",
          "format": "path",
          "description": "For each read pair, output the overlapped region if it has no any mismatched base.\n",
          "help_text": "Type: `file`, multiple: `False`, default: `\"$id.$key.overlapped_out\"`, direction: `output`. ",
          "default": "$id.$key.overlapped_out"
        }
      }
    },
    "report output arguments": {
      "title": "Report output arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "json": {
          "type": "string",
          "format": "path",
          "description": "The json format report file name\n",
          "help_text": "Type: `file`, multiple: `False`, default: `\"$id.$key.json.json\"`, direction: `output`, example: `\"out.json\"`. ",
          "default": "$id.$key.json.json"
        },
        "html": {
          "type": "string",
          "format": "path",
          "description": "The html format report file name\n",
          "help_text": "Type: `file`, multiple: `False`, default: `\"$id.$key.html.html\"`, direction: `output`, example: `\"out.html\"`. ",
          "default": "$id.$key.html.html"
        },
        "report_title": {
          "type": "string",
          "description": "The title of the html report, default is \"fastp report\".\n",
          "help_text": "Type: `string`, multiple: `False`, example: `\"fastp report\"`. "
        }
      }
    },
    "adapter trimming": {
      "title": "Adapter trimming",
      "type": "object",
      "description": "Adapter trimming is enabled by default, but you can disable it by `-A` or `--disable_adapter_trimming`. Adapter sequences can be automatically detected for both PE/SE data.\n\n- For SE data, the adapters are evaluated by analyzing the tails of first ~1M reads. This evaluation may be inacurrate, and you can specify the adapter sequence by `-a` or `--adapter_sequence` option. If adapter sequence is specified, the auto detection for SE data will be disabled.\n- For PE data, the adapters can be detected by per-read overlap analysis, which seeks for the overlap of each pair of reads. This method is robust and fast, so normally you don't have to input the adapter sequence even you know it. But you can still specify the adapter sequences for read1 by `--adapter_sequence`, and for read2 by `--adapter_sequence_r2`. If `fastp` fails to find an overlap (i.e. due to low quality bases), it will use these sequences to trim adapters for read1 and read2 respectively.\n- For PE data, the adapter sequence auto-detection is disabled by default since the adapters can be trimmed by overlap analysis. However, you can specify `--detect_adapter_for_pe` to enable it.\n- For PE data, `fastp` will run a little slower if you specify the sequence adapters or enable adapter auto-detection, but usually result in a slightly cleaner output, since the overlap analysis may fail due to sequencing errors or adapter dimers.\n- The most widely used adapter is the Illumina TruSeq adapters. If your data is from the TruSeq library, you can add `--adapter_sequence=AGATCGGAAGAGCACACGTCTGAACTCCAGTCA --adapter_sequence_r2=AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT` to your command lines, or enable auto detection for PE data by specifing `detect_adapter_for_pe`.\n- `fastp` contains some built-in known adapter sequences for better auto-detection. If you want to make some adapters to be a part of the built-in adapters, please file an issue.\n\nYou can also specify --adapter_fasta to give a FASTA file to tell fastp to trim multiple adapters in this FASTA file. Here is a sample of such adapter FASTA file:\n\n```\n>Illumina TruSeq Adapter Read 1\nAGATCGGAAGAGCACACGTCTGAACTCCAGTCA\n>Illumina TruSeq Adapter Read 2\nAGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT\n>polyA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n```\n\nThe adapter sequence in this file should be at least 6bp long, otherwise it will be skipped. And you can give whatever you want to trim, rather than regular sequencing adapters (i.e. polyA).\n\n`fastp` first trims the auto-detected adapter or the adapter sequences given by `--adapter_sequence | --adapter_sequence_r2`, then trims the adapters given by `--adapter_fasta` one by one.\n\nThe sequence distribution of trimmed adapters can be found at the HTML/JSON reports.\n",
      "properties": {
        "disable_adapter_trimming": {
          "type": "boolean",
          "description": "Disable adapter trimming.\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "detect_adapter_for_pe": {
          "type": "boolean",
          "description": "By default, the auto-detection for adapter is for SE data input only, turn on this option to enable it for PE data.\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "adapter_sequence": {
          "type": "string",
          "description": "The adapter sequences to be trimmed",
          "help_text": "Type: `string`, multiple: `False`. "
        },
        "adapter_sequence_r2": {
          "type": "string",
          "description": "The adapter sequences to be trimmed for R2",
          "help_text": "Type: `string`, multiple: `False`. "
        },
        "adapter_fasta": {
          "type": "string",
          "format": "path",
          "description": "A FASTA file containing all the adapter sequences to be trimmed",
          "help_text": "Type: `file`, multiple: `False`, direction: `input`. "
        }
      }
    },
    "base trimming": {
      "title": "Base trimming",
      "type": "object",
      "description": "No description",
      "properties": {
        "trim_front1": {
          "type": "integer",
          "description": "Trimming how many bases in front for read1, default is 0.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `0`. "
        },
        "trim_tail1": {
          "type": "integer",
          "description": "Trimming how many bases in tail for read1, default is 0.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `0`. "
        },
        "max_len1": {
          "type": "integer",
          "description": "If read1 is longer than max_len1, then trim read1 at its tail to make it as long as max_len1",
          "help_text": "Type: `integer`, multiple: `False`. "
        },
        "trim_front2": {
          "type": "integer",
          "description": "Trimming how many bases in front for read2, default is 0.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `0`. "
        },
        "trim_tail2": {
          "type": "integer",
          "description": "Trimming how many bases in tail for read2, default is 0.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `0`. "
        },
        "max_len2": {
          "type": "integer",
          "description": "If read2 is longer than max_len2, then trim read2 at its tail to make it as long as max_len2",
          "help_text": "Type: `integer`, multiple: `False`. "
        }
      }
    },
    "merging mode": {
      "title": "Merging mode",
      "type": "object",
      "description": "Allows merging paired-end reads into a single longer read if they are overlapping.",
      "properties": {
        "merge": {
          "type": "boolean",
          "description": "For paired-end input, merge each pair of reads into a single read if they are overlapped",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "merged_out": {
          "type": "string",
          "format": "path",
          "description": "In the merging mode, specify the file name to store merged output, or specify --stdout to stream the merged output.\n",
          "help_text": "Type: `file`, multiple: `False`, default: `\"$id.$key.merged_out.gz\"`, direction: `output`, example: `\"merged.fq.gz\"`. ",
          "default": "$id.$key.merged_out.gz"
        },
        "include_unmerged": {
          "type": "boolean",
          "description": "In the merging mode, write the unmerged or unpaired reads to the file specified by --merge",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        }
      }
    },
    "additional input arguments": {
      "title": "Additional input arguments",
      "type": "object",
      "description": "Affects how the input is read.",
      "properties": {
        "interleaved_in": {
          "type": "boolean",
          "description": "Indicate that <in1> is an interleaved FASTQ which contains both read1 and read2",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "fix_mgi_id": {
          "type": "boolean",
          "description": "The MGI FASTQ ID format is not compatible with many BAM operation tools, enable this option to fix it.\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "phred64": {
          "type": "boolean",
          "description": "Indicate the input is using phred64 scoring (it'll be converted to phred33, so the output will still be phred33)\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        }
      }
    },
    "additional output arguments": {
      "title": "Additional output arguments",
      "type": "object",
      "description": "Affects how the output is written.",
      "properties": {
        "compression": {
          "type": "integer",
          "description": "Compression level for gzip output (1 ~ 9)",
          "help_text": "Type: `integer`, multiple: `False`, example: `4`. "
        },
        "dont_overwrite": {
          "type": "boolean",
          "description": "Don't overwrite existing files",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        }
      }
    },
    "logging arguments": {
      "title": "Logging arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "verbose": {
          "type": "boolean",
          "description": "Output verbose log information (i.e",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        }
      }
    },
    "processing arguments": {
      "title": "Processing arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "reads_to_process": {
          "type": "string",
          "description": "Specify how many reads/pairs to be processed",
          "help_text": "Type: `long`, multiple: `False`, example: `1000000`. "
        }
      }
    },
    "deduplication arguments": {
      "title": "Deduplication arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "dedup": {
          "type": "boolean",
          "description": "Enable deduplication to drop the duplicated reads/pairs\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "dup_calc_accuracy": {
          "type": "integer",
          "description": "Accuracy level to calculate duplication (1~6)",
          "help_text": "Type: `integer`, multiple: `False`, example: `3`. "
        },
        "dont_eval_duplication": {
          "type": "boolean",
          "description": "Don't evaluate duplication rate to save time and use less memory.\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        }
      }
    },
    "polyg tail trimming arguments": {
      "title": "PolyG tail trimming arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "trim_poly_g": {
          "type": "boolean",
          "description": "Force polyG tail trimming, by default trimming is automatically enabled for Illumina NextSeq/NovaSeq data\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "poly_g_min_len": {
          "type": "integer",
          "description": "The minimum length to detect polyG in the read tail",
          "help_text": "Type: `integer`, multiple: `False`, example: `10`. "
        },
        "disable_trim_poly_g": {
          "type": "boolean",
          "description": "Disable polyG tail trimming, by default trimming is automatically enabled for Illumina NextSeq/NovaSeq data\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        }
      }
    },
    "polyx tail trimming arguments": {
      "title": "PolyX tail trimming arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "trim_poly_x": {
          "type": "boolean",
          "description": "Enable polyX trimming in 3' ends.\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "poly_x_min_len": {
          "type": "integer",
          "description": "The minimum length to detect polyX in the read tail",
          "help_text": "Type: `integer`, multiple: `False`, example: `10`. "
        }
      }
    },
    "cut arguments": {
      "title": "Cut arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "cut_front": {
          "type": "integer",
          "description": "Move a sliding window from front (5') to tail, drop the bases in the window if its mean quality < threshold, stop otherwise.\n",
          "help_text": "Type: `integer`, multiple: `False`. "
        },
        "cut_tail": {
          "type": "integer",
          "description": "Move a sliding window from tail (3') to front, drop the bases in the window if its mean quality < threshold, stop otherwise.\n",
          "help_text": "Type: `integer`, multiple: `False`. "
        },
        "cut_right": {
          "type": "integer",
          "description": "Move a sliding window from front to tail, if meet one window with mean quality < threshold, drop the bases in the window and the right part, and then stop.\n",
          "help_text": "Type: `integer`, multiple: `False`. "
        },
        "cut_window_size": {
          "type": "integer",
          "description": "The window size option shared by cut_front, cut_tail or cut_sliding",
          "help_text": "Type: `integer`, multiple: `False`, example: `4`. "
        },
        "cut_mean_quality": {
          "type": "integer",
          "description": "The mean quality requirement option shared by cut_front, cut_tail or cut_sliding",
          "help_text": "Type: `integer`, multiple: `False`, example: `20`. "
        },
        "cut_front_window_size": {
          "type": "integer",
          "description": "The window size option of cut_front, default to cut_window_size if not specified.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `4`. "
        },
        "cut_front_mean_quality": {
          "type": "integer",
          "description": "The mean quality requirement option of cut_front, default to cut_mean_quality if not specified.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `20`. "
        },
        "cut_tail_window_size": {
          "type": "integer",
          "description": "The window size option of cut_tail, default to cut_window_size if not specified.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `4`. "
        },
        "cut_tail_mean_quality": {
          "type": "integer",
          "description": "The mean quality requirement option of cut_tail, default to cut_mean_quality if not specified.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `20`. "
        },
        "cut_right_window_size": {
          "type": "integer",
          "description": "The window size option of cut_right, default to cut_window_size if not specified.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `4`. "
        },
        "cut_right_mean_quality": {
          "type": "integer",
          "description": "The mean quality requirement option of cut_right, default to cut_mean_quality if not specified.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `20`. "
        }
      }
    },
    "quality filtering arguments": {
      "title": "Quality filtering arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "disable_quality_filtering": {
          "type": "boolean",
          "description": "Quality filtering is enabled by default",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "qualified_quality_phred": {
          "type": "integer",
          "description": "The quality value that a base is qualified",
          "help_text": "Type: `integer`, multiple: `False`, example: `15`. "
        },
        "unqualified_percent_limit": {
          "type": "integer",
          "description": "How many percents of bases are allowed to be unqualified (0~100)",
          "help_text": "Type: `integer`, multiple: `False`, example: `40`. "
        },
        "n_base_limit": {
          "type": "integer",
          "description": "If one read's number of N base is >n_base_limit, then this read/pair is discarded",
          "help_text": "Type: `integer`, multiple: `False`, example: `5`. "
        },
        "average_qual": {
          "type": "integer",
          "description": "If one read's average quality score <avg_qual, then this read/pair is discarded",
          "help_text": "Type: `integer`, multiple: `False`, example: `0`. "
        }
      }
    },
    "length filtering arguments": {
      "title": "Length filtering arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "disable_length_filtering": {
          "type": "boolean",
          "description": "Length filtering is enabled by default",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "length_required": {
          "type": "integer",
          "description": "Reads shorter than length_required will be discarded, default is 15.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `15`. "
        },
        "length_limit": {
          "type": "integer",
          "description": "Reads longer than length_limit will be discarded, default 0 means no limitation.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `0`. "
        }
      }
    },
    "low complexity filtering arguments": {
      "title": "Low complexity filtering arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "low_complexity_filter": {
          "type": "boolean",
          "description": "Enable low complexity filter",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "complexity_threshold": {
          "type": "integer",
          "description": "The threshold for low complexity filter (0~100)",
          "help_text": "Type: `integer`, multiple: `False`, example: `30`. "
        }
      }
    },
    "index filtering arguments": {
      "title": "Index filtering arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "filter_by_index1": {
          "type": "string",
          "format": "path",
          "description": "Specify a file contains a list of barcodes of index1 to be filtered out, one barcode per line.\n",
          "help_text": "Type: `file`, multiple: `False`, direction: `input`. "
        },
        "filter_by_index2": {
          "type": "string",
          "format": "path",
          "description": "Specify a file contains a list of barcodes of index2 to be filtered out, one barcode per line.\n",
          "help_text": "Type: `file`, multiple: `False`, direction: `input`. "
        },
        "filter_by_index_threshold": {
          "type": "integer",
          "description": "The allowed difference of index barcode for index filtering, default 0 means completely identical.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `0`. "
        }
      }
    },
    "overlapped region correction": {
      "title": "Overlapped region correction",
      "type": "object",
      "description": "No description",
      "properties": {
        "correction": {
          "type": "boolean",
          "description": "Enable base correction in overlapped regions (only for PE data), default is disabled.\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "overlap_len_require": {
          "type": "integer",
          "description": "The minimum length to detect overlapped region of PE reads",
          "help_text": "Type: `integer`, multiple: `False`, example: `30`. "
        },
        "overlap_diff_limit": {
          "type": "integer",
          "description": "The maximum number of mismatched bases to detect overlapped region of PE reads",
          "help_text": "Type: `integer`, multiple: `False`, example: `5`. "
        },
        "overlap_diff_percent_limit": {
          "type": "integer",
          "description": "The maximum percentage of mismatched bases to detect overlapped region of PE reads",
          "help_text": "Type: `integer`, multiple: `False`, example: `20`. "
        }
      }
    },
    "umi arguments": {
      "title": "UMI arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "umi": {
          "type": "boolean",
          "description": "Enable unique molecular identifier (UMI) preprocessing.\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "umi_loc": {
          "type": "string",
          "description": "Specify the location of UMI, can be (index1/index2/read1/read2/per_index/per_read, default is none.\n",
          "help_text": "Type: `string`, multiple: `False`, choices: ``index1`, `index2`, `read1`, `read2`, `per_index`, `per_read``. ",
          "enum": [
            "index1",
            "index2",
            "read1",
            "read2",
            "per_index",
            "per_read"
          ]
        },
        "umi_len": {
          "type": "integer",
          "description": "If the UMI is in read1/read2, its length should be provided.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `0`. "
        },
        "umi_prefix": {
          "type": "string",
          "description": "If specified, an underline will be used to connect prefix and UMI (i.e",
          "help_text": "Type: `string`, multiple: `False`. "
        },
        "umi_skip": {
          "type": "integer",
          "description": "If the UMI is in read1/read2, fastp can skip several bases following UMI, default is 0.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `0`. "
        },
        "umi_delim": {
          "type": "string",
          "description": "If the UMI is in index1/index2, fastp can use a delimiter to separate UMI from the read sequence, default is none.\n",
          "help_text": "Type: `string`, multiple: `False`. "
        }
      }
    },
    "overrepresentation analysis arguments": {
      "title": "Overrepresentation analysis arguments",
      "type": "object",
      "description": "No description",
      "properties": {
        "overrepresentation_analysis": {
          "type": "boolean",
          "description": "Enable overrepresentation analysis.\n",
          "help_text": "Type: `boolean_true`, multiple: `False`, default: `false`. ",
          "default": false
        },
        "overrepresentation_sampling": {
          "type": "integer",
          "description": "One in (--overrepresentation_sampling) reads will be computed for overrepresentation analysis (1~10000), smaller is slower, default is 20.\n",
          "help_text": "Type: `integer`, multiple: `False`, example: `20`. "
        }
      }
    },
    "nextflow input-output arguments": {
      "title": "Nextflow input-output arguments",
      "type": "object",
      "description": "Input/output parameters for Nextflow itself. Please note that both publishDir and publish_dir are supported but at least one has to be configured.",
      "properties": {
        "publish_dir": {
          "type": "string",
          "description": "Path to an output directory.",
          "help_text": "Type: `string`, multiple: `False`, required, example: `\"output/\"`. "
        }
      }
    }
  },
  "allOf": [
    {
      "$ref": "#/$defs/inputs"
    },
    {
      "$ref": "#/$defs/outputs"
    },
    {
      "$ref": "#/$defs/report output arguments"
    },
    {
      "$ref": "#/$defs/adapter trimming"
    },
    {
      "$ref": "#/$defs/base trimming"
    },
    {
      "$ref": "#/$defs/merging mode"
    },
    {
      "$ref": "#/$defs/additional input arguments"
    },
    {
      "$ref": "#/$defs/additional output arguments"
    },
    {
      "$ref": "#/$defs/logging arguments"
    },
    {
      "$ref": "#/$defs/processing arguments"
    },
    {
      "$ref": "#/$defs/deduplication arguments"
    },
    {
      "$ref": "#/$defs/polyg tail trimming arguments"
    },
    {
      "$ref": "#/$defs/polyx tail trimming arguments"
    },
    {
      "$ref": "#/$defs/cut arguments"
    },
    {
      "$ref": "#/$defs/quality filtering arguments"
    },
    {
      "$ref": "#/$defs/length filtering arguments"
    },
    {
      "$ref": "#/$defs/low complexity filtering arguments"
    },
    {
      "$ref": "#/$defs/index filtering arguments"
    },
    {
      "$ref": "#/$defs/overlapped region correction"
    },
    {
      "$ref": "#/$defs/umi arguments"
    },
    {
      "$ref": "#/$defs/overrepresentation analysis arguments"
    },
    {
      "$ref": "#/$defs/nextflow input-output arguments"
    }
  ]
}
