struct   type t = {     name: string;     (* vaxrank-specific ones *)     vaccine_peptide_length: int;     padding_around_mutation: int;     max_vaccine_peptides_per_mutation: int;     max_mutations_in_report: int;     (* isovar-like ones *)     min_mapping_quality: int;     min_variant_sequence_coverage: int;     min_alt_rna_reads: int;     include_mismatches_after_variant: bool;     use_duplicate_reads: bool;     drop_secondary_alignments: bool;     (* topiary-like ones *)     mhc_epitope_lengths: int list;     (* reporting *)     reviewers: string list option;     final_reviewer: string option;     xlsx_report: bool;     pdf_report: bool;     ascii_report: bool;     (* the rest *)     parameters: (string * string) list;   }   let to_json {     name;     vaccine_peptide_length;     padding_around_mutation;     max_vaccine_peptides_per_mutation;     max_mutations_in_report;     min_mapping_quality;     min_variant_sequence_coverage;     min_alt_rna_reads;     include_mismatches_after_variant;     use_duplicate_reads;     drop_secondary_alignments;     mhc_epitope_lengths;     reviewers;     final_reviewer;     xlsx_report;     pdf_report;     ascii_report;     parameters}: Yojson.Basic.json     =     `Assoc ([       "name"`String name;       "vaccine_peptide_length"`Int vaccine_peptide_length;       "padding_around_mutation"`Int padding_around_mutation;       "max_vaccine_peptides_per_mutation"`Int max_vaccine_peptides_per_mutation;       "max_mutations_in_report"`Int max_mutations_in_report;       "min_mapping_quality"`Int min_mapping_quality;       "min_variant_sequence_coverage",         `Int min_variant_sequence_coverage;       "min_alt_rna_reads"`Int min_alt_rna_reads;       "include_mismatches_after_variant"`Bool include_mismatches_after_variant;       "use_duplicate_reads"`Bool use_duplicate_reads;       "drop_secondary_alignments"`Bool drop_secondary_alignments;       "mhc_epitope_lengths",         `List (List.map mhc_epitope_lengths ~f:(fun i -> `Int i));       "ascii_report"`Bool ascii_report;       "pdf_report"`Bool pdf_report;       "xlsx_report"`Bool xlsx_report;       "parameters",         `Assoc (List.map parameters ~f:(fun (a, b) -> a, `String b));       ]       @ Option.value_map reviewers ~default:[]         ~f:(fun r -> ["reviewers"`List (List.map ~f:(fun r -> `String r) r)])       @ Option.value_map final_reviewer ~default:[]         ~f:(fun r -> ["final_reviewer"`String r]))   let render {     name;     vaccine_peptide_length;     padding_around_mutation;     max_vaccine_peptides_per_mutation;     max_mutations_in_report;     min_mapping_quality;     min_variant_sequence_coverage;     min_alt_rna_reads;     include_mismatches_after_variant;     use_duplicate_reads;     drop_secondary_alignments;     mhc_epitope_lengths;     reviewers;     final_reviewer;     xlsx_report;     pdf_report;     ascii_report;     parameters}     =     let soi = string_of_int in     ["--vaccine-peptide-length"; soi vaccine_peptide_length] @     ["--padding-around-mutation"; soi padding_around_mutation] @     ["--max-vaccine-peptides-per-mutation";       soi max_vaccine_peptides_per_mutation] @     ["--max-mutations-in-report"; soi max_mutations_in_report] @     ["--min-mapping-quality"; soi min_mapping_quality] @     ["--min-variant-sequence-coverage";      soi min_variant_sequence_coverage] @     ["--min-alt-rna-reads"; soi min_alt_rna_reads] @     (if include_mismatches_after_variant       then ["--include-mismatches-after-variant"else []) @     (if use_duplicate_reads       then ["--use-duplicate-reads"else []) @     (if drop_secondary_alignments       then ["--drop_secondary_alignments"else []) @     ["--mhc-epitope-lengths";       (mhc_epitope_lengths         |> List.map ~f:string_of_int         |> String.concat ~sep:",")] @     (List.concat_map parameters ~f:(fun (a,b) -> [a; b])) @     (Option.value_map final_reviewer ~default:[]        ~f:(fun f -> ["--output-final-review"; f])) @     (Option.value_map reviewers ~default:[]        ~f:(fun rs ->            let reviewers = String.concat ~sep:"," rs in            ["--output-reviewed-by"; reviewers]))     |> List.filter ~f:(fun s -> not (String.is_empty s))   let default =     {name = "default";      vaccine_peptide_length = 25;      padding_around_mutation = 0;      max_vaccine_peptides_per_mutation = 1;      max_mutations_in_report = 10;      min_mapping_quality = 1;      min_variant_sequence_coverage = 1;      min_alt_rna_reads = 3;      include_mismatches_after_variant = false;      use_duplicate_reads = false;      drop_secondary_alignments = false;      mhc_epitope_lengths = [8; 9; 10; 11];      reviewers = None;      final_reviewer = None;      xlsx_report = false;      pdf_report = false;      ascii_report = true;      parameters = []}   let name t = t.name end