From ae53a65f043d047e3d461d6b5f7e551532083427 Mon Sep 17 00:00:00 2001 From: koen Date: Fri, 3 Jul 2015 17:22:33 +0200 Subject: [PATCH] Update adaptor ligase finding algorithm Removed unneeded, confusing parameters -cc and -al Removed unused code --- README.md | 17 +- releases/GBSX_v1.1.4/GBSX_digest_v1.0.pl | 380 ++++++++++++ .../GBSX_v1.1.4.jar} | Bin 291619 -> 285365 bytes releases/latest/GBSX_v1.1.4.jar | Bin 0 -> 285365 bytes src/be/uzleuven/gc/logistics/GBSX/GBSX.java | 2 +- .../GBSX/demultiplexer/GBSdemultiplex.java | 2 +- .../application/FastqDemultiplex.java | 568 +----------------- .../model/DemultiplexParameters.java | 4 +- .../model/ProcessedFragment.java | 114 ++++ .../model/SampleBarcodeCombination.java | 91 +++ 10 files changed, 617 insertions(+), 561 deletions(-) create mode 100644 releases/GBSX_v1.1.4/GBSX_digest_v1.0.pl rename releases/{latest/GBSX_v1.1.3.jar => GBSX_v1.1.4/GBSX_v1.1.4.jar} (83%) create mode 100644 releases/latest/GBSX_v1.1.4.jar create mode 100644 src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/ProcessedFragment.java create mode 100644 src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/SampleBarcodeCombination.java diff --git a/README.md b/README.md index 6b86511..d2aecd4 100644 --- a/README.md +++ b/README.md @@ -138,11 +138,6 @@ piece) AGATCGGAAGAGCG) currently only used for adaptor ligase see -al and when * `-s` the posible distance of the start. This is the distance count from the start of the read to the first basepair of the barcode or enzyme (standard 0, maximum 20) -* `-cc` Checks the complete read for the enzyme (if false, stops at the -first possible enzyme cutsite) (use values true or false, standard is true). If -used, the sequence after the enzyme site is compared to the adaptors, if the -first basepairs of the sequence are compaired to the first basepairs of the -adaptor * `-kc` Keep the enzyme cut-site remains (standard true) (example: enzyme ApeKI and restriction site G^CWGC: "ApeKI \tab CAGC,CTGC") * `-ea` Add enzymes from the given file (keeps the standard enzymes, and @@ -151,10 +146,7 @@ cutsites are comma separeted)) (only use once, not use -er) (example: enzyme ApeKI and restriction site G^CWGC: "ApeKI \tab CAGC,CTGC") * `-er` Replace enzymes from the given file (do not keep the standard enzymes) (enzyme file: no header, enzyme name tab cutsites (multiple cutsites -are comma separeted)) (only use once, not use -ea) -* `-al` check for adaptor ligase: no (for no check) or a positive integer -(starts at 0), for the number of mismatches (only checks 10 basepairs of -the adaptor), standard 1 +are comma separeted)) (only use once, not use -ea) * `-scb` Use self correcting barcodes (barcodes created by the barcodeGenerator) (standard false) * `-malg` the used algorithm to find mismatches and indels, possible @@ -259,4 +251,9 @@ v1.1.2 the read is considered as unvalid (previous was first sample) v1.1.3 -* On request added the enzyme AvaII \ No newline at end of file +* On request added the enzyme AvaII + +v1.1.4 +* Update adaptor ligase finding algorithm +* Removed unneeded, confusing parameters -cc and -al +* Removed unused code \ No newline at end of file diff --git a/releases/GBSX_v1.1.4/GBSX_digest_v1.0.pl b/releases/GBSX_v1.1.4/GBSX_digest_v1.0.pl new file mode 100644 index 0000000..3499548 --- /dev/null +++ b/releases/GBSX_v1.1.4/GBSX_digest_v1.0.pl @@ -0,0 +1,380 @@ +#!/usr/bin/perl + +#################################################################################################################### +# This is GBSX v1.0. A toolkit for experimental design and demultiplexing genotyping by sequencing experiments. # +# # +# Copyright (C) 2014 KU Leuven # +# # +# This file is part of GBSX. # +# # +# GBSX is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# GBSX is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with GBSX. If not, see . # +#################################################################################################################### + +######################################################################################################################################################################## +use Getopt::Std; +use Bio::SeqIO; +use Data::Dumper; +use Bio::PrimarySeq; +use Bio::DB::Fasta; +use Bio::Restriction::EnzymeCollection; +use Bio::Restriction::Analysis; +use Bio::Restriction::Enzyme; + + + +######################################################################################################################################################################## +my $program_information = "GBSX v1.0"; +my $license = "GBSX v1.0 Copyright (C) 2014 KU Leuven\nThis program comes with ABSOLUTELY NO WARRANTY; for details type `perl GBSX_digest_v1.0.pl -w'.\nThis is free software, and you are welcome to redistribute it under certain conditions; type `perl GBSX_digest_v1.0.pl -c' for details.\n"; + +$Getopt::Std::STANDARD_HELP_VERSION = 1; +my $help_message="\n$license\n####################################################################################\nusage: perl GBSX_digest_v1.0.pl -d \'digest sequence\' -l \'read length\' -f \'file of reference fasta file location(s)\'\n\noptional parameters: \n\t-e \'enzyme name to use\' (default: Enzyme)\n\t-g \'genome name to use in bed file name\' (default: genome)\n\t-n \'minimum size fragments to include\' (default: 100)\n\t-m \'maximum size fragments to use\' (default: 1000)\n\n\t-E \'second enzyme name to use\' (default: Enzyme2)\n\t-D \'digest sequence for a second enzyme\' (default: not declared)\n\t-R \'digest sequence for a third enzyme\' (default: not declared)\n"; + +######################################################################################################################################################################## +######################################################################################################################################################################## +#input parameters +sub HELP_MESSAGE {die "$help_message\n";} +sub VERSION_MESSAGE {print "$program_information\n";} + +my %opts = (); +getopts('e:d:g:l:f:m:n:E:D:R:cwh'); + +#die with help message if -h +if ($opt_h){ die "$help_message\n"; } +#die with warrenty message if -w +if ($opt_w){ die "GBSX is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n"; } +#die with conditions message if -c +if ($opt_c){ die "GBSX is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n"; } + + +#enzyme name (optional) +my $enzyme_name = $opt_e || "Enzyme"; + +#digest sequence: example "RCATG^Y"; +my $digest_seq = $opt_d || "not_defined"; if ($digest_seq ne "not_defined"){$digest_seq=uc($digest_seq);} + +#genome name to use for bedfile (optional) +my $bed_genome_name = $opt_g || "genome"; + +#define read length: assumes PE, only report back in bed first and last number of bps corresponding to this +my $read_length = $opt_l || "not_defined"; + +#file of reference fasta locations +my $fasta_file_locations = $opt_f || "not_defined"; + +#max/min fragment sizes (optional, otherwise use defaults) +my $max_size = $opt_m || 1000; +my $min_size = $opt_n || 100; + +#enzyme2 name (optional, otherwise if second digest just default to Enzyme2) +my $enzyme2_name = $opt_E || "Enzyme2"; + #make sure starts Upper case + $enzyme2_name = ucfirst($enzyme2_name); + #double check this is not the same as Enzyme1 + if ($enzyme2_name eq $enzyme_name){die "Please use different enzyme names for enzyme 1 and enzyme 2\n"; } + +#digest sequence for a second enzyme: example "RCATG^Y"; (optional, otherwise no second digest) +my $digest2_seq = $opt_D || "not_defined"; if ($digest2_seq ne "not_defined"){$digest2_seq=uc($digest2_seq);} + #double check this is not the same as Enzyme1 + if ($digest2_seq eq $digest_seq){die "Please use different enzyme cut sequences for enzyme 1 and enzyme 2\n"; } + +#digest sequence for a third enzyme: example "RCATG^Y"; (optional, otherwise no third digest) +my $digest3_seq = $opt_R || "not_defined"; + if ($digest3_seq ne "not_defined"){$digest3_seq=uc($digest3_seq); + #double check this is not the same as Enzyme1 or Enzyme3 + if ( ($digest3_seq eq $digest2_seq) || ($digest3_seq eq $digest_seq) ){die "Please use different enzyme cut sequences for enzyme 1, enzyme 2, and enzyme 3\n"; } + #we call this Enzyme3, so make sure nothing else uses this name + if ( ($enzyme2_name eq "Enzyme3") || ($enzyme_name eq "Enzyme3") ){ die "Enzyme3 is a reseved name, please use a different enzyme name\n"; } + } + +#die if required parameters are missing +if ( ($digest_seq eq "not_defined") || ($read_length eq "not_defined") || ($fasta_file_locations eq "not_defined") ){ + my $missing=" "; + if ($digest_seq eq "not_defined"){$missing = $missing."-d (digest sequence) ";} + if ($read_length eq "not_defined"){$missing = $missing."-l (read length) ";} + if ($fasta_file_locations eq "not_defined"){$missing = $missing."-f (reference fasta locations) ";} + die "missing parameter(s):$missing\n"; +} + +######################################################################################################################################################################## +######################################################################################################################################################################## +#first basic steps to get ready for the analysis (mostly defining variables) + +#using input information, define outfiles: +my $outfile; my $main_bed; +if ($digest2_seq ne "not_defined"){ + $outfile = $bed_genome_name.".".$enzyme_name.".".$enzyme2_name.".".$read_length."nt.digest_results"; + $main_bed = $bed_genome_name.".".$enzyme_name.".".$enzyme2_name.".".$read_length."nt.digest.bed"; +}else{ + $outfile = $bed_genome_name.".".$enzyme_name.".".$read_length."nt.digest_results"; + $main_bed = $bed_genome_name.".".$enzyme_name.".".$read_length."nt.digest.bed"; +} + +#get reference fasta files +my @ref_chr; +open (ref_files,$fasta_file_locations)||die "could not open file $fasta_file_locations\n"; +while(){ + chop; + $_=~s/\n//;$_=~s/\r//; + if ($_ ne ""){ + push(@ref_chr,$_); + #current script only works with one sequence per file, add a check for this + my $grep_results = `grep \"^\>\" $_`; + my @grep_array = split(/\n/,$grep_results); my $number_sequences_in_file = @grep_array; + if ($number_sequences_in_file > 1){die "please use only one sequence per fasta file, $_ had $number_sequences_in_file sequences\n";} + } +} +close(ref_files)||die "could not close file $fasta_file_locations\n"; + +#define enzyme to use +my $rest_enzyme = new Bio::Restriction::Enzyme(-enzyme => $enzyme_name, -seq => $digest_seq); + +#optional: define a second enzyme +my $rest_enzyme2; if ($digest2_seq ne "not_defined"){ $rest_enzyme2 = new Bio::Restriction::Enzyme(-enzyme => $enzyme2_name, -seq => $digest2_seq); } + +#optional: define a third enzyme +my $rest_enzyme3; if ($digest3_seq ne "not_defined"){ $rest_enzyme3 = new Bio::Restriction::Enzyme(-enzyme => "Enzyme3", -seq => $digest3_seq); } + +#define ouput count variables +my $total_cuts=0; my $total_fragments=0; my $total_fragments_between_min_and_max = 0; +my $bin_size=100;#hard coded for now +my $temp_size=$min_size; + until (($temp_size+$bin_size)>$max_size){ + my $temp_size_plus_bin = $temp_size+$bin_size; + my $variable_name = "total_fragments_between_".$temp_size."_and_".$temp_size_plus_bin; + $$variable_name=0; + $temp_size=$temp_size+$bin_size; + } +my $total_fragments_less_min = 0; +my %fragments_in_range_per_chr; my %fragments_in_range_per_chr_enzyme1_end; my %fragments_in_range_per_chr_enzyme2_end; my %fragments_in_range_per_chr_enzymeboth_end; + +#define ouput count variables, optional for a second enzyme +my $total_cuts_enzyme2=0; my $fragments_both_ends_enzyme1 = 0; my $fragments_both_ends_enzyme2 = 0; my $fragments_end_from_each_enzyme = 0; + +#define ouput count variables, optional for a third enzyme +my $fragments_in_range_contain_third_enzyme = 0; + +#define ouput count variables, distribution of distances +my $one_kb = 0; my $ten_kb = 0; my $hundred_kb=0; my $one_Mb = 0; my $ten_Mb = 0; my $more_ten_kb=0; + +######################################################################################################################################################################## +######################################################################################################################################################################## +#per chromosome, perform digest and add to totals + +#open bed file to print to +open(outbed,">$main_bed")||die "could not open out bedfile $main_bed\n"; + +foreach my $chr (@ref_chr){ + + #just get chr name and remove directory structure + my @chr_name_parts =split(/\//,$chr);my $number_parts=@chr_name_parts; + my $chr_name=@chr_name_parts[$number_parts-1]; + $chr_name=~s/.fa$//i;$chr_name=~s/.fasta$//i; + $fragments_in_range_per_chr{$chr_name}=0; + $fragments_in_range_per_chr_enzyme1_end{$chr_name}=0; + $fragments_in_range_per_chr_enzyme2_end{$chr_name}=0; + $fragments_in_range_per_chr_enzymeboth_end{$chr_name}=0; + + #get fasta file for this chr + my $seqio_object1 = Bio::SeqIO->new(-file => $chr, -format => "fasta"); + my $seq = $seqio_object1->next_seq; + my $fastadb = Bio::DB::Fasta->new($chr); + + #digest + my $rest_analysis=Bio::Restriction::Analysis->new(-seq=>$seq, -enzymes=>$rest_enzyme); + + #just get cut numbers first + my $chr_cuts=$rest_analysis->cuts_by_enzyme($enzyme_name); + $total_cuts=$total_cuts+$chr_cuts; + + #optional digest and cut numbers for a second enzyme + my $rest_analysis2;my $chr_cuts2; + if ($digest2_seq ne "not_defined"){ + $rest_analysis2=Bio::Restriction::Analysis->new(-seq=>$seq, -enzymes=>$rest_enzyme2); + $chr_cuts2=$rest_analysis2->cuts_by_enzyme($enzyme2_name); + $total_cuts_enzyme2=$total_cuts_enzyme2+$chr_cuts2; + } + + #get locations of cuts + my @locations1 = $rest_analysis->positions($enzyme_name); + #cut locations if second enzyme + my %hash_locations1; my %hash_locations2;#use position as keys + my @locations2;my @all_locations; + if ($digest2_seq ne "not_defined"){ + @locations2=$rest_analysis2->positions($enzyme2_name); + @all_locations = (@locations1,@locations2); + @all_locations=sort {$a <=> $b} @all_locations; + + foreach my $position1 (@locations1){ $hash_locations1{$position1}=1; } + foreach my $position2 (@locations2){ $hash_locations2{$position2}=1; } + }else{ + @all_locations=@locations1; + } + + #go through all cut locations and check fragment sizes + my @chr_with_directories = split(/\//,$chr); $chr_name=pop @chr_with_directories; $chr_name=~s/.fa//; + my $previous_location=0; my $previous_fragment_in_range_end=0; + + #to analyze every fragment, add the end of the chromosome as a position + my $chr_end_position = $seq->length; + push(@all_locations,$chr_end_position); + + foreach my $location (@all_locations){ + $total_fragments++; + if ($location<$previous_location){die "error in order, $location < $previous_location";} + my $fragment_length = $location-$previous_location; + if (($fragment_length<=$max_size)&&($fragment_length>=$min_size)){ + $total_fragments_between_min_and_max++; + $fragments_in_range_per_chr{$chr_name}=$fragments_in_range_per_chr{$chr_name}+1; + + #for distribution of distance between sequenced fragments + if ($previous_fragment_in_range_end!=0){ + my $distance_this_fragment_to_previous=$previous_location-$previous_fragment_in_range_end; + if ( $distance_this_fragment_to_previous<=1000 ){ + $one_kb++; + }elsif( ($distance_this_fragment_to_previous>1000) && ($distance_this_fragment_to_previous<=10000)){ + $ten_kb++; + }elsif( ($distance_this_fragment_to_previous>10000) && ($distance_this_fragment_to_previous<=100000)){ + $hundred_kb++; + }elsif( ($distance_this_fragment_to_previous>100000) && ($distance_this_fragment_to_previous<=1000000)){ + $one_Mb++; + }elsif( ($distance_this_fragment_to_previous>1000000) && ($distance_this_fragment_to_previous<=10000000)){ + $ten_Mb++; + }elsif( ($distance_this_fragment_to_previous>10000000) ){ + $more_ten_kb++; + }else{ + die "error in distances\n"; + } + } + $previous_fragment_in_range_end=$location; + + + #if second enzyme, are ends from one or both enzymes + if ($digest2_seq ne "not_defined"){ + if ( (exists($hash_locations1{$previous_location})) && (exists($hash_locations1{$location})) ){ + $fragments_both_ends_enzyme1++; #both ends from enzyme1 + $fragments_in_range_per_chr_enzyme1_end{$chr_name}=$fragments_in_range_per_chr_enzyme1_end{$chr_name}+1; + }elsif ( (exists($hash_locations2{$previous_location})) && (exists($hash_locations2{$location})) ){ + $fragments_both_ends_enzyme2++; #both ends from enzyme2 + $fragments_in_range_per_chr_enzyme2_end{$chr_name}=$fragments_in_range_per_chr_enzyme2_end{$chr_name}+1; + }elsif ( (exists($hash_locations1{$previous_location})) && (exists($hash_locations2{$location})) ){ + $fragments_end_from_each_enzyme++; #one end from each enzyme + $fragments_in_range_per_chr_enzymeboth_end{$chr_name}=$fragments_in_range_per_chr_enzymeboth_end{$chr_name}+1; + }elsif ( (exists($hash_locations2{$previous_location})) && (exists($hash_locations1{$location})) ){ + $fragments_end_from_each_enzyme++; #one end from each enzyme + $fragments_in_range_per_chr_enzymeboth_end{$chr_name}=$fragments_in_range_per_chr_enzymeboth_end{$chr_name}+1; + } + } + + #counts on bin sizes + my $temp_size=$min_size; + until (($temp_size+$bin_size)>$max_size){ + my $temp_size_plus_bin = $temp_size+$bin_size; + if ( ($fragment_length>=$temp_size)&&($fragment_length<$temp_size_plus_bin) ){ + my $variable_name = "total_fragments_between_".$temp_size."_and_".$temp_size_plus_bin; + $$variable_name=$$variable_name+1; + } + $temp_size=$temp_size+$bin_size; + } + + #print to bed the potentially sequenced bases + if ($fragment_length <= (2*$read_length)){ + print outbed "$chr_name\t$previous_location\t$location\n"; + }else{ + #print first read + $previous_location_plus=$previous_location+$read_length; + print outbed "$chr_name\t$previous_location\t$previous_location_plus\n"; + #print second read + $location_minus=$location-$read_length; + print outbed "$chr_name\t$location_minus\t$location\n"; + } + + #if third enzyme requested, check if there is a digest site in this fragment + if ($digest3_seq ne "not_defined"){ + my $fragment_seq = $fastadb->seq($chr_name, ($previous_location+1) => ($location)); + my $frag_seq_obj = Bio::Seq->new( -seq => $fragment_seq ); + my $rest_analysis3=Bio::Restriction::Analysis->new(-seq=>$frag_seq_obj, -enzymes=>$rest_enzyme3); + my $frag_cuts3=$rest_analysis3->cuts_by_enzyme("Enzyme3"); + if ($frag_cuts3>0){ $fragments_in_range_contain_third_enzyme++ } + } + + }elsif ($fragment_length<$min_size){ + $total_fragments_less_min++; + } + $previous_location=$location; + } + +} + +#close bedfile +close(outbed)||die "could not open out bedfile $main_bed\n"; + +######################################################################################################################################################################## +######################################################################################################################################################################## +#print to output file general digest info +open(out,">$outfile")||die "could not open outfile $outfile\n"; + +#print input parameters +print out "input parameters:\n\tenzyme name used: $enzyme_name\n\tenzyme cut sequence: $digest_seq\n"; +if ($digest2_seq ne "not_defined"){ print out "\tsecond enzyme name used: $enzyme2_name\n\tsecond enzyme cut sequence: $digest2_seq\n"; } +if ($digest3_seq ne "not_defined"){ print out "\tthird enzyme cut sequence: $digest3_seq\n"; } +print out "\tfor bedfile, genome name used: $bed_genome_name\n\tread length provided: $read_length\nminimum fragment size: $min_size\nmaximum fragment size: $max_size\n\nreference sequence(s) analyzed:\n"; +foreach my $ref_to_print_to_output (@ref_chr){ print out "\t$ref_to_print_to_output\n"; } +print out "\n"; + +#print number of cuts +print out "total cuts for enzyme ($enzyme_name): $total_cuts\n"; +if ($digest2_seq ne "not_defined"){ print out "total cuts for second enzyme ($enzyme2_name): $total_cuts_enzyme2\n"; } + +#print number of fragments +print out "\nlooked at $total_fragments fragments in total\n"; +print out "$total_fragments_between_min_and_max fragments <= $max_size nt and >= $min_size nt\n"; +if ($digest3_seq ne "not_defined"){ print out "\t-containing one or more third digest site ($digest3_seq): $fragments_in_range_contain_third_enzyme\n"; } +if ($digest2_seq ne "not_defined"){ + print out "\t-with both ends from $enzyme_name: $fragments_both_ends_enzyme1\n"; + print out "\t-with both ends from $enzyme2_name: $fragments_both_ends_enzyme2\n"; + print out "\t-with an end from each enzyme: $fragments_end_from_each_enzyme\n"; + print out "\tfragments in range per reference sequence: (both ends from $enzyme_name / both ends from $enzyme2_name / an end from each enzyme)\n"; +}else{ + print out "\tfragments in range per reference sequence:\n"; +} + +#print fragment chromosome distribution +my @chr_names_for_count_print = keys %fragments_in_range_per_chr; +foreach my $chr_name_for_count_print (@chr_names_for_count_print){ + if ($digest2_seq ne "not_defined"){ + print out "\t\t$chr_name_for_count_print had $fragments_in_range_per_chr{$chr_name_for_count_print} fragments ($fragments_in_range_per_chr_enzyme1_end{$chr_name_for_count_print}/$fragments_in_range_per_chr_enzyme2_end{$chr_name_for_count_print}/$fragments_in_range_per_chr_enzymeboth_end{$chr_name_for_count_print})\n"; + }else{ + print out "\t\t$chr_name_for_count_print had $fragments_in_range_per_chr{$chr_name_for_count_print} fragments\n"; + } +} + +#print fragment distance distribution +print out "\tdistances between fragments in range:\n"; +print out "\t\t<=1kb $one_kb fragment pairs\n\t\t1kb-10kb $ten_kb fragment pairs\n\t\t10kb-100kb $hundred_kb fragment pairs\n\t\t100kb-1Mb $one_Mb fragment pairs\n"; +print out "\t\t1Mb-10Mb $ten_Mb fragment pairs\n\t\t>10Mb $more_ten_kb fragment pairs\n"; + + +#print fragment size distribution +print out "\tfragments less than $min_size nt: $total_fragments_less_min \n\n"; +my $temp_size=$min_size; +until (($temp_size+$bin_size)>$max_size){ + my $temp_size_plus_bin = $temp_size+$bin_size; + my $variable_name = "total_fragments_between_".$temp_size."_and_".$temp_size_plus_bin; + $temp_size_plus_bin--; + print out "\tfragments $temp_size-$temp_size_plus_bin nt: $$variable_name\n"; + $temp_size=$temp_size+$bin_size; +} +print out "\n"; + +close(out)||die "could not close outfile $outfile\n"; diff --git a/releases/latest/GBSX_v1.1.3.jar b/releases/GBSX_v1.1.4/GBSX_v1.1.4.jar similarity index 83% rename from releases/latest/GBSX_v1.1.3.jar rename to releases/GBSX_v1.1.4/GBSX_v1.1.4.jar index da9212b44ee4839e6facf0bc1e4f1bff447fc268..24319e0775a612e524041827aa408233c4690897 100644 GIT binary patch delta 19817 zcmZ`h2YggT^E0!1ckeDQ6_OA_AfXc=^cFyR=!6cD8bW~3yC~`b*3Sw=cmmR!A|f?G znqWf^1QaZQ6tVM3vtZ{xvv+BJ{Q2>A=k1i8ot>R6Z*yzEiQKg-GPGw`rF{Svz>=q~ zEC{WxUVQ4xwx$s%d2UxMZ}Rb2&E$(Q+2n6yLzDl3%}icLHFm--p|6-UVXtG=$*mjh z5mZd>3Gx}*^VBoQ)5YWus=)gR6?iYFGfep`ofD*Qyf_6Ta+6&F{wA)DrhKlekIApO zTRL;5Q-y!k-P+yTphbtRuCT=;F+8`s9T0KNJ<8w)c)FW>qoud5}AJ*==S6r*##K&b?8tfBuC28cL#vW?oqo%AaHKSB7HK!H=wY2CS){9zssI^6HJk-_)8PrbL+Y8iz z4NYlYKc^iY;8v7(v~okv%L*x2UH@y*$)gnEUu(4D}V}eje&C`2Zh` zr-1@x2;03PZ4mbj4Yp{Aund)Cm_@@ql<9-}XoN*s9vbOmj%>fAqoj1SMPr08N31?p zpm81=FZl!?%%h1On&gAWq=zQ^SojpFYpO-lgkriyGbEpB(S1@rD}?Ts?)#D+@X%}@ zEToCdOAlJ~kcS=?O0IV?&GCVM9?i9Ao?svG(4!VT#{Ni;iw;j%^rUF_A0Movr+n}d zJ?)`qNCk@|Su83zQq_y1#1es)3db^mUh>d#)?*i~ z@X|_JCCO@w)>yPws$FN%dTICu(QRW0y-b}%2EV%K6=~!qk@2b+f3roed1#9d-lNw& zwABai)9doGP2_ABm3BzkPAOyl_i2MgyL>Q!^4S0L#rV5L>Kj77M-s(OEiY(RnHPLZ~iSbWvU|S#(+QFD<%a(N_X~ zZP7Q9e{0cql7BDB527=Vq;>RPQRzo%;59E@ryHF3>860UJoJ;)_OmqO7a!X6tA}p; zFhYi)i+*E>ei!HuY1*HXoD(YUk`eTmy#6iNf4D5bamS;;hY9?G2?{-mSP7*V%_|G$ zt1HPM?%C4H6{6fC=P@qiWRORB@^>7;5D#{6w*8F_^1Y|9feZILtN&I_oUInQoEtl^ zxnrNh6zAY?=yvXWg1ar9HEF^KgzmWuo=tR4{*9%b8waqA^Tb)K;L!8}(t@&bSUe>lbT7@@0(0=^|=zEpAuN25yg~_4HbQD{FLy16XUZ@q?kf!OHt?uW zTZQ4g+?!dcW_}*#9R3Rb!$re#$DgX=%=(&N!c~N$zrptINLxjzQn|fGmy1NNtxBtC zTg9jdTg9q~+><$-cg!yHI8R!&Yul=fip#A#x{@>Fdrat7)>iS@-d5#Qg00G{3bsmA zNw%t}A`tAcnKLu%oQmNP!vR+U6tWx-aFq^cyvEyWe3 zs3fQ7510~BN7ePHdbX;s8rZ6#YT!&csVX{Kf55IWjXbKct(vH&9@WfNsj9h+kEj+- z~3RYY+|b(A}3vS zwt2m5J9B=-+Ey>_Y1Nxsxa&t;#Cr8{x?jTy4Q7i23>REq9EMQ3U!M+%?fbRqme{sU z?{?|!JNM|AnrN$jBCoXSZ>s?;Vbyi)9??5Hb7b~ZTMc9s*PP)b=Bv`q(Cb*L&b?}o ztpo_ zgd8J!kUx>{;0(ZG03Tv(-d3 z$ySp^fp+5C^@sh>ptaQ$#qF3TG}wcmN>crFTg?#GnQTOUz0X#&#GLnwAs$e(ZS|mf z$W{+4zpds-d*(`C%~Ov!^Vd+1C|f zDiv<4wL-H_t+(+#JnX#n6E^a1kk)QgojvMhTfHLv`>fhzt5>CXvyi_g&=yHvmt?Do z@ThIJ+OBr+Ane<_b9e9b-t{K-uJ5(gP9fMOiiaD-#NPF$_pU#2(sahP=f6 zREKQ!mLzYhL%DOuM~A6*)Not9tDY932F~lJsYUMmVODipy(fsn>U~=sktQEiJ8boV z*!ZYAW~<|3$`4gi?#-$LEnA&XgAlqHpEEN~l!!ZNt5b^A`bd53QKy{+Q&n{S1Ha-W zo8X{x%0(R|NY`{O?Z9sNBQ-s$@UfD`5&64#$>}2asATzw{Hozp9i7P$^o8ZgnK&|g zR{AKXYa}heVFAij2e7R3WE3^_*8thVM@iTR#9I7DSexH@1}Jz3#bq3x_`RON*XMVR zR18N+tT8!98k6%}VR8;joQE(^3v9{s_W*cifD7CJdO>nN@N`pp7f^o7QnXL|TLEAm zOkj?FprH-;pe;l|e~5?<%4zK2P06DFevreI~xlVKXSYq}qs!VGK;GqDrg zhdp2x_J`ScA3TVDcnY6@=kR%W9&=$Ku7?+J4=lzruoN%AGW?NoKfy};8&;7GYbYMp zQbk@wRfCPx9A2Rgu!(xYW*P{uQzmSsv9OJ1!ghKXcF>ccb>v>N=o=`}b=TVW4v zhrRSR?4uK~pH9I6`V!uxYw!;J4eu%&-cylqSk;C1RVz56y21yl2OLua;kX(BXH+(v zP@~|anhB@WT=+=MgOAlhIIWh$C+cav+AXtkn>SZZ?V+%ApMv&dD~jar%q%MQXz8L6K4@N<4&UhrR-hyP)?x64-aB}d>b23C^n=v*n~2$ zISs}ZGz?qO2y9KyU>kZK+tN$ej`FaRpB3stC$TI2iQQEQ_E3$nmrBRpDjWN#N!VA- z!hSrL4pd9=UbPPgspB|Soy4K)BOIo_!{IstN9s7t*5xrrC*dev2}kRDaEwmJvAQ=- z(BpBEo{W?ALY$%~f*s70qki*4!}{Ack8UjhXDP9=OCUAHk5tmgr*K%dPftM`v-F&5a7hk(do3x)RjF zQS5RY-Qgkbu@|yU|(-TdvGEXx+sIz z;3S+3ZW>H0aSBca4-I1@PGiWT99oFenZrvXXbH~XuJP$j&}<=R8otEGImHV~3OC>Y+{AwU=DDk8IrUr_y+k=fbzB6@El*@m*?cN z@u%p1{E%kj30jONX(Q8Z!ZY*^eopV>S^6H&(KS3zH}MPl6)(^oyr|0KB~=|St2%f^ z)yJ?6){6-DMZ`DNn!T8Q*@JGUI@Z*E*9&Sj3oq>pii{TaHC>G5QI*OOt zLzZzAi@rCG@(_4cd3G&{bv~%TYvqS|IwGj1;*6j0U?pTfd5DAT0Q}zgiHqIzqVW?q zTk0E}(TQEbLwBH!aSBVdhh*avB>fn4if}dDI0Y8Ox?mM^*eMZtl`8%3d|Qn=jg<%& z!?QT>q*oSycDNPi<;_T7}dwp)Bwv+L-d!UMp%)WU}I{==5CIisRj07AL>sXa1f>82cf814=+-Gyh;Q3IBp0j8cH&RLufdaqD+dTEUHA= zREtJaV;V!PX#%yQiIhf@s5?#eQ(u}w8)!Q1p&7KF?xSNgi%!sN`kWr3ujygBO>>kY z-f++(svJG0D$?Vs7CoUF(^IM)J)^qQvnrFGQ)B3PHI?S8)wDppMT-GZa1HofC|jNWzar1xBB z=&?fvwLyC;3_&Y&;cgXxkxo4$2V zqVL^P=?C`$y6WCTKe`XoHTP+{?rBLkJZW^((}#ZY45wc_S$sO>r`w+O^t)#}{o#3& z{P!Zl8 zD$;vUMfnm{DPJuWnh22P*wCDR+W6mRAt{Ms;Wc)+zK^$ zy;u<+XXlUMwa`d>f}zsvqSf$89-FbcEVRY{FjPVRmuFc6sZ0)IPcdDBpEtc1@M#9i zyQag}_>2^~X2S)1R?7HTqa8=Uno!O?6;9*x0(r9F!vG{Bt6=;wG@s`TUTHA2fFXj? zzSFpnRZ@`bJAf~69M(|Vx0j>oA|Bzbe6Mii@%QAg)!DZa9j?v;J$*0oY%jCl0N(;! z!qs`8hV?*GSFBV^7$cEeAo4A~@p{TuI;R+7wVOYj{5?3)c9Lsr+ z;cA8=u)lX9u3@@JoZy|!;XaMG7PGvQ{kV?7Qv7Y=Yh2IFrTM$WWsdb}5KST07r2q3 z7;0y&$CvRHh@~`Z4bKs;a7^fKE#sM@Cd5%+>jj=KYC>5)&~3}JMjFKXUWaBpcT9zH zzJpL5UuP)6cNmgzE7O%PT;T2E^KIE@2f`IEL0z&O!}`U;RX%$1zf7Yt=&v0YS}PA- z`EX3)lvzr_MBc%GY7P;q1(a6zK%#05Ra6_OsoFv#4#xMWj?i9pf>Ek7JgK_D)2chX zsCvR`)eAPNKJcpQ3$LqwuuBc#^?nAg=?C$;eK35ZhQW0;9R6Zg@u(3PrAGR(k{V@Z zo#z5t7IZzY%mQ5>ffaE(cP>E{UZ=>kqS!k>^kCCaaz>INm zDa6FNYQ-|WDZr>aEVUHA4ZQFvR2Pob(ayRqydaHnc*)rkW1UuAsiPeHcBSOR(v7{* z-j~3w8he>%T+KL7oD~p#CEALbS828_kmqD|`t}S=k35Qa#8+ z@gbfyALh=S1KoM^)t@&aS?Up(p&o@?&X=gixl^Bj_3BC3r~U&+)lZV?&zG@p~s_i@@?4X5eC%vq8(PouLJGlG} zwUYI3y5g12xl`-g{0G0Q%NZ2SP`nw?(=Jq0xaWi$Xr1j=|@myi3|c`V-k?Zg8j znfDW|j1(WX=e!MLJ>nPzK0S=VH@T4G8AIaA1d;SJvmKHZ2z`rham5;{(FNX?yu<6M z;5IHu^)6G99B2hR&vjqW^OgskrmXXO4;sm*=tI+~CinbP>AV~)?WFgl39iz^^Vp3J z^`vLn7t(vtAbxwb7d7h}a7rEU9OIOl*D}usBnEskyqF(v4LCVGU*P1au433!cbqGa z{j_OsUc5#-nZ2oj@wsn+k5|+u;8UM*Q2Csfg=aaSoP&nyJhWC9+4n9%Pjwmks4rm> zZ-J+)uVJbB7S^cm;brv$A0S-kLxLOZcQ-LY{e)TS7d)kY#q;VmuUr4X8|p9oRsD^B zX~H{Nk=B|#+D$&qb7>jvr9|zcN;;IP>M*LK!>NgmqG7r;jn?t>m`Ynw_N_CPNo~W7X7Yks~DZ4D(d>Gp>C+!=tgR&ZlY%CrYcuAQ;u$-mg<(q z?~X!gJOz#MeQ_f2FXh?s2!kPfa*~Zl*-va5#^)~|NEt-XCEfs}ai>?HQzoXlcv<)X z9yeauoz~)qOviH=t-=#LMOe^>mg7nBHkia4V+s8}HI-xIDW>zPp*%&1-&yoKtP>~l zgH{dM;l;;X9K#122j%lD9+JV61cnN{a(U1z1uIj2;Xy)B#=AV3keogSJdpPC1j?}w z9d%DaxwW_;Avq6L42USb79ST!$>+V*{JvDWWyd(z8<2^7x-}xztpi~()e~^Ca!Vj> zFD5W?`BW>;s+o`w=gxzyJQz7V55CCb4?dUsQmc@dR8O2orO-+^;MD9#WpS;O){mj}r6=C8KWyi>246OdqAr03GH+*=*|aK{dFH0&!;~3>;CYp9tiVw z25i=YV5c4e=kzf6M`xl}^Q@_}u#z5$X*wG_X@3^>&^b8X934#LBZDb?Ixv+_24>)6 z`aaCn58xvGuyM>sxvTm^6Fkl5fEFJwCh=!HKCHpA&=5amKe90jTHt3~76QM)bo`t> z$_M9Q0iG2)o+4}EIpd9~*vL4F8{+-=0G?;x((D(x_yvnm;tvJB#Zb_<7`njNz{Z`A zruf85I4>GbKJX8ClzTf@&UbXw4b@mj>vC(=chS1Qsnq$PQ<+J0NFEGJb^GGnZ*XXb zCH&Q~>i~)mVRz~jbSG!Z0E%V*`Og4q&HlsAWjgqhb9w*=$oY#0QdM!E5K}s&$bGsN zxKCJIh;g6r=x~A7LOtU?(K^mz|B)i&L1B0Cpm6q}V{xIWKHb>6@y_^Y?-HmO$4dlu zC{LVEB(O(Wx^0R`DR8NO=1cqxxKls}|5B(fW#U)~dOs#|h;=IyWeYsaIW>?<#m36; z2v`Ct2qdEo6P-T?QiZ50Z(vpaw#f!4v{kJPiuV_@6%Un=+R<$CI9@!IDH?pKcAOn7 zvX?-t3HFMYGzDboslJVnC}v@98BW43x-$URcub}G;sWFIl4=|hRW{Y;;h!2B7phcx zyby=J0hbZpfHzseu(+^b6P|M}X9RjD)b!4vpow{KcMe$Qx73KZP}4h+(UAhJg*rhs zWRwn%jx>D}5o9brx+A%7K8y=zRT_tEyfZO6WC>K}Uh$gV@y6L~1Xh`))J+k=(mU|N zfQ{Tco;<9!6l}?>>vb~fUD79(6o`?XHTSaCiG8?drJLoH6BGMLZC0@`z-P@pISf1v z(fS!Eub<;nt@)6q7eG%wZOhQPFh#!r59`ISP`?O^^b**vm%$#r9QNxKa7eF&_t+ag z(5v}Odkx0$0bG(^kI8xiHrE?5Q~O`WEPl!1Gr9?S3!f%#Fkc_Q{rXM(P#?ro`fdDJAI9_gef(V?A-6tCUi|?@>0{JTe@HF$3F@d% zQcrz~#^{e|hCWUI(Vx&W`cvL)f6klhbF|a1&(m(+W$)J)=q-JbzSoyjsQyxw(N|QG z{z}!?U#tH58#R#Oq520kLSI$c`bRZJUsDtGb@iOSr55O))f)Y)TBmAHL5K5}cw!#nwiRh}Fs z$j=)>)y$30{7X4BJa9*`-E?XcD4RWpFN~RMgkL;K69Q%37tvH@E)>qZeyimZMZxuXuM^vfu6Qfr{>SzK*wF!(CNIHs$c_W(q?MwZRmjoHY|kt z=Hf#B$<2J5&G6R9qYB}so@-^hE^&I>SBNx9yKBvY`!| z(TeXI64vx!EupUM<0Qp{bu8pdNGVuP6sqszJ#+&L8+x#jkEegMu(9M#Bxx#%znL(n zO48iI79ymjg?#O>CZ<@}O3GXNc&XXeCtu8bTy+P*r3uv0!cG=;7Md=SbhWUXsM}q1 z?IB6JBt0$cWnpg%`v_BCN%~pX-@*Y5j>Lf$@}EF5j&7y)xEr>-dq~9)WT&JzGUHYd0S!ON-^vz zNmhGsjc}}$WSxb4*DnS)cyOZ!Uv_#n!n*m-yiYnr?SP$f^nr z-GRq!-r9U<;|VzKOgKYLV^88KoA)yx*}SJpkf zo5S;251zB}JRG;-7$^7zGr=j?hu}>al{sztl$6mAAh-jt%^!4G+(pxXiG2Hnmzg$v z1K-;GN&N>KuEKwvKA-SS)6Yf9S+4E)Csd2~s7IZ@KB2PeQwHKbrRq&j@?-&Jyovp$ zWhaiGG;ws|D87o7I5BfV_O#SQuMMX~flzN^`^@Q?iPP_&oXr=G_{;r1=l)NryZQ>g zc8+{X)!aV`SyiXPXH?D!y+|G>?lY>b&af#ue@3z&-sepDj1sMnV4n>axp>KEG?TZ+ zN1dq8sWY47xHI%~s;s_%3(jMoQ+3`kA9uEXPPMJ`!f}K7zy6#mSU06PxA@II%hW$J ze}l7poU#}8Uc$3T%eAHGJ zHp6TDzQw%9av6Jzf!Sd==i3^Ov19VMh{GJGoq1;J0)-5Gm{Y*O4Hn5vQ-^aF26FgTeKP|DBEW45dlh4L6*6<1 zh1pqogUZ$`BEHuU%ZEqc)kB~rfq1-_I@n5v?S~tbP>e0B7@J+lW*4%tJq=saoAd(P z;P_2y(oC9^%tlRwaCn!OC%mzOM+$i#3GzzWVKy=`|NDUkJ1uYV7oj|7(k+TFvLwqX zFw7A+YHC}5i{>z0)t{(Z6{#)ItVuyS#e2jLO!uJ-Hp4OXCu&_stPy6^*}z-MjZmKZ zyvY7_3adE=9~!31KT*YIMNGSRQIW^JyStc8B7;l-k#K@9zesoSur};1ex};R>O2Hx z*v4hqU`2J7E3A{pj$wL{nfyg{9%rTxnd#(RnK<+a6E~|B=i(@#yyr|?0`91eTcbJ! zJhn*KIc~st_Pz_ngoPGrz`-CW%xV7%B^T5DTUO#bR^o?Zd_|gb91uQd`7b3*{1cm) zKUc!9#h8jr%rU_**}qc7YNBDlrT-~LTwq!Rj%S9r->+1mh#1|)h{Fn-!BNlP^0`^i8&}5;t98lI{{XOGFXj2=GG|2RAfpHhlc4$ zNv3+tRG*m|-j#`?s$r_~TX9qJHLxN#D>5ZVXG1*kH)>YY!`Oju&ZI#sU&tzAs$OVP zj^u{vlix}-ym=Wy!r=ui#hNUcM*azy9={(?hh(kOyl{6_MTBK zRQtE$FBYq_Xwu**ILO??1Z046+;F|!nf@o0<4C*UPbyU`A{UvLr);C_n}3#Yjm^bs zDRK>-+6}SmuM!=&lRI!1cVK=orlJ~n@nM)UOEMi~rbEp1_Fb8H?O>Sp|5ZY*W5tMz z)cPeroUi_--3s#-?Ne*($uKasRvUx8tJFG+*ZcV5w| ztG@}3qo(NR%N4nNxnd(T@0IDC_r+ENw162X6~MXjg<_2H`#qp2g` ze&|F?`0ub*Qy1Dr-RKCHouD3ch0={ldAjFs2V?m7^>@BU^$>J36F=Wvp|1Bk zkD&eb!=KVUted!-EJ>nj9)i_Nz)r4t5LV~Gn$4dW7_`tg~>08?RL97F|$ zGe55?{xW@Y2>uSrP7lg16_o7{3SYZ5YF*K=2uL5o(ucD2;l-qvDwJNTQ2N{OPf$AF z-!n^z$l{vwC#dz?xH*AkT0rzD7Co9p=L8}$A6GCzLCg^-pt(Q=>!CX$0-?llMSh-J zJ?=AS0Bcn08hR&K+@>h*lQs;g!JZ>ue+AxW|%H6`JVwFR|3km7+l z&Z!r$uhV)vUvnNdNm=->Tg^`JPko~Q=h8m^rOm%DOuK6INBH-3Y3JiSyxshN|57JK z{w~DkkDPTmz}npED4W+LAvVLIHm}b(3FkWs!9N;s`t8PKKP0i@{CBPL8AphXiJ9Ky z%wlrpGC51++~R&J1*JKS=C>8h$Kw>Ln#<5pv=)9t4b4Dra+=DpHZ>0WrNB-#ne1@_;{MX)hDyE{{KhYB0bCV(hm57UqHI4K(i8xaTIqa zC$JU&tyjCCUhP?C2i7Z%_3FrL!%jvo*(Qy1AS1Cb@I($VA%5hI{r#f5T z!kCfLM}ehdx{+n}Ufj+=Hz3zhA*g!sSH0}IH>@@Q9EEW^w&)b@% zWR1_9Htpy?dk!#bJ*XogqKd?Vs*+Tbv#@fY|%J(GeKaS zM;RZG2p`5SAUO*$ImfOcs z)n72+E3!*gVk1@NN~^Hgs_d}U*c+lafZ(wH_fX_3?txa8;QpTh((|rWSG+5;yI9qx=H!8Q<*sB5S-HfB$!`^@4(U+& z5b%Db$Ry?C)ts~XjH=@Fj8`f7!(;gFp*ee>nW(&hc{hBn@5I>@0C}1@kuj=q{(H&l zhZIA$BSS5A8>riGz9kemtUvMQmK_}V<>~4i%23sEdu~d~=X3hE$&iL+tJNMuI?j`O z-zYYoJT0BM6IE*dALG?b^ZOq8()H*g-9SD3_c=mDiL6i|UXot;@4U88HFR!#sVe4AysBOeh%fhxs_ru4JN}`LM;a*B))){FAFJmDDqmGu9||!) zXAzfnKA{i$X&=7V<5rdB2Q;eYzfo6b$0+`36DO%7-%a6OaRztP=4U>f6&?8oiB7BAMaG`rp<4MIAgo%0jBt!ZaT{VQ+hDILw7yMysho7%`bpB zR*zu)jGt*xKlIQ;4A3QAn;%ATR;BB7Q*tXkNIa;gHa~3Q?Chzt4XRu(J=g%;yn7As zSubsV?8K?tTaPp)PVZptzw|Cb#XDpA1TC|(PY@r~H>mWizIv)*<@UxqRzKaN@K;Kl zq5NiWulLiB8=z@_?Ki-l{(6oflwT5Y+78g;O!3wM!6w!isP8j)`Na_D<$*zbOoo2O z5U%G>#Rh18Z?NR(y+P642I)Blbz+bnYh=jpfjDgj2Q9N{aIlU_L-hS-+?4zwkJpCi z45!90ZH9w$&oI6wmC@9hJ6v~nULK~C6WLYLp4peZ{VQHe%9F`~q2S-Txi7R2khU7G zD;m0K;2cjj^2m3@f`9Ag))^EKxbG1v<6NIZ zZf8!WHeU{%=QCNi1z7?7Nt>dbun{`S$Q#+(b5Z*ck6=+Vrv*^*(a~{d1yS)?jM_V^5Ebh@l%>lW!^%fUXJwX-q2##+&p*9W!wDN1 zRASJ&7v}8d`?vCRE1|>}^8@1evtwCjP98Vvxslp7nwR)ES%T@#%0i~Vx5_<(f)yc96cr=BEVx$KMy$VfI3?PWhoh#Y(J>N-%A|RgB3j zWnLQ^G~WDdHr}n@1fRIL4F4hd

E&S6LA;`{GfI&HLM6&6MHrl;L(dO%8VO9KqMH zoXF9-k#nb_3Uw}y3O1p{JW@iNMo~g!uYQH=>sMvnN-05gA z&W#bOs*^Y-DEeCQ8K;Ek_524!EXnEF5vw_3ed9Y@#;~YE-3)4>w_NU=gAq<_P7qlu zhmqNR4KnxOa;j0u}- zFbj`XcOEMk3ugs!XP!YgbGEBQ=gvXy&sO7g8N+z*c*euCCGla-@d-h#&I(>HEyOo< z4o(dA_0S278nmtuRm*8HS(h$61))k~km=t=Jz^x}`OzF{;f$lSe%gPlD6 z3+m^5-Q4#+3aAhV< z-5-|&^zyR-PQsKReao9w$MaWZkf%)v`A2^W(APai3C=T2Z~A2Q6mHaq{{&F-OIyx~ zzB=4F`62(#MWLG}Pi3M$wsUBzZtYyJti#M8H0>!`Yy3O7#Fi2IfxhE4dC!!>&4vF1 D;f^A> delta 24676 zcmbWf2Vhmj@;E#*yXV|FmJ9Zd7~ufY zK_ZCK6QrYp^p2oZMdgVFtf)`%o85cUe7yJb`xEY-J-airv$M0ayR*Az%a+g;Uxo(v zx<^P4fCbQf#`)R7HAJ@==QlJBLG{eN2P^95Sgfv}b1_jr-^WJ!`8zh#&m@uT)cX`Y zC8#O%Br7SmUW7|!MdltSkA}TSy#hF0_45(oe?Kn#@3C@_PJd8l1>lqC*2R$AM8l8Y z#OS2cXBvI=^EY`O9ho)vohlk{%Jr!Uzjp*s zKR@2Y4?LS@Y`Y$Uis|f47Y^@ktWXLTA^xNbEqE;mSC`Xisc~rg(|Xpx-*w{_bZdx9 z5_Il&197jROL=I`^aqCr0jOW9Gdr7-3T_U;$)>vjg3+m0x2X-C)C7#ky%pQP;A|!? zkQ&Q8z0gUj3ZQ=XXe{UIG_;-L4`Q%$ti3b~j*Z4uyS z5?C*9z!0qJJl0J{B_F!8Z5II4hh}bYLv0UuppFG~)k~5J>Zzc<3L2=Op$i(jAlW(j z8uoK`-=L@5Io!lm>mhV?a39w3v!x0MZjNBK$QqxO(+V**cW?Xn-1SDZqq3Yzd$F1m z@+MVsUVjg3ITL^6wBujXGgU)-O`edRnVp@P(Q$Ix$Z?tDa}ew<RS*K9E@+BypEJ9oY^p2F!tQ*N5}ggxu(?j~K|BkSn*~fDMSx?ZXy_-C(NCtN zpIiz+NQf$$-z`8cKZ?Wh{I-(uT>Pw^SZfPlVgXQMnAid`vGx`)66lY7 zd1m%wX7&?i_JU@#kuJ7c5u??L7_Fw|s~D{YzCuo`speu7CDQl+e@}67iuZ*7&K_!s zvRtjdb9XJk-RI2R7tGz4P|>^&Rn32C?h>_l5};0@921JzODJM5LGvV;n@Ze1+|16d z?oTg91CKPiMNP*nkQS`t5XUgBmj*K>kje17EHcSTO{Bj?`fTe6_P z?h0ECs^6s`Yi;R*T&}w!*MOP|*_p{z>QhuDSJ}G&6C`SqwV(n&J&fjtMi2{BJV{Vv zM`+llgH2g6)Nkb9tQ=MC>-64-QBL%aR5q!JvS5kI#MM%<+A64{g1?(Pm$Gw>{6;SC zM;h~wj2x`~Z+0X#7lWL|HHFJr@&{VZBR^4ND(`13>_6;V`rqtZQ5F9Di9Xjhs7|2` zYFyg(gxIXg9E7Q$9E7l)Mo25RLPeA&{6gNl*&-J!%75CT5Zwq&SwES$elq-zfGFL9ce0*F{eQ}^Fi)N z4{j@ZRzYcd_`UTzuBaafK5_WD6~l-0ei;Pu$c@(oWJ`!dv8-@^&-7A zpSX)&7WYe~#J*zS7w!st_kL;ot-F}HcSR2LOBQCSPF(`o$IOHI`dzWB-PI)gy{DQh z?uuOfuE?$uMeC9~ymc3Bf*M*&YL@7_4gRz1Cj9)v>gMwSn$LH7ZNS04D;`Y5AKlOk ze-eOCFIBOhUHFR!41e-%7yfGDZyvDlcMJdRfzR*{3;(q6jvN2tfsoK5@{l0uBEurn zMJ^9S;Extr7P&3*SQKQDtssIeDq~Sui$W|4TvXMf1P?UC-`!M=s(U!7p(xi>0oxseYPpD~ zSO(ScKy#iYLUXFCf+Uqz&*S5;zKS+bK|>cc@<4n1(M63t&=G&+7fR+BHBmuRi<&90 z6c0707Ak1zqE;?y?V(iWmfBETH?^boD%QcGj?5Qza#3fCy11yT2L{nS3cZ_(b!S0S z54VrQo{Dy_AnHwhRM6K&{X8(7?p2lSZ_xmY23j=8MfWM>`#ms<9#F`GT{J{Jhk9Tv z4O6i+g*IGKOIK}^VNs?+8KHua7L9UImItQMXp6?UXsm}Z#`#n@UZqa3Xrcm~q@+Gs z#j;(Lqn=Yd@HkC%(KHV{rCR7g4-hZV#l7Cow-k6FY7htrH8nyH%aGkV-b zPk7)}n##EJq(x7;=xGJ{j0fh@vmWq0PS08NyvlvSMK4w;)K^-?tW)u0Wkk{cC`O-lHiE!yIu zd=KoW0vB!dzyT^yFYhWk+Z0RNRoV`f#`p*59gB8)U;yo6{ok#GzeiEstH9q=488Bc zN?c10K2X6vmAhZXK2*U0RjY#v_>jsttX_{Oi63>*F_m&$>BtEMaMGev7M-@}j74WH z`bcqmPBDMpLm$&8EPsP8sKkp3?~;mLR>2h&TvdRddgwE{X3^&=cvU#WVM$mGqNh>1S2JU)*$?e&xVNzp3c&st*5l z(I2YFKUH1scrcj$atZKYsOpD?K#mDgF~RjyK8sOwO+j(H3>StErJzZQw~xoo!eKG2@+)$ou@dFgLIb&LHGwNqrjA+pdcTET=@5O z5>_qvWhXW?@QgF*VY=VBx*KDiCqKlx#Y;9`rks5rw_}|24MC<)7&jatBX{;o#cRHz$w#++7>o6t?)$J}8PB+^ z>~U#1>7&%bZocBH#ot&ecbC1jDx6UHO^4%!@O z>fDNx2@S2WMXAA=8m!%voW5B(nFv;P=Ai$~i3$V^XoKit6+HVSL7kID(a(PDijk!=6ZMP_)u5g1T`8qwobq zXKrl_cWNFjDfc3%DMv9KcR44&6ithk$8rBj?9pSG7?O(VHrB-?8yjE}LMNxq9BS!w zzkwdZ#unHzciExTT9}GYBeGujq0A~v`8$ke!-^sGM7GWEIDC7AthCVvDNS*%k?+nk}k}8n&n@ z5^YgSc)3YNr%g>u%9@bWF>7q5Eov)rbyRL$6(p&ko(k%#j0Vif#Iu+g+)y;KMPrd{ zizXs5_krVeLPb;2%q3E6(Ok5!MN84bslQcJcFr!sW_k@?-X&VOL~C25iZ(9M))wtV zdmEn-9dgeduPiZDbaW~$5s}W7k8pa;RME*6omGilxFBqZ95i9!vzPE5m*{4T?uw-z zqUYTA*{i`0vuYljJ&6q8Tl8^GpTi@;eMLW;sora2D{P&+;gw3dVU-7`qK!?F-BYQe zzl|x_+!g~AwSl6KEe3JRgnf*4toyjV#r<5}P9NhO=J^5V%Evgap--tnhRPevx&z_& z_U#bg{@ym-;@h_A)2?UxE#M@$sqE|r-wZ$-|;QIvcwbD3=OC0W8T`a<#Tc2RL zq;!#Ci%iu9qHdr1wipqJHn7D=k;rRG#vdiJTw=5>#`x)UcYGJn5@W?U=lKixK-73K zK~bHkWHE{LYci9WEV6S?L{w51Cx-nZG@0q;h$)JpsmyWwWVRgH@fn%pri{(Wnm9J| z!ORRBH{f%&m?j>y#Y2jV63&!i|7j9zFjm+m)B92C(a;tziI-hsmMvZpvu*LJn9WA` z-tl9`Pnb47K6CQq36tZq#>cbME$G(#m^#y%Fgji7~fkp-C|uSk1duUbGua4 z* z6&w}Ea%YZ>2o=XgmMu<**A!$6gf>p^7T7HJm7x|}pOY%@lsIjRGpedb#SUAXRkA%Q zKC;C*CBpM;R=%$`(6YtHBIB;>>M%w56I)ymVYav^F1f^Ir}up#qTu6C@v2S#)F)Z+ z&`o?&;Q#bW7O=}S&7gniSM5`f_Z!y0T)G_PEPb3T?BX2#9j`d~|HfJP&%73`e99MN zL6{nH0I{B0-eG-y=h3I|oxOmhOe4QH*7?c&&Q_A+VamekC)+putZ1!jJP#3-hsNjJ=afkG^1HgP3#~6KhRo|LjIjOv=@5?@be!PIc z7ZPCr+yetSWf0uYf9Ws;o`j+BA`FAqAPpA6a9GZ%YajzQLMCj35wHhF!T}fsCm;(x zg3)jd#=uuF7QTmZ=z{TBm7j?)k?TCkhfQHJrb0G$h8*kxQ?Nfgh|}O9^uaUu47`A| z;6==ZS@;Ib#%+*`XTibCFb}`wydPm9{t1i7h9wjOOQ|v}qv|{rZ4Rrb1LRRJSWN?A zEv3QRG#cKasj!Y7gZ1<*Y@}CV6DJ`nX_pJ)yH#XWF9^nin6ARH3I;graPBVq&`6;t7umT~y4A*5U zd?S0pkFpPZEBnEBG81mfNpMSM!}sz@_(8q`KVf@rxHG&UcR>a0fE{^Re;LYRCzhsU zsojTNuqz0B4o2fWtTsg5`K_BuW0`cr?&#|Ql10-Fd$N`pEQ1Qz3wv|gNgZRIU;)nc zqj2qGurKywxIZBi@8zZvTMN4mUpjL?;4K5A ze8E(M#!#iNz3#9D`SAK4SU4!fwI46=`=Y{kYd;=#cv9BROxg}B2PHaPElMtoKV{J# z%yl}tX(om`2i$bfcU+u;Eiz2T%PQQtTFO7!hcQC^Vods;pyu8SdW6SKDEI{Gzgp01K5m)Vhb9ME$KyU zMYFIqEyPsH#|}Pbs1u#Q&h!U%6*k@@nqm*p8+(e8*o)^Fy~T9wBOb?l#X=k)cHuyA z97l>%c)vJ<4~QE$ScYMmjKSeD9!JP3m@X4AL#AS;?2RL3KO8N`<5)Qv$H~`lyqu2{ zn|dUt*<7izI0~~MNG3pS9L-9{V-Gya%{+$FUSsVU zi{rqShkZ~^BL_ndxemwU1h%pRNuZ$VhiA5 ze4QOZ3*jOzhTm}s{E17kHLkz`n8$tfP3|PCS>kIj2j9Y%aXrq(jkt;zbw@EDzr+Ik z1Gkci@3J;-^HBuuq?)*!Qt>#o!}q8Ien7o&AC19-G#L-kG(1Mr@i0AtN4N$@=}m@v z3s2EL{D=)WfTyA$}^_;1{AjekMBLH8B)F z7ZdQhR-U!s3x$Wlhcj3|Oy~%k{YDAr!Wyk97CjQs6gQ6+=~`1Px}h~?Cb&f$>y|Qi z9*7f_@o{{D+o`&U)`}vyKM^a+Ot!NF@P<|twoiCfD~idIx{eQZW?f((2ei>zVTlfq zsI`K3`NYJ4R+JTKS}U;7+y#nwlC=`m99UT-M}$#lHB@tdU}J%|AezU%3iv%##2?sB z_{V{GMyVJuY+M8+6`EO&J;O5Kl>$$TpW~2CT$y9sk9h0RvnH`tKCIx4EmuCADS)#* z>U;>WUyG}lwOObVa{K$v&6ocQ-reF%&4;TgAspT0kA^zY;S}u)Qx%x?E_{mcF6>4~ zDd#QsE(~K23^Y=)G~_AKXDQ*#^cZi5@P>0;xdg9DV5wirhtKDO%Nw2&miN~IZ-_Tc z=W|Kk(4u%~B4uuQ;Z`)XNR^qJa5DHLO?X zlxW3_C16S}QNbu_@k6IXMno)t@QBC-P?i~-pk(!Ro_Io~#%f?qXc_1FinB9yqRw7g z3a=Z}7?K=aRMp^!XhrdxVad_OD9g#MUm~JciWqNjAfBP0N*FQTn62<_N^B98KR7nV z>nkTTE!8%$MNvPHzme|MaOE^qM6`wrU|dyTD*l~r&Dvh3r6lZ^eR%OpxJ-^@SS^Q} zc{oHvDa7=AA7l*kmv*bLdn|(ioKoCFk}D{Q`@tb2ApM96x|m>o-E{XX)?lR_y3p_Q z;6`Emhdj8<@iELTSLZ%eZ+`uMs0Yj|QI8VUQ0#m&%qyKqQB=;SYsvk*bS?Za|D!H< z1Nd8w?BW_>oSzk?hbz&ob%+%KEpFeyONM^lRTG}o;s`Ek{r{;5!J4!GLlKykzuR2$ zu}vvc^p;YFdrKkP+$ci|<3Hv>p8yvD()?DcO^QkWPl`oCVTvm5^LM_8i23lD>W`Nw z&}jm)XOJNos!G}z%VEob)mRHt4l8^Fa)&A1=lD-@EBws1C;GqZd%!@4{gOX7f@1!$ zjR~u!>`+uh`3z-!^b2=5zv*E{byaTXiGgfKaAQQ|e0;k^v%@)6H6`}qsbM+gvQ<#o-f~W2G{wfS@hEPX(yipAMN`6ne`*^43ERKt(YOG!&ZTIo)$pGZ*LK%m zd8c^{)f)Z(fS3<|h#zYQTA_313icxJh;3 zXG((Ks2==D^-)kmjH1REPfd99wJ9$UQ?Uv8+F)C1i`{uzejg3M3|=*kqWf?b-H&hc z>Tv@N!Ogsa+(W~7YCeLe;Un=Pjl!#xh5w?__#KVKUuircO{5^2L=iNV%JVuSh90EK z^bpmg>GUu?O0(!OdX;9-GT!uCNl(%{^fYawXXuEJo}=^hJbghg()aW-?-I@uNUw+> z$`$2lj;Ks?MKU>}CCw9^Xug6v&uEt+Xt!a~9-}PnHNxmU zBZfXSD$)U?79BDg(_y0v9Wi>*QR6;3W;{p7jWu+_D4>(Z2XxB#kWL$?=_BI`T`>Nj zi>8|{nUQqa^wJeGfj%?q(wAm^`pQh9TV{Lu!R$monj`2Za~A#LGZ)frb2a_y3Zvg# zG4#8u2L0h`Om|#Od1JJn0M~Ruu4jaBy(XmVPhnW5Fs(>oS)+v8$`Q7;Uj$pHL|N;i z2(`Wv<*Z*sxLb$__iz#E9xtNY4-2pRSrP4?BVyb?i&zheI6l4{?-?d4dqxXiRZq64 z>3LEldgh2)YQe;7!5ZvstBlX{S|J=qK?c6Su`v9O*M=|hQYJ#>qt+$12FZ?3K_l zk&IvPI-;f=k)c^qYGFF5~QA z_|yG1F6USoY~s%5wQmxylH0mR;Yv;m!S3$C_y)&9@w|14*S|Q> zqBo|Lu~`gxya4S8;i40i7hNEM-IEePMv;2Wg@| zOcw*-NpT;%Anu2E!~^W!9KvqQVepg4fZHMyr5J@}L>7jNF}&G5)`ziT99HJ_crtsH zT8nJ#B66^=cm(^4N7yQBZRj%VtH$#vN*=uqsK)uZ(X$Gor~_g zXOSj8;yt=^yy$9QB$tby1f!)y zqoXv9F4AT6mu_R2^cXoZ$aq-V##1ub*euH!XJuLAGZ|vsl%d8CGR(LmBTSEsHml1R zvyqH7+sF#0uf42j_L7y%K{CO7K-MrbWs*5T);A~12Ig$p(A*{)n;*(#^NeibYAKt# zI?86QzOuP%m~81vm#thr+1mAnY~$J}+q!nkc2*79-l{J~dR~xe zo;fnzvsjMutdm)uJ#w_?LpjECM2_`*#2!Rtkk&&jcKQ1aQY5>x{RWATjs*--l#C7- zq&WFaz#zr3KgDm5d=*$9{T8XBkrS{;6^w@i7O5h)w%;Pfnv<19;;tC$N)H&MSk<+P z4ANIc2I;GSK??VrWxv-ZHb{w{-ME=elY}~+9k_*K2DE0w)z`zAw z>prTDR0#HW=V~JrisRgmXd@Md54wGmw3RAH!unEMsc>>xpJ^)1P+KW4^|R(^BNa`ntajQ+#dy|1iZ)WQo;^@g8>tGO54oB0S%MXd z%~b+hD&B?l+bbHxvS5!oHY{nc*xghRRhi18FR_j{xHeCW3gF0kc3o*_IE?3AD3DJ; zh)=VBZpk3H3GMl~&?K<23J)~zvi%P(@(cR&wsBq>OGxtgs78eCxI=jeIb|=8 zlYC+ux=IAbc7~3(JXVX~bU3T$90fzJ_ z>DZIoF?3J?hNT$1FmmO?l?4##H59mh$8z}?z5uTKUm|pEmx3vh&5}f%PpVQ~jC9-y zJok-qMkG*6KD4zmfjXhr`6hu9F~W(eMitq~o?MOk@Z-5^ykiwPw>mwp{j#4yQ*M(> z5Gt=gMR^sf%THM_*Py%n9Qw;IAYFb5Q{;8X<>!3)6|3kCctd^-JJ@g?lHbBnd6Rec zZo#ked$i=&SVsPgmE9jky#wd6nhT>)p@woapivz2Yg8!xgon5&c8Jq;Ji-M_UQb=- zO^Rde-Vbanf*Sk(*+wZdu-0 zRGVrr)%~@pq1Lc3fw%jOX5cZJLx|A=;*6G%V6=ipMr%kl+Cq1u9rQBVLtmo4;(l8!Y!j8h8X=Z-57``jX`+P;JpfCFy1nT;xEQ9{KLq^ zzl;$ijgjOsvdCkM_EC9bEX5n+sERR>su`0g$(T${j43qKm_{Rw$LJ~J3D%}3X}j?h zy>C3tTJ#KEHJ+vGoc^ux65TRp(Qn2pBGQ;GDjRb|Bf}AGjCo>+u|Pa%ye@K$g~BnG zhy}({t!0PUhMeTv7N?ZTfNudlho?Cj#5?zyc!ssYrlIgMo>ghQXugUcu~tZkqm$Ym z8<0SU@toGd?z95WGaL`Vv=l$)S-1s#X%T*+bPFc%wyYYrJYq82^$QH==2>ksR9a@y zZ?ICSj1Qz}#Okdy$`Ebf0j-XFo`UD6ft_rQ73$!kfDWo$wSX$x$PUmr&i0Vhkt4sp z(HyRV%_HLzqE&_175Hd{#C%vhAS8SRPF9LifUyxNl67%#J`7DUyoTSDV?)Q2L@_}X zc-L+_R%Ea^r(P0oxWzjilc;r2REmp_6Y=f>k9b^SQe*cs?7lr4Z_sK2~l22!xf^^W5QYgT3(%gc<92-M9f#j7`wa z*vxvp1^V-*(pa7wJj9iM$=D9B7&~CCu?sdEd*Fic9^5fLK)10E!;Jmd#P|@K8HaG7 zaTM=2j^hyH6pk=X<0#`JoMiaUqtCd2GmR@+&!)5F`}5Vq%Xo#=Vk}hR4Ln{cVi?ab zKjl~u{K^*YGgb=^T;R=QHJZ8kv_yHlrd28hE9urYd7U-_KWF`r+_pZRfvUlb+q6(W zIHvWZhfe&Gv;BL&>du)T^}0sogI9jFFf*7nzO5+si)0xgV^@e>5wcJ-#KwSTID6|; zcMaeLjhBAA$$he_q)RZiS|R+#Vxl*$TYc`e<* zhn%4e*wj7bywHHERb+(;(#ahIdcX?PNJm*=$~adWP^_<%ZUm=zWU@Q&uO}kh^P!5D zM{lJnF0Y3R<^sGH>q=0uuH0Fr?44gx{A7I#poU6QDpNu3#7b-uO`)w~q3ZPYnyfq9 z;VIs7d^#o8Z!(p}2j)3(DyHT+Sjkz~kmACsy^Ga(V~(pB=sp9TqYc>`T~a(j-k>^K zJnnq-7K=x17<&Cl_I!xardsf(VjwM}XNo5e;+gd^jIBD1f>kx)2=4}AREmdp5>-z; zB9eo`qEl>cBKF${3(+%10hcMUb6Cd9Z^P8i;X}^jji{RHufhLS{2_r-bzk)c2Rf`u z{dM4MZ5Zo> zTKx!vjGthV@iRPT+=f?;-(ZgMJ8U%mfNjPd*lGL)d)dnFHxUk-1V5MpBTWM&yFvm$Oa<8ZrK z8F!l1aKBj{ubDOQmRS>jG!yX;vldk}>ri!e+|@UeD8;Nteb|9F)NDxEW@DOaCR482 zlwN0t-eR*kEjL?Gp3iJaYt2@4+HB1Zy*7f(wj#)EC+eH+MMJZbXkvC2DP~vE(!58s zHM@xnlMmXMy~TrOUoqY6FJ_nn#By_>SZ@vzyUhEhk4M>WcoA#jHC|^Z|C&W9f#QOwPoOwk1O5u{kpUuA1&uuo+{3! zJlLs=3#RJWQWxjpIdex{oLemC<$yji@e0M2)!!iaEq_L5Xv19due<+t?w+j}<1D>LnogOn!t&wQ9$s$> z7fKITNVp*q4L7Vn?k+A5uUOqG*`rc|EdIs3g3{lTe9s#kOhl6nS8li$n z6-23^ybHY+MyqIy#cl|GR!~7j6~ytSw-p$#qLoxoSp`)rtg4;~9;}AdRZzo)H9b7z z(%dB~7HcW4_%0t|9T)QbVfMOuIH>2s`WEv2y}H;?G1Q3f8e?M%lU>NS_8OtEkT3N# z!e%N+QGu_yLT;ggmKL^BL|R*zs_^Pr*hZzd^N#%7`u`U*N<)w#$ z>86727WPo=@+H0mIK#r3>iM{ZPgwY*g-`LDvursv@5G)83tzWzp@oZ7 zl@?pL#KNT(E>myIEnK0*yHW*jxNw!ClBa?Jw7IWyCf2ucvyRlW`NBV^$ehVj zGHpJ9{GLml*WU^UYpjok`v zj|%px;5`+*uYwO$uup+feZFL}UzPQtjR)YmjR)Zf`VX$R3AbSbY_wq$Y_`=*-{xiG zQGLAMWAmz!X&lGHxf74YId|4kh2SlC!sZKGr))e8$DJDMscF<1JZtmf)fmrLLO#bYZ1@*^Wy9C-jSb(zcTSlNG}*eKs9faIp4~vT~Om(28>36md6iFe!ZF+-i%KsCe}{L=Yr163&hkt#jd9p64JCoMkb zp^2G%Ujn{>T~4Eo>`?y_t~*a|r0U{lPI+e|^%dv1>T(k$h)bMOdlO&YJp;RJ_>`0T zZKA2-GcMuiCh8*2bBcE}RTWp@s*}2z%e=-ZV>VMA>$1Z5f$^7a=KH@tD)xVZUAYgh ztSWwC^zSxPKmL>k^HphX0YwxH-a=ztd}`bsUnf01-W}g=RA%~^?D(8fnelu}jxW39 zWa|4b@gw*?iAwcfRg15YH6mVXO6~aUoCy=NyJ?Ch-JV~e2uSJpCX z#@Aqdj-Q$~c1k9f!MYmHR7a%wSmP8OzNnHmIYWJqN9EOw=Q0>Rqqe48cqcACZA4CH zDPH(CT&6-&45v-b%!tpKpfS=i(k622WY<=N6z_iKhNop`PE2Dy<0tr&v%>?|?cy2R zPlX%Sd29zog%kk=h!uRegFZ&zT9#MZSe6%G4NM=Sg%bdXADcCj3rL9{KOw$`5*j}> zP)$|WG$op>oUEzL@c5j}kzA1)T<^&_T7dOx)-ICs_$lLtb1t)3dA7XNK zbR*TT7ylo132?!Lio{vpS+t7|iR<_;XY_806<@I$Jhz*&tm}9~_1mk?q-)qE%7)#r zhY#lSvnQF-f7{NCkw(}dp4nLst{Q-&^ zwUv{24CAm1PcypmdB6Yyd&3G5Seq4P&f$w5iWq;sVKdb5Gp7icINWTOa~>#UHS zi3cgVelhTU8d#kq2A%-=OHwhmg}Mxul1AHpkSdfwOD}{S=03#7owquR z4^fk5s!Hm!EAdbkKID5Iyv~Iuig2F@;HtEPEM#K*L;eaoWe)Rkgso2MVTvi1B-1Gr z%wag9OPhL_W-#3C!&E&%mFBP3gaDl2b^1}=e5eek#%OnhQj?T4{2$I)#eU;Fo;$BD zA;P4hVvg~}6eYrqN2qeMVkG`@2DhXQTT93!w5VR8a1u^28Y&a5(Swgtof2j4h4L)x zXqIzvo5vQF$#zjAWigVkxXh!Bbc~Ts+!g7pUmjeo*1BZA)x#cuj`P6`>$EHiibc%!UL##PMwP284*e>9rvz}JXi<$r8o1hViYo?2vjlLNqH6Gnrh&&Yuok4I zjAiZ$%!8o<=JK0rMP&Wpo+dX!NoS@(m99O(6I**N- z<5nk1>I+tb@>reEan~$?R4jEK6*ba=(n$3gsR1K3x+@Y7t{Ul=6D6h2*TRZ5vRLXo zNNeEMC#hMnGGGTjchC`{_ySQeQjH?%^MJ0A@=lg&s*%Zzw69nCGf3)p!}x%2IKMMOcnZfI?f}f$z4Kop1BJVRFgV|?5sV_ zhs=w55x$~<|I^mr3>d{*e9_KdW)eRO$Cv7VXMA3XGKUp7wZX6_cZWFXG*o^W-eh1mrzgwskj85 zgKDG(XGedDYlN304`?hwja3Q%vsthcsP3L zV_H#PQPq;?lYoAzLabyb@j9l9@S7in-4VaB@YDuDa6#H9v>l!D=g7wSPUtx*7sMCI zn&d;XZd>7XC+;G};Xk4P=vadB&pj4_)ZHZ3{QW~|Sk<@`t_jTmceVynH>P&m7 z3mv4cbcwq0VZKg$n6C#P^T#r?!jeK1oW!qkVApkA(sdbuL%`&iffobzQq zJu3<=Nu2lO^ZehoD;lwBLF|MBRe;JN!W=4VP^3$5XUFsq9S8@lWak zs9!VZ6wR=<``oBkrDU|T;iReyZ8pkaUUp5JZu>ku*9&(@1sVwcoJ zx{nu!!*ncWrufc}VLu`6_}yW_FA4t6i*mVzE)f0vxT99`7h-hUq<6#ksjVEcn9eZKp+? zzsQRhMGe0n&-Ix&8mbFA_oF~R(F=FP<9>#Q*>bNxt!jC>EmH7jcb!k`%BBjziA|FF zGqlc-B&j9r%u13?bk@NnnW7_RJ=tDIy4RCkbfkGR8RKlO7eM``o*bc*ht`+Fit{hk z59G%+D4D#dK_K}`1OEqioqHO}hYImyoX;A{4*D&zksP2SPd1Y2I#NHGi!~a{`}JFT zW2wJT>l|ntD4+AE>Z~=%aae6Wv0%$*i=5C zBV4`vbYxyLsXxZ++-fE>bjpB~KBy|0q?yr~xzE$Xp%ycbh=U^KAp9?RIj8&YIOuj@C5PCueeA^al5>i(;+$bUDaNVLS=yT3FU{8;zQ89t)GwsCUxT35~QwXP=r%9gG^0Nm$yd&rOxpK)yu((PR%X>R$6u8tS$5WS$nc6 z-dWuxz(sCK&$+x6tUk>Ey-RWN`yxO5j7KR>lhRx(SAI%a0QI}S6nxey4L>&nYdUXr z4V1j6E0-LbuW}kWGd|}p7u{|fkY_2!ekn?=_7%Yg=?@YqXTQG@UM-t-v=Uo+_3K&+ zX|?IhzE{ROA#13bQ@&dO{>|yX=V$PCiu$!J1>Ydl55MOxigfDnL38I()*M~OqM?Kf z=~D{nmxw?iJi0hMx|p?l-Gdaa#vPWQ(h__6)Ol~RhNxf1Qn*?1MFm!NHuemZRcbgY z1wSRR2tL9&-y(afpUD?mTB7gNGaKc%Iu(3RVIaGbNcFngEEeq(G=b~z`!cL1|yZ_XMqz9=i) znbBKDYWC)>%%ftr z{(<^@qq0)p@Mo2s#aTR7`n&enew@{QV^LPPGi-qUUSC-cb zc6IQhgKDxys-OCJN#VbhGgt0cNcvOm&ZqY>mBho&rvsU{_3cXXme!xMoUw5@AKit{#35Gen1_Z>aW&(3qL)EW;Vd?x_In(^QG?HC3P4H9xY5-F% z`?CUS;kAR&R2&q5KQ`v8CN`gqRKL7$ublbjD@5y)NgqJc373Cn z#A`^-e~O?Xc1D_Z zM#G51#|1Oy=K8C;qLJ=sbJ_C!oc^L2v$oBdRkmYJdAMX?{ox(>zbDq#oa;|zs6gTwJqOyNJ$s@ZGg_Nww8dLv3FJu3Shc+IQu&kX&-JIH z#DP3=A+RGlbKnG~N?;cYGF<$nfWLj768Zi%%;YdX5o3LamHbAjhn zJBGq@>5$cLj<)x-b;ml}qWhwQjsA1c{pwzbB)V%<)X>ohe!}01to2%{fD~3^m?LhJ=@hVZ047p(hRrrKdaA zc6L3ZAVj)ad)lKN-HFPM=Jk=TNP83$buhrwhgr2~$ASIrgAtaBGXs>-!vingv(F6f zP#rq-LZT2ktobr+n00FbX^sp+C>NX&oMEGG))|2v3Ug=D*xl!-vAbu!C5_!ZbEw7+ zy*j92l8CfprCF{vUDZR)kyXR&kZe$gjfkOl4+B>{8(I=g-+S(sAQAr!O%COry@}5W zue|xfi)im`dP%39eyXLIkFKO$2DSOAojP=i`^if&gF5{*i*_5-Wl+MPZi9LZ+GEgO zgZ3G;-=G5qU1iYK23=#&wFX^h(Der0V9<>Q-DJ=~gKpO87K0AybgMyc)9E&YZrAA! zgWhh?om|#k2ED_ecN%oJLGLo?9)s>R=stt)*XaQ+`>;Vr{4|~(H0U8eh57lgpU&s! zBYv95&qw{VoS#Pxdd#3>20d=j69&Cor}r4tYtWMhy;rCA>GXa-t)dwJJmsgA^Z|bR zpiUnWu6nw&$TsG)%8`?20bmvyC~KX>s}(rRWkJwLGCK-p9SUD#yX<)J?%T9T^k}h z+7J_{jpOKbNu(>rVJp(zy)%{&G_e+^rsSarN1fE^MIJ-=2j#lkakvvSvSe%jT5;JT zhQAuruOqs*va1zYHM+*lG(Cx2tSr>iNt5}Q{+J~>Jm$AZou8VM$Cq)T*q#-!u)VL_w({`z=0 zxzdJPV|;S;`*nKOr01wl(8|GK4!4oODNZtcnm6eLofKr0Sz%zaY>%KEZbx{}>>0CX z%oWtR0o@wL|Bl!h;mUA#Jl?h|)*Wt%cZH+-I-^}N-XTQV!p+e{thFN?>1f7la@UN} z7H*Ap#Jl%*@+;2l{zPO!HHSCOc zM)4Bq4x<7#YoI3)ZRu$%6|@9t!<%Y0tX{WqL%6bjb9hr_Lqlc#hRq9+wtHtBU!%aS zgcJjzjREl9NLLpo&i-(`MbP59>V~S-$WghxrnY9o<}jMLvSvelbz@_A<+=tmetl)b zhMKC4wUrIw^&1=3uWPKH5e_#-xl$MirK{>UhSlk#Exf*G2M)L4+E`PxBN3J8YL9nC zft&6Kc4xA=O@bEL&28xdm_)p#8&!%{g!jjL!cCEma91>i2W~acI}_CcX^pk)7qkLV zJsr)_F4-#V&e{`biVO@=nMfks$<<5j1PXQlOeJG?CD)+QszG>V9B}2?yfhpI`cQ;5 zT*4RHMOck11)>C9P=bCzwY$P`IjN?iuKUB-%%*ap(e9nmwoZ_*GWFETb_x-*huEwz zSVW!syJD?7yTc__Q^Rv+&7R8`jkkk?!|bD|Uk=O8u6Qf9qv57_do&??H(a^Aab4}k z4b`=q!}aSNUC-mx!g&~jFdE*DG213b^|t0%E0|o{Fyv>==xhs@?VU11!N>4R>yJ`7 zthrCnIpMw0HZB-bpgt4|+$p}GL`@)%# zTt-=0zgVtqB)q#P*0d{}h+@CCQ+8fwJducDWwfgg`U!#<<_-JqFdsX^oY8_7PL|9x zcb1?9gEzo|RA6~UePvagcZ*DY1toxFXN;^7@>Fbk?OPS&D;fs%ZjQI3s%xBLxm%98@kn6WCO> zHDf;Q!9NirE|uFWTAN-B~en z=H9(~XS8omL z&U`_6Wo6DOj`5E&)cMPlPaf2`B@+}(Th%JUzLrQ^0$an;nM+9OQ!tIPrsC}^$$F$d zT{!qkk)%bu7TW{}Q$7`nccp-h!0}^Gq%GF0NJ|Uv`+(lU^-K<k`OZ27^KsLQB@R85kw8^v;nXcS z6m`dI<9nlBRlo&MSTeOg96$j(KibhOs4QDC{c>0cLACv@(eAovA`xi?aHBh}YDVW_ zmsX2Yyo*9qNA(D;LrA0b2wzMM$*@UdsL>JLfHZ=Sm-yX;95eC6mXAEsPLTGD1aT>T zy)yCw+KhKoC7>;|6(Jwb6~rL3o3D{wDE0nnFCL+y^J@ zJI#7dPo{EWuryW0vQ!mk$SO*d&qTIlh8NwE8nNeKb43KQg<2`boO5mrhvmbDi>$%i=F0-DM*0T!FUNyK@SW(q7YGQ3Kg=+!o6s^K|TOB|j)c}WU z@aUtpNb?NFI%!>64~8>8_k%yC5r(%IN!1w2<>aCHluH*;kSY*bNK0rD(k#JzT85!t zNf9vNVpK)DX$9>^o*TeiyMtEKJyb&v(HeS!*3wg$htDF%tC)e`qYd;^%&y;He*F@yR*1#Ke@HTV&22Ob2{Lh6B<@OFTT@z%^_LA#%#_{wL-7W`_|ntrj8^X3bm`g4GY z|Co9VzA9Op@RTfp^A6Nn9<7hq4JWTHXQZ=#Z}Wo&uJeNwUaV7t9~26Kd}{QAc5UF` zM*abRZ4<{_%7M)}Ox<#rwDHdsI&I@D+x=+U4uhI>YW7nR!zrRD|FrN=EBMShfg5=) zn4_D9U{wB-xWNii5KCA{vrw3^l-X+?mNNGaxrT`g~VgSt%0$4`~@I4G4x#SaRRsbFsk_vN+j``&VU=WAUy6QXr)e?ON!FWZ8vQL@hz3^Q;4CvL_}FYde6P%=Pwk zwndt-4e&*~y5e0MP%Z2aEQpv8Xk`*SZ$*;`G zZ$|q^0RZ-og3^ZBV9AY`bw`ApB~vk}yt|_N8yQ5Qy|I<|Cb}Wztwo83XOl`X-P#7TrQ0J@6p2gU9BeiQCb~{>Ksb}tzQhjc@yVRIl?kO$s&Mo(r z7T{ekE%41PH%bfqbIX0D1vzue{iOxw-13~#g50^~W@$m*-16K~*WB{FQuo~Q{8D5r zC@lb_!c*kJj>=sT2n7l%Pm;%VlDvJSZ$hvNL3b*+3PDdQxB)@071Tq4aR~O2@iO`P z$R7#>kueqCjtHbpkI*wCe3=nBnGv~Z5qf8{-dSFhrEpX;y{vwP8<{Ek6>esx$X56W z6rSExgoiHOp9#BPONUi@kV{WPBf>+s>>QOovY@_v6#hozFND7_A)L~3o+lGG1Y<*E zpQl_whiN~*O-jChmq>TnBLPj z1xE$*j?$Rm=wSX)Dhh^z1xLvYjtLeX#h8A|^%SO=izgPnk689(5{?Ixu|u3fd5}XW zqN$k4(`W)s$Cpz4mO<2D1`ZH2X)*5fs}NdEb8r~H5XbGgbScfF2o4pUNO2vG7i^cu4MEro3YC&42T~3wSyJ$H!)K%Jpv_gB7s

yrS@4`rM*V0 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 If not, there will be thrown exceptions like IllegalArgumentException or RunTimeException. This will end the program and the JVM on a correct way * @param args String[] | all the arguments needed for the excecution. + * @throws be.uzleuven.gc.logistics.GBSX.utils.exceptions.StopExcecutionException */ public FastqDemultiplex(String[] args) throws StopExcecutionException{ this.parameters = new DemultiplexParameters(); @@ -322,7 +325,7 @@ private void processPairEndFastqFiles(){ //read the next fastq line try { //try to parse the fastq - ProcessedFragment newReads = this.parseFastqRead_new(fastq1, fastq2); + ProcessedFragment newReads = this.parseFastqRead(fastq1, fastq2); //if a read is empty: correct it if (newReads.getRead1().getSequence().equals("")){ newReads = new ProcessedFragment(newReads.getSample(), new FastqRead(newReads.getRead1().getDescription(), "N", "#"), newReads.getRead2(), newReads.getMismatch()); @@ -498,319 +501,7 @@ public void writeToLog(String log){ Logger.getLogger(FastqDemultiplex.class.getName()).log(Level.SEVERE, null, ex); } } - - /** - * this method gets two reads from a pair-end fastq file. - *
Read1 is from the first read, Read2 is from the reverse read - *
The reads are made of the 4 lines for every read: the information line, the sequence line, the + line and the quality line. - *
The first read is searched for the barcode + enzyme site (looked to all known samples) - *
if no barcode + enzyme (perfect match) is found, a InvalidReadException is thrown - *
else these are trimed from the read (both from the sequence as the quality) - *
then the read is searched for a cutsite of the same enzyme, if any that piece + the rest is removed (both from the sequence as the quality) - *
The second read is searched for the enzyme site - *
if no enzyme site (perfect match) is found, a InvalidReadException is thrown - *
else these are trimed from the read (both sequence as quality) - *
then the read is searched for a secund cutsite (this will be the complement of the enzyme site + barcode) - *
if found these are removed + rest after (both from the sequence as the quality) - *
a new array of Strings is created with 0 as the modified read of read1, and 1 as the modified read of read2 - * @param read1 Map | the 4 lines for the first read: the information line, the sequence line, the + line and the quality line (as Fastq from BioJava) - * @param read2 Map | the 4 lines for the second read: the information line, the sequence line, the + line and the quality line (as Fastq from BioJava) - * @return ProcessedRead | All information about the processed reads - * @throws InvalidReadException if the first or second read doesn't has the right index (barcode + enzyme site for read1, enzyme site for read2) - * @see FastqDemultiplex#findBestBarcode(java.lang.String) - * @see FastqDemultiplex#findRead1EnzymeLocation(java.lang.String, be.uzleuven.gc.logistics.gbsDemultiplex.model.Sample) - * @see ProcessedFragment - */ - private ProcessedFragment parseFastqRead(FastqRead read1, FastqRead read2) throws InvalidReadException{ - //search for the optimal barcode - //SampleBarcodeCombination sampleBarcodeCombination = this.findBestBarcode(read1.getSequence()); - SampleBarcodeCombination sampleBarcodeCombination = this.findGBSBarcode(read1.getSequence(), this.parameters.getStartDistance()); - if (sampleBarcodeCombination == null){ - //no optimal barcode found in the first read - throw new InvalidReadException(read1, read2, InvalidReadEnum.READ1); - } - Sample sample = sampleBarcodeCombination.getSample(); - String barcodeEnzyme = sampleBarcodeCombination.getSample().getBarcode(); - String enzymeCutsite = sampleBarcodeCombination.getEnzymeCutsite(); - int barcodeEnzymeLength = sampleBarcodeCombination.getLengthFoundBarcode(); - if (! this.parameters.keepCutSites()){ - //the cutsite mustn't be kept - barcodeEnzyme += sampleBarcodeCombination.getEnzymeCutsite(); - barcodeEnzymeLength += sampleBarcodeCombination.getLengthFoundEnzyme(); - } - //remove the barcode and the enzyme site - int read1BarcodeLocation = sampleBarcodeCombination.getLocation(); - String read1modifiedSequence = read1.getSequence().substring(read1BarcodeLocation + barcodeEnzymeLength, read1.getSequence().length() - (this.longestBarcodeLength - sample.getBarcode().length())); - String read1modifiedQuality = read1.getQuality().substring(read1BarcodeLocation + barcodeEnzymeLength, read1.getSequence().length() - (this.longestBarcodeLength - sample.getBarcode().length())); - - if (this.parameters.keepCutSites()){ - //add the cutsite to the barcodeEnzyme when not already added (to have the correct complement) - barcodeEnzyme += sampleBarcodeCombination.getEnzymeCutsite(); - } - //find the next enzyme site (if there is any) - int read1EndLocation = -1; - int[] read1EndLocationLength = {-1, 0}; -// EnzymeComparator enzymeComparator = new EnzymeComparator(); -// if (enzymeComparator.compare(sample.getEnzyme(), this.parameters.getNeutralEnzyme()) != 0){ - read1EndLocationLength = this.findRead1EnzymeLocation(read1modifiedSequence, sample); - read1EndLocation = read1EndLocationLength[0]; -// } - String read1optimalSequence = read1modifiedSequence; - String read1optimalQuality = read1modifiedQuality; - if (read1EndLocation != -1){ - //compliment barcode found - if (this.parameters.keepCutSites() && ! this.parameters.isRadData()){ - //cutsites must be kept - read1EndLocation += read1EndLocationLength[1]; - } - read1optimalSequence = read1modifiedSequence.substring(0, read1EndLocation); - read1optimalQuality = read1modifiedQuality.substring(0, read1EndLocation); - } - - - //parsing of read2 - //find the first enzyme location - - //just cut the first basepairs because these will be the enzyme site - int read2firstEnzymeLocation = 0; - String read2modifiedSequence = read2.getSequence().substring(read2firstEnzymeLocation); - String read2modifiedQuality = read2.getQuality().substring(read2firstEnzymeLocation); - if (this.parameters.isRadData()){ - //RAD data -// if (this.findingDistanceAlgorithm.isEquivalent(read2modifiedSequence.substring(0, sample.getBarcode().length()), sample.getBarcode(), this.parameters.getAllowedMismatchesBarcode(sample))){ -// //possible barcode found -// read2modifiedSequence = read2modifiedSequence.substring(sample.getBarcode().length()); -// read2modifiedQuality = read2modifiedQuality.substring(sample.getBarcode().length()); -// if (! this.parameters.keepCutSites()){ -// //remove the enzyme site -// String foundEnzyme = ""; -// for (String enzymeSite : sample.getEnzyme().getInitialCutSiteRemnant()){ -// if (this.findingDistanceAlgorithm.isEquivalent(read2modifiedSequence.substring(0, enzymeSite.length()), enzymeSite, this.parameters.getAllowedMismatchesEnzyme())){ -// foundEnzyme = enzymeSite; -// } -// } -// read2modifiedSequence = read2modifiedSequence.substring(foundEnzyme.length()); -// read2modifiedQuality = read2modifiedQuality.substring(foundEnzyme.length()); -// } -// } - }else{ - //GBS data - if (! this.parameters.keepCutSites()){ - //remove the enzyme site - String foundEnzyme = ""; - for (String enzymeSite : sample.getEnzyme().getInitialCutSiteRemnant()){ - if (this.findingDistanceAlgorithm.isEquivalent(read2modifiedSequence.substring(0, enzymeSite.length()), enzymeSite, this.parameters.getAllowedMismatchesEnzyme())){ - foundEnzyme = enzymeSite; - } - } - read2modifiedSequence = read2modifiedSequence.substring(foundEnzyme.length()); - read2modifiedQuality = read2modifiedQuality.substring(foundEnzyme.length()); - } - } - - //find the next enzyme site (if there is any) - //String complementBarcodeEnzyme = BasePair.getComplementSequence(barcodeEnzyme); - int[] read2secondEnzymeLocationLength = this.findRead2EnzymeLocation(read2modifiedSequence, sample, enzymeCutsite); - String read2optimalSequence = read2modifiedSequence; - String read2optimalQuality = read2modifiedQuality; - if (read2secondEnzymeLocationLength[0] != -1){ - int read2secondEnzymeLocation = read2secondEnzymeLocationLength[0]; - //enzyme site found - if (this.parameters.keepCutSites()){ - //keep the enzyme sites - read2secondEnzymeLocation += read2secondEnzymeLocationLength[1]; - } - read2optimalSequence = read2modifiedSequence.substring(0, read2secondEnzymeLocation); - read2optimalQuality = read2modifiedQuality.substring(0, read2secondEnzymeLocation); - } - - - //size selection - boolean trimedR1 = false; - boolean trimedR2 = false; - int lengthR1 = read1optimalSequence.length(); - int lengthR2 = read2optimalSequence.length(); - String sequenceError = "TRIM\t" + "trimok" + "\t" + read1.getDescription() + "\t" + read2.getDescription() + "\tor1:" + lengthR1 + "\tor2:" + lengthR2 + "\tread1:" + read1optimalSequence.length() + "\tread2:" + read2optimalSequence.length(); - - - if (read1optimalSequence.length() != read1.getSequence().length() - this.longestBarcodeLength){ - trimedR1 = true; - } - if (read2optimalSequence.length() != read2.getSequence().length()){ - trimedR2 = true; - } - - if (! trimedR1 && ! trimedR2){ - //both original => ok - this.correctionLog.addCorrecterTrimOk(sample); - }else if (! trimedR1 && read2optimalSequence.length() >= read1optimalSequence.length()){ - //R1 is original, R2 is trimed, but same length or longer => ok - this.correctionLog.addCorrecterTrimOk(sample); - }else if (read1optimalSequence.length() == read2optimalSequence.length()){ - //R1 and R2 are same length => OK - this.correctionLog.addCorrecterTrimOk(sample); - }else{ - int compareLength = this.longestBarcodeLength; - if (this.parameters.keepCutSites()){ - compareLength += sample.getPossibleEnzymeCutSiteLength(); - } - //R1 and R2 have different sizes, find lowest and check - if (read1optimalSequence.length() < read2optimalSequence.length()){ - //R1 is shortest - if (read1optimalSequence.length() > compareLength){ - String read1end = read1optimalSequence.substring(read1optimalSequence.length() - compareLength, read1optimalSequence.length()); - String expectedStartR2 = BasePair.getComplementSequence(read1end); - if (this.parameters.keepCutSites()){ - if (this.findingDistanceAlgorithm.isEquivalent(read2optimalSequence.substring(0, sample.getPossibleEnzymeCutSiteLength()), expectedStartR2.substring(0, sample.getPossibleEnzymeCutSiteLength()), this.parameters.getAllowedMismatchesEnzyme()) - && this.findingDistanceAlgorithm.isEquivalent(read2optimalSequence.substring(sample.getPossibleEnzymeCutSiteLength(), compareLength), expectedStartR2.substring(sample.getPossibleEnzymeCutSiteLength()), this.parameters.getAllowedMismatchesBarcode(sample))){ - //is equivalent:(read2(0-cutsite), complement read1(0-cutsite) with allowed mismatches enzyme) - //and is equivalent:(read2(cutsite-comparelength), complement read1(cutsite-comparelength) with allowed mismatches barcode) - //is same => trim R2 - read2optimalSequence = read2optimalSequence.substring(0, read1optimalSequence.length()); - read2optimalQuality = read2optimalQuality.substring(0, read1optimalSequence.length()); - trimedR2 = true; - //sequenceError = "CORRECTED R2\n"; - this.correctionLog.addCorrecterR2Corrected(sample); - }else{ - if (read1optimalSequence.length() + sample.getBarcode().length() + this.parameters.getAdaptorCompareSize() >= read1.getSequence().length()){ - //read1 is only checked on cutsite, not on adaptor, not corrected so wrong - int minus = this.longestBarcodeLength - sample.getBarcode().length(); - read1optimalSequence = read1.getSequence().substring(sample.getBarcode().length(), read1.getSequence().length() - minus); - read1optimalQuality = read1.getQuality().substring(sample.getBarcode().length(), read1.getSequence().length() - minus); - trimedR1 = false; - this.correctionLog.addCorrecterR1Corrected(sample); - }else{ - this.correctionLog.addCorrecterR2NotCorrected(sample); - //sequenceError = "NOTCORRECT R2\n"; - } - } - }else{ - //not keep cutsites - if (this.findingDistanceAlgorithm.isEquivalent(read2optimalSequence.substring(0, compareLength), expectedStartR2, this.parameters.getAllowedMismatchesBarcode(sample))){ - //is same => trim R2 - read2optimalSequence = read2optimalSequence.substring(0, read1optimalSequence.length()); - read2optimalQuality = read2optimalQuality.substring(0, read1optimalSequence.length()); - trimedR2 = true; - this.correctionLog.addCorrecterR2Corrected(sample); - //sequenceError = "CORRECTED R2\n"; - }else{ - if (read1optimalSequence.length() + sample.getBarcode().length() + this.parameters.getAdaptorCompareSize() + sample.getPossibleEnzymeCutSiteLength() + sample.getPossibleEnzymeCutSiteLength() >= read1.getSequence().length()){ - //read1 is only checked on cutsite, not on adaptor, not corrected so wrong - int minus = this.longestBarcodeLength - sample.getBarcode().length(); - read1optimalSequence = read1.getSequence().substring(sample.getBarcode().length() + sample.getPossibleEnzymeCutSiteLength(), read1.getSequence().length() - minus); - read1optimalQuality = read1.getQuality().substring(sample.getBarcode().length() + sample.getPossibleEnzymeCutSiteLength(), read1.getSequence().length() - minus); - trimedR1 = false; - this.correctionLog.addCorrecterR1Corrected(sample); - }else{ - this.correctionLog.addCorrecterR2NotCorrected(sample); - //sequenceError = "NOTCORRECT R2\n"; - } - } - } - } - }else if (read1optimalSequence.length() > read2optimalSequence.length()){ - //R2 is shortest - if (read2optimalSequence.length() > compareLength){ - String read2end = read2optimalSequence.substring(read2optimalSequence.length() - compareLength, read2optimalSequence.length()); - String expectedStartR1 = BasePair.getComplementSequence(read2end); - if (this.parameters.keepCutSites()){ - if (this.findingDistanceAlgorithm.isEquivalent(read1optimalSequence.substring(0, sample.getPossibleEnzymeCutSiteLength()), expectedStartR1.substring(0, sample.getPossibleEnzymeCutSiteLength()), this.parameters.getAllowedMismatchesEnzyme()) - && this.findingDistanceAlgorithm.isEquivalent(read1optimalSequence.substring(sample.getPossibleEnzymeCutSiteLength(), compareLength), expectedStartR1.substring(sample.getPossibleEnzymeCutSiteLength()), this.parameters.getAllowedMismatchesBarcode(sample))){ - read1optimalSequence = read1optimalSequence.substring(0, read2optimalSequence.length()); - read1optimalQuality = read1optimalQuality.substring(0, read2optimalSequence.length()); - trimedR1 = true; - this.correctionLog.addCorrecterR1Corrected(sample); - //sequenceError = "CORRECTED R1\n"; - }else{ - this.correctionLog.addCorrecterR1NotCorrected(sample); - //sequenceError = "NOTCORRECT R1\n"; - } - }else{ - //not keep cutsites - if (this.findingDistanceAlgorithm.isEquivalent(read1optimalSequence.substring(0, compareLength), expectedStartR1, this.parameters.getAllowedMismatchesBarcode(sample))){ - read1optimalSequence = read1optimalSequence.substring(0, read2optimalSequence.length()); - read1optimalQuality = read1optimalQuality.substring(0, read2optimalSequence.length()); - trimedR1 = true; - this.correctionLog.addCorrecterR1Corrected(sample); - //sequenceError = "CORRECTED R1\n"; - }else{ - this.correctionLog.addCorrecterR1NotCorrected(sample); - //sequenceError = "NOTCORRECT R1\n"; - } - } - } - }else{ - //same size (may not occure here) - this.correctionLog.addCorrecterTrimOk(sample); - } - } - - - - - if (trimedR1 && ! trimedR2){ - //R1 was trimed, but R2 not - int mismatch = -1; - if (read1optimalSequence.length() < (read1.getSequence().length() - this.longestBarcodeLength - sample.getBarcode().length() + 1)){ - mismatch = (MismatchIndelDistance.calculateEquivalentDistance(read2optimalSequence.substring(read1optimalSequence.length() + 1, (read1optimalSequence.length() + 1 + sample.getBarcode().length())), sample.getComplementBarcode(), 1)[0]); - } - read2optimalSequence = read2optimalSequence.substring(0, read1optimalSequence.length()); - read2optimalQuality = read2optimalQuality.substring(0, read1optimalSequence.length()); - sequenceError = "TRIM\t" + "tR1nR2" + "\t" + read1.getDescription() + "\t" + read2.getDescription() + "\tor1:" + lengthR1 + "\tor2:" + lengthR2 + "\tread1:" + read1optimalSequence.length() + "\tread2:" + read2optimalSequence.length() + "\t" + (lengthR1 - lengthR2) + "\t" + mismatch; - this.correctionLog.addTrimTrimR1NotR2Fail(sample); - }else if (! trimedR1 && trimedR2){ - //R2 was trimed, not R1, so check sizes to diside to trim - if (read1optimalSequence.length() > read2optimalSequence.length()){ - //read 1 is longer, so trim read 1 - int mismatch = -1; - if (read2optimalSequence.length() < read1.getSequence().length() - this.parameters.getAdaptorCompareSize() - this.longestBarcodeLength){ - mismatch = (MismatchIndelDistance.calculateEquivalentDistance(read1optimalSequence.substring(read2optimalSequence.length(), (read2optimalSequence.length() + this.parameters.getAdaptorCompareSize())), this.parameters.getCommonAdaptor(), 1)[0]);; - } - read1optimalSequence = read1optimalSequence.substring(0, read2optimalSequence.length()); - read1optimalQuality = read1optimalQuality.substring(0, read2optimalSequence.length()); - sequenceError = "TRIM\t" + "nR1tR2not" + "\t" + read1.getDescription() + "\t" + read2.getDescription() + "\tor1:" + lengthR1 + "\tor2:" + lengthR2 + "\tread1:" + read1optimalSequence.length() + "\tread2:" + read2optimalSequence.length() + "\t" + (lengthR1 - lengthR2) + "\t" + mismatch; - this.correctionLog.addTrimNotR1TrimR2butFail(sample); - }else if (read1optimalSequence.length() < read2optimalSequence.length()){ - //read 2 is longer, so is ok - sequenceError = "TRIM\t" + "nR1tR2okl" + "\t" + read1.getDescription() + "\t" + read2.getDescription() + "\tor1:" + lengthR1 + "\tor2:" + lengthR2 + "\tread1:" + read1optimalSequence.length() + "\tread2:" + read2optimalSequence.length(); - this.correctionLog.addTrimNotR1TrimR2butOk(sample); - }else{ - //same length so ok - sequenceError = "TRIM\t" + "nR1tR2oks" + "\t" + read1.getDescription() + "\t" + read2.getDescription() + "\tor1:" + lengthR1 + "\tor2:" + lengthR2 + "\tread1:" + read1optimalSequence.length() + "\tread2:" + read2optimalSequence.length(); - this.correctionLog.addTrimNotR1TrimR2butOk(sample); - } - }else if (trimedR1 && trimedR2){ - //both are trimed so both have to be the same size - if (read1optimalSequence.length() > read2optimalSequence.length()){ - //read 1 is longer, so trim read 1 - read1optimalSequence = read1optimalSequence.substring(0, read2optimalSequence.length()); - read1optimalQuality = read1optimalQuality.substring(0, read2optimalSequence.length()); - sequenceError = "TRIM\t" + "tR1tR2notR1" + "\t" + read1.getDescription() + "\t" + read2.getDescription() + "\tor1:" + lengthR1 + "\tor2:" + lengthR2 + "\tread1:" + read1optimalSequence.length() + "\tread2:" + read2optimalSequence.length() + "\t" + (lengthR1 - lengthR2); - this.correctionLog.addTrimTrimR1TrimR2longR1(sample); - }else if (read1optimalSequence.length() < read2optimalSequence.length()){ - //read 2 is longer, so trim read 2 - read2optimalSequence = read2optimalSequence.substring(0, read1optimalSequence.length()); - read2optimalQuality = read2optimalQuality.substring(0, read1optimalSequence.length()); - sequenceError = "TRIM\t" + "tR1tR2notR2" + "\t" + read1.getDescription() + "\t" + read2.getDescription() + "\tor1:" + lengthR1 + "\tor2:" + lengthR2 + "\tread1:" + read1optimalSequence.length() + "\tread2:" + read2optimalSequence.length() + "\t" + (lengthR1 - lengthR2); - this.correctionLog.addTrimTrimR1TrimR2longR2(sample); - }else{ - //both reads have same length so ok - sequenceError = "TRIM\t" + "tR1tR2ok" + "\t" + read1.getDescription() + "\t" + read2.getDescription() + "\tor1:" + lengthR1 + "\tor2:" + lengthR2 + "\tread1:" + read1optimalSequence.length() + "\tread2:" + read2optimalSequence.length(); - this.correctionLog.addTrimTrimR1TrimR2ok(sample); - } - }else if (! trimedR1 && ! trimedR2){ - //perfect sequence, not trimmed - this.correctionLog.addTrimNotR1NotR2(sample); - } - - - //save results - FastqRead resultRead1 = new FastqRead(read1.getDescription(), read1optimalSequence, read1optimalQuality); - FastqRead resultRead2 = new FastqRead(read2.getDescription(), read2optimalSequence, read2optimalQuality); - return new ProcessedFragment(sample, resultRead1, resultRead2, sampleBarcodeCombination.getMismatches(), sequenceError); - } - /** * this method gets two reads from a pair-end fastq file. *
Read1 is from the first read, Read2 is from the reverse read @@ -833,7 +524,7 @@ private ProcessedFragment parseFastqRead(FastqRead read1, FastqRead read2) throw * @see FastqDemultiplex#findRead1EnzymeLocation(java.lang.String, be.uzleuven.gc.logistics.gbsDemultiplex.model.Sample) * @see ProcessedFragment */ - private ProcessedFragment parseFastqRead_new(FastqRead read1, FastqRead read2) throws InvalidReadException{ + private ProcessedFragment parseFastqRead(FastqRead read1, FastqRead read2) throws InvalidReadException{ //search for the optimal barcode SampleBarcodeCombination[] comb = this.findGBSBarcode2(read1.getSequence(), this.parameters.getStartDistance(), read2.getSequence()); if (comb == null){ @@ -867,11 +558,8 @@ private ProcessedFragment parseFastqRead_new(FastqRead read1, FastqRead read2) t //find the next enzyme site (if there is any) int read1EndLocation = -1; int[] read1EndLocationLength = {-1, 0}; -// EnzymeComparator enzymeComparator = new EnzymeComparator(); -// if (enzymeComparator.compare(sample.getEnzyme(), this.parameters.getNeutralEnzyme()) != 0){ - read1EndLocationLength = this.findRead1EnzymeLocation(read1modifiedSequence, sample); - read1EndLocation = read1EndLocationLength[0]; -// } + read1EndLocationLength = this.findRead1EnzymeLocation(read1modifiedSequence, sample); + read1EndLocation = read1EndLocationLength[0]; String read1optimalSequence = read1modifiedSequence; String read1optimalQuality = read1modifiedQuality; if (read1EndLocation != -1){ @@ -897,22 +585,6 @@ private ProcessedFragment parseFastqRead_new(FastqRead read1, FastqRead read2) t String read2modifiedQuality = read2.getQuality().substring(read2firstEnzymeLocation); if (this.parameters.isRadData()){ //RAD data -// if (this.findingDistanceAlgorithm.isEquivalent(read2modifiedSequence.substring(0, sample.getBarcode().length()), sample.getBarcode(), this.parameters.getAllowedMismatchesBarcode(sample))){ -// //possible barcode found -// read2modifiedSequence = read2modifiedSequence.substring(sample.getBarcode().length()); -// read2modifiedQuality = read2modifiedQuality.substring(sample.getBarcode().length()); -// if (! this.parameters.keepCutSites()){ -// //remove the enzyme site -// String foundEnzyme = ""; -// for (String enzymeSite : sample.getEnzyme().getInitialCutSiteRemnant()){ -// if (this.findingDistanceAlgorithm.isEquivalent(read2modifiedSequence.substring(0, enzymeSite.length()), enzymeSite, this.parameters.getAllowedMismatchesEnzyme())){ -// foundEnzyme = enzymeSite; -// } -// } -// read2modifiedSequence = read2modifiedSequence.substring(foundEnzyme.length()); -// read2modifiedQuality = read2modifiedQuality.substring(foundEnzyme.length()); -// } -// } }else{ //GBS data if (! this.parameters.keepCutSites()){ @@ -1198,34 +870,7 @@ private ProcessedFragment parseFastqRead(FastqRead read1) throws InvalidReadExce return new ProcessedFragment(sample, fastqRead, sampleBarcodeCombination.getMismatches()); } - - - /** - * search for a enzyme cutsite or complement in the given sequence (cutsite found in given sample) - *
returns -1 if no cutsite is found - *
returns a location (int) if a cutsite is found - * @param sequence String | the sequence where is searched in - * @param sample Sample | the sample from which compliment cutsites is used - * @return int | -1 if no cutsite is found, else the location of the cutsite - */ - private int findFirstEnzymeLocation(String sequence, Sample sample){ - //init location - int bestLocation = -1; - //try every cutsite of the known enzyme - for (String enzymeCutSite : sample.getEnzyme().getInitialCutSiteRemnant()){ - //try to find the location of the enzyme (-1 is returned if the barcode isn't found) - int location = sequence.indexOf(enzymeCutSite); - if (location != -1){ - //location found - if (bestLocation == -1 || location < bestLocation){ - //location is better then previous one - bestLocation = location; - } - } - } - return bestLocation; - } - + /** * Goes over the sequence and search the if the piece of the sequence is equivalent to a possible enzyme cutsite (possible enzyme mismatches) *
if the found piece is equivalent and the complete check option is false, the location is returned @@ -1475,8 +1120,10 @@ private SampleBarcodeCombination findGBSBarcode(String sequence, int startDistan //check on adaptor ligase if (this.parameters.getAdaptorLigaseMismatches() != -1){ String adaptor = this.parameters.getCommonAdaptor(); - if (this.findingDistanceAlgorithm.calculateEquivalentDistance(sequence.substring(distance + barcodeLocationLength[1] + cutsiteLocationLength[1]), adaptor, this.parameters.getAdaptorLigaseMismatches())[0] != -1){ - return null; + for (int l = cutsiteLocationLength[1]/2; l <= cutsiteLocationLength[1]; l++){ + if (this.findingDistanceAlgorithm.calculateEquivalentDistance(sequence.substring(distance + barcodeLocationLength[1] + l), adaptor, this.parameters.getAdaptorLigaseMismatches())[0] != -1){ + return null; + } } } foundSampleSet.add(new SampleBarcodeCombination(sample, enzymeCutSite, distance, barcodeLocationLength[0], barcodeLocationLength[1], cutsiteLocationLength[1])); @@ -1540,9 +1187,11 @@ private SampleBarcodeCombination[] findGBSBarcode2(String sequence, int startDis //check on adaptor ligase if (this.parameters.getAdaptorLigaseMismatches() != -1){ String adaptor = this.parameters.getCommonAdaptor(); - if (this.findingDistanceAlgorithm.calculateEquivalentDistance(sequence.substring(distance + barcodeLocationLength[1] + cutsiteLocationLength[1]), adaptor, this.parameters.getAdaptorLigaseMismatches())[0] != -1){ - return null; - //adaptor ligase + for (int l = cutsiteLocationLength[1]/2; l <= cutsiteLocationLength[1]; l++){ + if (this.findingDistanceAlgorithm.calculateEquivalentDistance(sequence.substring(distance + barcodeLocationLength[1] + cutsiteLocationLength[1]), adaptor, this.parameters.getAdaptorLigaseMismatches())[0] != -1){ + return null; + //adaptor ligase + } } } exactEnzymeCutSite = enzymeCutSite; @@ -1600,8 +1249,10 @@ private SampleBarcodeCombination[] findGBSBarcode2(String sequence, int startDis //check on adaptor ligase if (this.parameters.getAdaptorLigaseMismatches() != -1){ String adaptor = this.parameters.getCommonAdaptor(); - if (this.findingDistanceAlgorithm.calculateEquivalentDistance(sequence2.substring(distance + barcodeLocationLength[1] + cutsiteLocationLength[1]), adaptor, this.parameters.getAdaptorLigaseMismatches())[0] != -1){ - return null; + for (int l = cutsiteLocationLength[1]/2; l <= cutsiteLocationLength[1]; l++){ + if (this.findingDistanceAlgorithm.calculateEquivalentDistance(sequence2.substring(distance + barcodeLocationLength[1] + l), adaptor, this.parameters.getAdaptorLigaseMismatches())[0] != -1){ + return null; + } } } exactEnzymeCutSite = enzymeCutSite; @@ -1631,183 +1282,6 @@ private SampleBarcodeCombination[] findGBSBarcode2(String sequence, int startDis return null; } - /** - * a combination of a sample, a barcode and enzyme, the mismatches (between sequence and barcode/enzyme) and the start location of the barcode in the sequence - */ - private class SampleBarcodeCombination{ - - private Sample sample; - private String enzymeCutSite; - private int location; - private int mismatches; - private int lengthFoundBarcode; - private int lengthFoundEnzyme; - /** - * - * @param sample Sample | the sample of this combination - * @param enzymeCutSite String | the used enzyme cutsite - * @param location int | the start location of the barcodeEnzyme - * @param mismatches int | the amount of mismatches - * @param length int | the length of the combination of the sample and barcode - */ - public SampleBarcodeCombination(Sample sample, String enzymeCutSite, int location, int mismatches, int lengthFoundBarcode, int lengthFoundEnzyme){ - this.sample = sample; - this.enzymeCutSite = enzymeCutSite; - this.location = location; - this.mismatches = mismatches; - this.lengthFoundBarcode = lengthFoundBarcode; - this.lengthFoundEnzyme = lengthFoundEnzyme; - } - - /** - * - * @return Sample | the sample of this combination - */ - public Sample getSample(){ - return this.sample; - } - - /** - * - * @return String | the enzymeCutsite - */ - public String getEnzymeCutsite(){ - return this.enzymeCutSite; - } - - /** - * - * @return int | the location of the barcode + enzyme in a sequence - */ - public int getLocation(){ - return this.location; - } - - /** - * - * @return int | the amount of mismatches between the barcode + enzyme and the sequence - */ - public int getMismatches(){ - return this.mismatches; - } - - /** - * - * @return int | the length of the found enzyme - */ - public int getLengthFoundEnzyme(){ - return this.lengthFoundEnzyme; - } - - /** - * - * @return int | the lenght of the found barcode - */ - public int getLengthFoundBarcode(){ - return this.lengthFoundBarcode; - } - - } - - /** - * all information of the processed fragment: - *
the sample of the read, - *
read1 (as HashMap of FastqParts and String) - *
read2 (only pair-end) (as HashMap of FastqParts and String) - *
mismatch occured in finding the barcode/enzyme - */ - private class ProcessedFragment{ - - private Sample sample; - private FastqRead read1; - private FastqRead read2; - private int mismatch; - private String sequenceComment = ""; - - /** - * create a new ProcessedFragment (pair-end) - * @param sample Sample | the sample of the fragment - * @param read1 FastqRead | the first read of the fragment - * @param read2 FastqRead | the second read of the fragment (only pair-end) - * @param mismatch int | number of mismatches in the barcode/enzyme - * @param sequenceComment String | the comment on the cut of the sequence - */ - public ProcessedFragment(Sample sample, FastqRead read1, FastqRead read2, int mismatch, String sequenceComment){ - this.sample = sample; - this.read1 = read1; - this.read2 = read2; - this.mismatch = mismatch; - this.sequenceComment = sequenceComment; - } - - /** - * create a new ProcessedFragment (pair-end) - * @param sample Sample | the sample of the fragment - * @param read1 FastqRead | the first read of the fragment - * @param read2 FastqRead | the second read of the fragment (only pair-end) - * @param mismatch int | number of mismatches in the barcode/enzyme - */ - public ProcessedFragment(Sample sample, FastqRead read1, FastqRead read2, int mismatch){ - this.sample = sample; - this.read1 = read1; - this.read2 = read2; - this.mismatch = mismatch; - } - - /** - * create a new ProcessedFragment (single read) - * @param sample Sample | the sample of the fragment - * @param read1 FastqRead | the only read of the fragment - * @param mismatch int | number of mismatches in the barcode/enzyme - */ - public ProcessedFragment(Sample sample, FastqRead read1, int mismatch){ - this.sample = sample; - this.read1 = read1; - this.read2 = null; - this.mismatch = mismatch; - } - - /** - * - * @return Sample | the sample of this fragment - */ - public Sample getSample(){ - return this.sample; - } - - /** - * - * @return HashMap of FastqParts and String | the first read - */ - public FastqRead getRead1(){ - return this.read1; - } - - /** - * - * @return HashMap of FastqParts and String | the second read (only by pair-end) - */ - public FastqRead getRead2(){ - return this.read2; - } - - /** - * - * @return int | number of mismatches in barcode/enzyme - */ - public int getMismatch(){ - return this.mismatch; - } - - /** - * - * @return String | the comment on the cut of the reads - */ - public String getComment(){ - return this.sequenceComment; - } - - } } diff --git a/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/DemultiplexParameters.java b/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/DemultiplexParameters.java index 25f3558..5a81df2 100644 --- a/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/DemultiplexParameters.java +++ b/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/DemultiplexParameters.java @@ -563,11 +563,11 @@ public String getParametersHelp(){ toHelp += "\t -n \t keep sequences where N occurs as nucleotide (standard true)" + "\n"; toHelp += "\t -ca \t the common adaptor used in the sequencing (standard (only first piece) AGATCGGAAGAGCG) currently only used for adaptor ligase see -al and when -rad is true) (minimum length is 10)" + "\n"; toHelp += "\t -s \t the posible distance of the start. This is the distance count from the start of the read to the first basepair of the barcode or enzyme (standard 0, maximum 20)" + "\n"; - toHelp += "\t -cc \t Checks the complete read for the enzyme (if false, stops at the first possible enzyme cutsite) (use values true or false, standard is true) if used, the sequence after the enzyme site is compared to the adaptors, if the first basepairs of the sequence are compaired to the first basepairs of the adaptor" + "\n"; + //toHelp += "\t -cc \t Checks the complete read for the enzyme (if false, stops at the first possible enzyme cutsite) (use values true or false, standard is true) if used, the sequence after the enzyme site is compared to the adaptors, if the first basepairs of the sequence are compaired to the first basepairs of the adaptor" + "\n"; toHelp += "\t -kc \t Keep the enzyme cut-site remains (standard true)" + "\n"; toHelp += "\t -ea \t Add enzymes from the given file (keeps the standard enzymes, and add the new) (enzyme file: no header, enzyme name tab cutsites (multiple cutsites are comma separeted)) (only use once, not use -er)" + "\n"; toHelp += "\t -er \t Replace enzymes from the given file (don't keep the standard enzymes) (enzyme file: no header, enzyme name tab cutsites (multiple cutsites are comma separeted)) (only use once, not use -ea)" + "\n"; - toHelp += "\t -al \t check for adaptor ligase: no (for no check) or a positive integer (starts at 0), for the number of mismatches (only checks 10 basepairs of the adaptor), standard 1" + "\n"; + //toHelp += "\t -al \t check for adaptor ligase: no (for no check) or a positive integer (starts at 0), for the number of mismatches (only checks 10 basepairs of the adaptor), standard 1" + "\n"; toHelp += "\t -scb \t Use self correcting barcodes (barcodes created by the barcodeGenerator) (standard false)" + "\n"; toHelp += "\t -malg \t the used algorithm to find mismatches and indels, possible algorithms (see README): " + "\n"; for (FindingsAlgorithms algorithm : FindingsAlgorithms.values()){ diff --git a/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/ProcessedFragment.java b/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/ProcessedFragment.java new file mode 100644 index 0000000..7d470ba --- /dev/null +++ b/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/ProcessedFragment.java @@ -0,0 +1,114 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package be.uzleuven.gc.logistics.GBSX.demultiplexer.model; + +import be.uzleuven.gc.logistics.GBSX.utils.fastq.model.FastqRead; +import be.uzleuven.gc.logistics.GBSX.utils.sampleBarcodeEnzyme.model.Sample; + +/** + * + * @author koen + */ +public class ProcessedFragment { + + /** + * all information of the processed fragment: + *
the sample of the read, + *
read1 (as HashMap of FastqParts and String) + *
read2 (only pair-end) (as HashMap of FastqParts and String) + *
mismatch occured in finding the barcode/enzyme + */ + + private Sample sample; + private FastqRead read1; + private FastqRead read2; + private int mismatch; + private String sequenceComment = ""; + + /** + * create a new ProcessedFragment (pair-end) + * @param sample Sample | the sample of the fragment + * @param read1 FastqRead | the first read of the fragment + * @param read2 FastqRead | the second read of the fragment (only pair-end) + * @param mismatch int | number of mismatches in the barcode/enzyme + * @param sequenceComment String | the comment on the cut of the sequence + */ + public ProcessedFragment(Sample sample, FastqRead read1, FastqRead read2, int mismatch, String sequenceComment){ + this.sample = sample; + this.read1 = read1; + this.read2 = read2; + this.mismatch = mismatch; + this.sequenceComment = sequenceComment; + } + + /** + * create a new ProcessedFragment (pair-end) + * @param sample Sample | the sample of the fragment + * @param read1 FastqRead | the first read of the fragment + * @param read2 FastqRead | the second read of the fragment (only pair-end) + * @param mismatch int | number of mismatches in the barcode/enzyme + */ + public ProcessedFragment(Sample sample, FastqRead read1, FastqRead read2, int mismatch){ + this.sample = sample; + this.read1 = read1; + this.read2 = read2; + this.mismatch = mismatch; + } + + /** + * create a new ProcessedFragment (single read) + * @param sample Sample | the sample of the fragment + * @param read1 FastqRead | the only read of the fragment + * @param mismatch int | number of mismatches in the barcode/enzyme + */ + public ProcessedFragment(Sample sample, FastqRead read1, int mismatch){ + this.sample = sample; + this.read1 = read1; + this.read2 = null; + this.mismatch = mismatch; + } + + /** + * + * @return Sample | the sample of this fragment + */ + public Sample getSample(){ + return this.sample; + } + + /** + * + * @return HashMap of FastqParts and String | the first read + */ + public FastqRead getRead1(){ + return this.read1; + } + + /** + * + * @return HashMap of FastqParts and String | the second read (only by pair-end) + */ + public FastqRead getRead2(){ + return this.read2; + } + + /** + * + * @return int | number of mismatches in barcode/enzyme + */ + public int getMismatch(){ + return this.mismatch; + } + + /** + * + * @return String | the comment on the cut of the reads + */ + public String getComment(){ + return this.sequenceComment; + } + +} \ No newline at end of file diff --git a/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/SampleBarcodeCombination.java b/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/SampleBarcodeCombination.java new file mode 100644 index 0000000..a5cb171 --- /dev/null +++ b/src/be/uzleuven/gc/logistics/GBSX/demultiplexer/model/SampleBarcodeCombination.java @@ -0,0 +1,91 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package be.uzleuven.gc.logistics.GBSX.demultiplexer.model; + +import be.uzleuven.gc.logistics.GBSX.utils.sampleBarcodeEnzyme.model.Sample; +/** + * + * @author koen + */ +public class SampleBarcodeCombination { + + /** + * a combination of a sample, a barcode and enzyme, the mismatches (between sequence and barcode/enzyme) and the start location of the barcode in the sequence + */ + + private final Sample sample; + private final String enzymeCutSite; + private final int location; + private final int mismatches; + private final int lengthFoundBarcode; + private final int lengthFoundEnzyme; + /** + * + * @param sample Sample | the sample of this combination + * @param enzymeCutSite String | the used enzyme cutsite + * @param location int | the start location of the barcodeEnzyme + * @param mismatches int | the amount of mismatches + * @param lengthFoundBarcode int | length of the found barcode + * @param lengthFoundEnzyme int | length of the found enzyme + */ + public SampleBarcodeCombination(Sample sample, String enzymeCutSite, int location, int mismatches, int lengthFoundBarcode, int lengthFoundEnzyme){ + this.sample = sample; + this.enzymeCutSite = enzymeCutSite; + this.location = location; + this.mismatches = mismatches; + this.lengthFoundBarcode = lengthFoundBarcode; + this.lengthFoundEnzyme = lengthFoundEnzyme; + } + + /** + * + * @return Sample | the sample of this combination + */ + public Sample getSample(){ + return this.sample; + } + + /** + * + * @return String | the enzymeCutsite + */ + public String getEnzymeCutsite(){ + return this.enzymeCutSite; + } + + /** + * + * @return int | the location of the barcode + enzyme in a sequence + */ + public int getLocation(){ + return this.location; + } + + /** + * + * @return int | the amount of mismatches between the barcode + enzyme and the sequence + */ + public int getMismatches(){ + return this.mismatches; + } + + /** + * + * @return int | the length of the found enzyme + */ + public int getLengthFoundEnzyme(){ + return this.lengthFoundEnzyme; + } + + /** + * + * @return int | the lenght of the found barcode + */ + public int getLengthFoundBarcode(){ + return this.lengthFoundBarcode; + } + +}