annotate bam2cfg.pl @ 33:0d03f1e09b95 draft

Uploaded
author jeremie
date Fri, 27 Jun 2014 05:55:06 -0400
parents 8dd3f7144428
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
1 #!/opt/local/bin/perl
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
2 #Create a BreakDancer configuration file from a set of bam files
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
3
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
4 use strict;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
5 use warnings;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
6 use Getopt::Std;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
7 use Statistics::Descriptive;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
8 use GD::Graph::histogram;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
9 use FindBin qw($Bin);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
10 use lib "$FindBin::Bin";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
11 #use lib '/gscuser/kchen/1000genomes/analysis/scripts/';
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
12 use AlnParser;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
13
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
14 my %opts = (q=>35, n=>10000, v=>1, c=>4, b=>50, s=>50);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
15 getopts('q:n:c:b:p:hmf:gCv:', \%opts);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
16 die("
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
17 Usage: bam2cfg.pl <bam files>
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
18 Options:
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
19 -q INT Minimum mapping quality [$opts{q}]
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
20 -m Using mapping quality instead of alternative mapping quality
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
21 -s Minimal mean insert size [$opts{s}]
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
22 -C Change default system from Illumina to SOLiD
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
23 -c FLOAT Cutoff in unit of standard deviation [$opts{c}]
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
24 -n INT Number of observation required to estimate mean and s.d. insert size [$opts{n}]
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
25 -v FLOAT Cutoff on coefficients of variation [$opts{v}]
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
26 -f STRING A two column tab-delimited text file (RG, LIB) specify the RG=>LIB mapping, useful when BAM header is incomplete
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
27 -b INT Number of bins in the histogram [$opts{b}]
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
28 -g Output mapping flag distribution
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
29 -h Plot insert size histogram for each BAM library
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
30 \n
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
31 ") unless (@ARGV);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
32
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
33 my $AP=new AlnParser(platform=>$opts{C});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
34
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
35 my %cRGlib; my %clibs;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
36 if($opts{f}){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
37 open(RGLIB,"<$opts{f}") || die "unable to open $opts{f}\n";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
38 while(<RGLIB>){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
39 chomp;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
40 my ($rg,$lib)=split;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
41 $clibs{$lib}=1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
42 $cRGlib{$rg}=$lib;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
43 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
44 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
45
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
46 foreach my $fbam(@ARGV){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
47 my %RGlib;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
48 my %RGplatform;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
49 my %libs;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
50 my %insert_stat;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
51 my %readlen_stat;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
52 my %libpos;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
53 my %flagHgram;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
54 my $recordcounter=0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
55 my $expected_max;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
56 if(defined $opts{f}){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
57 %RGlib=%cRGlib;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
58 %libs=%clibs;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
59 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
60 my $ppos=0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
61 open(BAM,"samtools view -h $fbam |") || die "unable to open $fbam\n";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
62 while(<BAM>){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
63 chomp;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
64 if(/^\@RG/){ #getting RG=>LIB mapping from the bam header
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
65 my ($id)=($_=~/ID\:(\S+)/);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
66 my ($lib)=($_=~/LB\:(\S+)/);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
67 my ($platform)=($_=~/PL\:(\S+)/);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
68 my ($sample)=($_=~/SM\:(\S+)/);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
69 my ($insertsize)=($_=~/PI\:(\d+)/);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
70 #if(defined $insertsize && $insertsize>0){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
71 #$lib=$sample . '_'. $lib;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
72 $libs{$lib}=1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
73 $RGlib{$id}=$lib;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
74 $RGplatform{$id}=$platform;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
75 #}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
76 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
77 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
78 next if(/^\@/);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
79 my @libas=keys %libs;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
80 my @selected_libs=keys %insert_stat;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
81 if($#libas<0){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
82 if($#selected_libs>=0){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
83 last;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
84 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
85 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
86 $libs{'NA'}=1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
87 $RGlib{'NA'}='NA';
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
88 $RGplatform{'NA'}=($opts{C})?'solid':'illumina';
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
89 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
90 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
91 if(!defined $expected_max || $expected_max<=0){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
92 $expected_max=3*($#libas+1)*$opts{n};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
93 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
94 last if($recordcounter>$expected_max);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
95
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
96 my $t=$AP->in($_,'sam',\%RGplatform,$opts{m});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
97 #die "Please sort bam by position\n" if($t->{pos}<$ppos);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
98 next if($t->{pos}<$ppos);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
99 $ppos=$t->{pos};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
100 my $lib;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
101 if(defined $t->{readgroup}){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
102 if(defined $RGlib{$t->{readgroup}}){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
103 $lib=$RGlib{$t->{readgroup}};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
104 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
105 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
106 $lib=$t->{readgroup};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
107 $libs{$t->{readgroup}}=1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
108 $RGlib{$t->{readgroup}}=$t->{readgroup};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
109 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
110 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
111 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
112 $lib='NA';
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
113 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
114 #my $lib=($t->{readgroup})?$RGlib{$t->{readgroup}}:'NA'; #when multiple libraries are in a BAM file
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
115 next unless(defined $lib && $libs{$lib});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
116 $readlen_stat{$lib}=Statistics::Descriptive::Full->new() if(!defined $readlen_stat{$lib});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
117 $readlen_stat{$lib}->add_data($t->{readlen});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
118 next if ($t->{qual}<=$opts{q}); #skip low quality mapped reads
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
119 $recordcounter++;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
120 $libpos{$lib}++;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
121 if(defined $t->{readgroup}){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
122 $flagHgram{$t->{readgroup}}{$t->{flag}}++;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
123 $flagHgram{$t->{readgroup}}{all}++;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
124 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
125
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
126 my $nreads=(defined $insert_stat{$lib})?$insert_stat{$lib}->count():1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
127 if($nreads/$libpos{$lib}<1e-4){ #single-end lane
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
128 delete $libs{$lib};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
129 delete $insert_stat{$lib};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
130 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
131 next unless(($t->{flag}==18 || $t->{flag}==20) && $t->{dist}>=0);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
132
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
133 $insert_stat{$lib}=Statistics::Descriptive::Full->new() if(!defined $insert_stat{$lib});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
134 $insert_stat{$lib}->add_data($t->{dist});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
135 if($insert_stat{$lib}->count()>$opts{n}){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
136 delete $libs{$lib};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
137 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
138 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
139 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
140 close(BAM);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
141
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
142 my %stdms;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
143 my %stdps;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
144
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
145 foreach my $lib(keys %insert_stat){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
146 my $readlen=$readlen_stat{$lib}->mean();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
147 my @isize=$insert_stat{$lib}->get_data();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
148 my $mean=$insert_stat{$lib}->mean();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
149 my $std=$insert_stat{$lib}->standard_deviation();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
150
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
151 delete $insert_stat{$lib};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
152 my $insertsize=Statistics::Descriptive::Full->new();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
153 foreach my $x(@isize){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
154 next if($x>$mean+5*$std);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
155 $insertsize->add_data($x);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
156 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
157
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
158 $mean=$insertsize->mean();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
159 $std=$insertsize->standard_deviation();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
160 next if($mean<$opts{s});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
161 my $cv=$std/$mean;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
162 if($cv>=$opts{v}){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
163 print STDERR "Coefficient of variation $cv in library $lib is larger than the cutoff $opts{v}, poor quality data, excluding from further analysis.\n";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
164 next;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
165 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
166
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
167 my $num=$insertsize->count();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
168 next if($num<100);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
169
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
170 my ($stdm,$stdp)=(0,0);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
171 my ($nstdm,$nstdp)=(0,0);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
172 foreach my $x($insertsize->get_data()){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
173 if($x>$mean){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
174 $stdp+=($x-$mean)**2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
175 $nstdp++;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
176 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
177 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
178 $stdm+=($x-$mean)**2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
179 $nstdm++;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
180 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
181 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
182 $stdm=sqrt($stdm/($nstdm-1));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
183 $stdp=sqrt($stdp/($nstdp-1));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
184
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
185 $stdms{$lib}=$stdm;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
186 $stdps{$lib}=$stdp;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
187 $insert_stat{$lib}=$insertsize;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
188 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
189
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
190 foreach my $rg(keys %RGlib){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
191 my $lib=$RGlib{$rg};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
192 my $platform=$RGplatform{$rg} || 'illumina'; #default illumina
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
193 next unless($insert_stat{$lib});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
194 my $readlen=$readlen_stat{$lib}->mean();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
195 my $mean=$insert_stat{$lib}->mean();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
196 my $std=$insert_stat{$lib}->standard_deviation();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
197 my $num=$insert_stat{$lib}->count();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
198
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
199 my $upper=$mean+$opts{c}*$stdps{$lib} if(defined $opts{c});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
200 my $lower=$mean-$opts{c}*$stdms{$lib} if(defined $opts{c});
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
201 $lower=0 if(defined $lower && $lower<0);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
202
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
203 printf "readgroup\:%s\tplatform:%s\tmap\:%s\treadlen\:%.2f\tlib\:%s\tnum:%d",$rg,$platform,$fbam,$readlen,$lib,$num;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
204 printf "\tlower\:%.2f\tupper\:%.2f",$lower,$upper if(defined $upper && defined $lower);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
205 printf "\tmean\:%.2f\tstd\:%.2f",$mean,$std;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
206
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
207
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
208 # compute the normality
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
209 my @data=$insert_stat{$lib}->get_data();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
210 my $n_data = @data;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
211 @data = sort {$a <=> $b} @data;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
212 my $n_data_ = @data;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
213 my $p_value = ShapiroWilk(\@data);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
214 if($p_value>0) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
215 my $log_p_value = log($p_value)/log(10);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
216 printf "\tSWnormality\:%.2f",$log_p_value;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
217 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
218 elsif($p_value == -1) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
219 printf "\tSWnormality\:data not qualified -1";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
220 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
221 elsif($p_value == -2.1){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
222 printf "\tSWnormality\:data not qualified -2.1";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
223 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
224 elsif($p_value == -2.2){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
225 printf "\tSWnormality\:data not qualified -2.2";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
226 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
227 elsif($p_value == -2.3){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
228 printf "\tSWnormality\:data not qualified -2.3";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
229 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
230 elsif($p_value == 0) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
231 printf "\tSWnormality\:minus infinity";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
232 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
233
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
234
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
235
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
236 if($opts{g}){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
237 printf "\tflag:";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
238 foreach my $f(sort keys %{$flagHgram{$rg}}){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
239 next if($f eq 'all');
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
240 printf "%d(%.2f%%)",$f,($flagHgram{$rg}{$f} || 0)*100/$flagHgram{$rg}{all};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
241 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
242 printf "%d",$flagHgram{$rg}{all};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
243 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
244 printf "\texe:samtools view\n";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
245 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
246
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
247 if($opts{h}){ # plot insert size histogram for each library
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
248 foreach my $lib(keys %insert_stat){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
249 my $graph = new GD::Graph::histogram(1000,600);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
250 my $library="$fbam.$lib";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
251 $graph->set(
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
252 x_label => 'Insert Size (bp)',
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
253 y_label => 'Count',
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
254 title => $library,
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
255 x_labels_vertical => 1,
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
256 bar_spacing => 0,
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
257 shadow_depth => 1,
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
258 shadowclr => 'dred',
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
259 transparent => 0,
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
260 histogram_bins => $opts{b},
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
261 ) or warn $graph->error;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
262 my @data=$insert_stat{$lib}->get_data();
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
263 my $gd = $graph->plot(\@data) or die $graph->error;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
264
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
265 $library=~s/.*\///g;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
266 my $imagefile="$library.insertsize_histogram.png";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
267 open(IMG, ">$imagefile") or die $!;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
268 binmode IMG;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
269 print IMG $gd->png;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
270
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
271 my $datafile="$library.insertsize_histogram";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
272 open(OUT,">$datafile");
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
273 foreach my $x(@data){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
274 print OUT "$x\n";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
275 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
276 close(OUT);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
277 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
278 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
279 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
280
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
281 ###################################################### Shapiro Wilk Normality test (including functions ppnd, alnorm, poly, min, sign and asin) #########################################################
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
282 sub ShapiroWilk {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
283
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
284 # read input
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
285 my ($x) = @_;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
286
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
287 my $n=@$x;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
288 my $w = 0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
289 my $ifault = 2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
290 my $init = 0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
291 my $n2 = $n/2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
292 my @a;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
293 my $n1 = $n;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
294
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
295 my $upper = 1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
296 my @c1 = (0.0, 0.221157, -0.147981, -2.07119, 4.434685, -2.706056);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
297 my @c2 = (0.0, 0.042981, -0.293762, -1.752461, 5.682633, -3.582633);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
298 my @c3 = (0.5440, -0.39978, 0.025054, -0.6714*(10**(-3)));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
299 my @c4 = (1.3822, -0.77857, 0.062767, -0.0020322);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
300 my @c5 = (-1.5861, -0.31082, -0.083751, 0.0038915);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
301 my @c6 = (-0.4803, -0.082676, 0.0030302);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
302 my @c7 = (0.164, 0.533);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
303 my @c8 = (0.1736, 0.315);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
304 my @c9 = (0.256, -0.00635);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
305 my @g = (-2.273, 0.459);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
306 my $z90 = 1.2816;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
307 my $z95 = 1.6449;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
308 my $z99 = 2.3263;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
309 my $zm = 1.7509;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
310 my $zss = 0.56268;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
311 my $bf1 = 0.8378;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
312 my $xx90 = 0.556;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
313 my $xx95 = 0.622;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
314 my $zero = 0.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
315 my $one = 1.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
316 my $two = 2.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
317 my $three = 3.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
318 my $sqrth = 0.70711;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
319 my $qtr = 0.25;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
320 my $th = 0.375;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
321 my $small = 1*(10**(-19));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
322 my $pi6 = 1.909859;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
323 my $stqr = 1.047198;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
324
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
325 my $summ2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
326 my $ssumm2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
327 my $fac;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
328 my $rsn;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
329 my $an;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
330 my $an25;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
331 my $a1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
332 my $a2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
333 my $delta;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
334 my $range;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
335 my $sa;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
336 my $sx;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
337 my $ssx;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
338 my $ssa;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
339 my $sax;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
340 my $asa;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
341 my $xsx;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
342 my $ssassx;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
343 my $w1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
344 my $y;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
345 my $xx;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
346 my $xi;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
347 my $gamma;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
348 my $m;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
349 my $s;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
350 my $ld;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
351 my $bf;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
352 my $z90f;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
353 my $z95f;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
354 my $z99f;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
355 my $zfm;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
356 my $zsd;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
357 my $zbar;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
358 my $ncens;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
359 my $nn2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
360 my $i;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
361 my $i1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
362 my $j;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
363
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
364 my $pw = $one;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
365 if($w >= $zero) {$w = $one;}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
366 $an = $n;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
367 $ifault = 3;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
368 $nn2 = $n/2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
369 if($n2 < $nn2) {return (-1);}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
370 $ifault = 1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
371 if($n < 3) {return (-1);}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
372
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
373 # If INIT is false, calculates coefficients for the test
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
374
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
375 if(!$init){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
376 if($n == 3) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
377 $a[1-1] = $sqrth;}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
378 else {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
379 $an25 = $an + $qtr;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
380 $summ2 = $zero;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
381 for(my $i = 1; $i <= $n2; $i++){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
382 ($a[$i-1], $ifault) = ppnd(($i - $th)/$an25);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
383 my $a_val = $a[$i-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
384 $summ2 = $summ2 + $a[$i-1] ** 2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
385 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
386 $summ2 = $summ2 * $two;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
387 $ssumm2 = $summ2 ** 0.5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
388 $rsn = $one / ($an ** 0.5);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
389 my $poly_result = poly_(\@c1, 6, $rsn);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
390 $a1 = $poly_result - $a[1-1] / $ssumm2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
391
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
392 # Normalize coefficients
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
393
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
394 if($n > 5) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
395 $i1 = 3;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
396 $a2 = -$a[2-1]/$ssumm2 + poly_(\@c2, 6, $rsn);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
397 my $a_val1_new = $a[1-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
398 my $a_val2_new = $a[2-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
399 my $temp1 = $summ2 - $two * $a[1-1] ** 2 - $two * $a[2-1] ** 2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
400 my $temp2 = $one - $two * $a1 ** 2 - $two * $a2 ** 2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
401 $fac = (($summ2 - $two * $a[1-1] ** 2 - $two * $a[2-1] ** 2)/($one - $two * $a1 ** 2 - $two * $a2 ** 2)) ** 0.5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
402 $a[1-1] = $a1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
403 $a[2-1] = $a2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
404 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
405 else {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
406 $i1 = 2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
407 $fac = (($summ2 - $two * $a[1-1] ** 2)/ ($one - $two * $a1 ** 2)) ** 0.5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
408 $a[1-1] = $a1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
409 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
410 for($i = $i1; $i <= $nn2; $i++){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
411 $a[$i-1] = -$a[$i-1]/$fac;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
412 my $a_val = $a[$i-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
413 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
414 for($i = 1; $i <= $nn2; $i++){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
415 my $a_value = $a[$i-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
416 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
417 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
418 $init = 1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
419 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
420 if($n1 < 3) {return (-1);}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
421 $ncens = $n - $n1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
422 $ifault = 4;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
423 if($ncens < 0 || ($ncens > 0 && $n < 20)) {return (-1);}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
424 $ifault = 5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
425 $delta = $ncens/$an;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
426 if($delta > 0.8) {return (-2.1);}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
427
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
428 # If W input as negative, calculate significance level of -W
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
429
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
430 if($w < $zero) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
431 $w1 = $one + $w;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
432 $ifault = 0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
433 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
434 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
435 # Check for zero range
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
436 $ifault = 6;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
437 $range = @$x[$n1-1] - @$x[1-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
438 if($range < $small) {return (-2.2);}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
439
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
440 # Check for correct sort order on range - scaled X
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
441
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
442 $ifault = 7;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
443 $xx = @$x[1-1]/$range;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
444 $sx = $xx;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
445 $sa = -$a[1-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
446 $j = $n - 1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
447 for($i = 2; $i <= $n1; $i++){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
448 $xi = @$x[$i-1]/$range;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
449 if($xx-$xi > $small){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
450 return (-2.3);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
451 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
452 $sx = $sx + $xi;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
453 if($i != $j) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
454 my $sign_value = sign($i - $j);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
455 my $min_value = $a[min($i, $j)-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
456 my $min_ = min($i, $j);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
457 $sa = $sa + sign($i - $j) * $a[min($i, $j)-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
458 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
459 $xx = $xi;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
460 $j = $j - 1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
461 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
462 $ifault = 0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
463 if($n > 5000) {$ifault = 2};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
464
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
465 # Calculate W statistic as squared correlation between data and coefficients
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
466 $sa = $sa/$n1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
467 $sx = $sx/$n1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
468 $ssa = $zero;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
469 $ssx = $zero;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
470 $sax = $zero;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
471 $j = $n;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
472 for($i = 1; $i <= $n1; $i ++){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
473 if($i != $j) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
474 my $sign_result = sign($i - $j);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
475 my $min_result = min($i, $j);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
476 $asa = sign($i - $j) * $a[min($i, $j)-1] - $sa;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
477 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
478 else {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
479 $asa = -$sa;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
480 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
481 $xsx = @$x[$i-1]/$range - $sx;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
482 $ssa = $ssa + $asa * $asa;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
483 $ssx = $ssx + $xsx * $xsx;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
484 $sax = $sax + $asa * $xsx;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
485 $j = $j - 1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
486 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
487
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
488 # W1 equals (1-W) claculated to avoid excessive rounding error for W very near 1 (a potential problem in very large samples)
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
489 $ssassx = ($ssa * $ssx) ** 0.5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
490 $w1 = ($ssassx - $sax) * ($ssassx + $sax)/($ssa * $ssx);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
491 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
492
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
493 $w = $one - $w1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
494
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
495 # Calculate significance level for W (exact for N=3)
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
496
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
497 if($n == 3){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
498 $pw = $pi6 * (asin($w**0.5) - $stqr);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
499 return ($pw);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
500 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
501 $y = log($w1);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
502 $xx = log($an);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
503 $m = $zero;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
504 $s = $one;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
505 if($n <= 11){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
506 $gamma = poly_(\@g, 2, $an);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
507 if($y >= $gamma){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
508 $pw = $small;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
509 return ($pw);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
510 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
511 $y = -log($gamma - $y);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
512 $m = poly_(\@c3, 4, $an);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
513 $s = exp(poly_(\@c4, 4, $an))
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
514 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
515 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
516 $m = poly_(\@c5, 4, $xx);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
517 $s = exp(poly_(\@c6, 3, $xx));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
518 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
519 if($ncens > 0){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
520
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
521 # Censoring by proportion NCENS/N. Calculate mean and sd of normal equivalent deviate of W.
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
522
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
523 $ld = -log($delta);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
524 $bf = $one + $xx * $bf1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
525 $z90f = $z90 + $bf * poly_(\@c7, 2, $xx90 ** $xx) ** $ld;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
526 $z95f = $z95 + $bf * poly_(\@c8, 2, $xx95 ** $xx) ** $ld;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
527 $z99f = $z99 + $bf * poly_(\@c9, 2, $xx) ** $ld;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
528
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
529 # Regress Z90F,...,Z99F on normal deviates Z90,...,Z99 to get pseudo-mean and pseudo-sd of z as the slope and intercept
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
530
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
531 $zfm = ($z90f + $z95f + $z99f)/$three;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
532 $zsd = ($z90*($z90f-$zfm)+$z95*($z95f-$zfm)+$z99*($z99f-$zfm))/$zss;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
533 $zbar = $zfm - $zsd * $zm;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
534 $m = $m + $zbar * $s;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
535 $s = $s * $zsd;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
536 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
537 $pw = alnorm(($y - $m)/$s, $upper);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
538 return ($pw);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
539
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
540 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
541
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
542 ############################################### ppnd function############################################################
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
543 sub ppnd {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
544
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
545 # read input
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
546 my ($p) = @_;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
547
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
548 # define output
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
549 my $ifault;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
550 my $normal_dev;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
551
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
552 # Local variables
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
553
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
554 my $zero = 0.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
555 my $one = 1.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
556 my $half = 0.5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
557 my $split1 = 0.425;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
558 my $split2 = 5.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
559 my $const1 = 0.180625;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
560 my $const2 = 1.6;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
561 my $q;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
562 my $r;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
563
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
564 # Coefficients for P close to 0.5
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
565
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
566 my $a0 = 3.3871327179;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
567 my $a1 = 5.0434271938*10;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
568 my $a2 = 1.5929113202*10**2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
569 my $a3 = 5.9109374720*10;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
570 my $b1 = 1.7895169469*10;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
571 my $b2 = 7.8757757664*10;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
572 my $b3 = 6.7187563600*10;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
573 # HASH SUM AB 32.3184577772
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
574
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
575 # Coefficients for P not close to 0, 0.5 or 1.
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
576
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
577 my $c0 = 1.4234372777;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
578 my $c1 = 2.7568153900;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
579 my $c2 = 1.3067284816;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
580 my $c3 = 1.7023821103*(10**(-1));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
581 my $d1 = 7.3700164250*(10**(-1));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
582 my $d2 = 1.2021132975*(10**(-1));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
583 # HASH SUM CD 15.7614929821
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
584
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
585 # Coefficients for P near 0 or 1.
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
586
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
587 my $e0 = 6.6579051150;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
588 my $e1 = 3.0812263860;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
589 my $e2 = 4.2868294337*(10**(-1));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
590 my $e3 = 1.7337203997*(10**(-2));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
591 my $f1 = 2.4197894225*(10**(-1));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
592 my $f2 = 1.2258202635*(10**(-2));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
593 # HASH SUM EF 19.4052910204
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
594
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
595 $ifault = 0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
596 $q = $p - $half;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
597 if(abs($q) <= $split1) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
598 $r = $const1 - $q * $q;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
599 $normal_dev = $q * ((($a3 * $r + $a2) * $r + $a1) * $r + $a0) / ((($b3 * $r + $b2) * $r + $b1) * $r + $one);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
600 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
601 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
602 if($q < $zero) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
603 $r = $p;}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
604 else {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
605 $r = $one - $p;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
606 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
607 if($r <= $zero) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
608 $ifault = 1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
609 $normal_dev = $zero;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
610 return ($normal_dev, $ifault);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
611 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
612 $r = (-log($r))**0.5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
613 if($r <= $split2) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
614 $r = $r - $const2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
615 $normal_dev = ((($c3 * $r + $c2) * $r + $c1) * $r + $c0) / (($d2 * $r + $d1) * $r + $one);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
616 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
617 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
618 $r = $r - $split2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
619 $normal_dev = ((($e3 * $r + $e2) * $r + $e1) * $r + $e0) / (($f2 * $r + $f1) * $r + $one);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
620 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
621 if($q < $zero) {$normal_dev = - $normal_dev;}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
622 return ($normal_dev, $ifault);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
623 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
624 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
625
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
626
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
627 ################################ alnorm function #####################################################################
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
628 #FUNCTION alnorm(x, upper) RESULT(fn_val)
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
629
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
630 # Evaluates the tail area of the standardised normal curve from x to infinity if upper is .true. or
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
631 # from minus infinity to x if upper is .false.
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
632
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
633 sub alnorm {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
634
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
635 # get the inputs
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
636 my ($x, $upper) = @_;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
637
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
638 # define the output
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
639 my $fn_val;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
640
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
641 my $zero = 0.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
642 my $one = 1.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
643 my $half = 0.5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
644 my $con = 1.28;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
645 my $z;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
646 my $y;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
647 my $up;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
648
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
649 #!*** machine dependent constants
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
650 my $ltone = 7.0;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
651 my $utzero = 18.66;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
652
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
653 my $p = 0.398942280444;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
654 my $q = 0.39990348504;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
655 my $r = 0.398942280385;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
656 my $a1 = 5.75885480458;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
657 my $a2 = 2.62433121679;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
658 my $a3 = 5.92885724438;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
659 my $b1 = -29.8213557807;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
660 my $b2 = 48.6959930692;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
661 my $c1 = -3.8052*(10**(-8));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
662 my $c2 = 3.98064794*(10**(-4));
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
663 my $c3 = -0.151679116635;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
664 my $c4 = 4.8385912808;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
665 my $c5 = 0.742380924027;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
666 my $c6 = 3.99019417011;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
667 my $d1 = 1.00000615302;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
668 my $d2 = 1.98615381364;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
669 my $d3 = 5.29330324926;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
670 my $d4 = -15.1508972451;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
671 my $d5 = 30.789933034;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
672
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
673 $up = $upper;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
674 $z = $x;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
675 if($z < $zero){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
676 if($up == 0){$up = 1;}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
677 else {$up = 0;}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
678 $z = -$z;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
679 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
680 if($z <= $ltone || $up && $z <= $utzero){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
681 $y = $half*$z*$z;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
682 if($z > $con) {$fn_val = $r*exp(-$y)/($z+$c1+$d1/($z+$c2+$d2/($z+$c3+$d3/($z+$c4+$d4/($z+$c5+$d5/($z+$c6))))));}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
683 else {$fn_val = $half - $z*($p - $q*$y/($y+$a1+$b1/($y+$a2+$b2/($y+$a3))));}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
684 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
685 else{
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
686 $fn_val = $zero;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
687 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
688 if(!$up) {$fn_val = $one - $fn_val};
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
689 return $fn_val;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
690 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
691
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
692 ##################################### poly function #########################################################
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
693
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
694 # FUNCTION poly(c, nord, x) RESULT(fn_val)
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
695
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
696 # Calculates the algebraic polynomial of order nored-1 with array of coefficients c. Zero order coefficient is c(1)
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
697
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
698 sub poly_ {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
699
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
700 my ($c, $nord, $x) = @_;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
701
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
702 my $fn_val;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
703
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
704 my $i;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
705 my $j;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
706 my $n2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
707 my $p;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
708
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
709 $fn_val = @$c[1-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
710 if($nord == 1) {return $fn_val;}
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
711 $p = $x*@$c[$nord-1];
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
712 if($nord == 2) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
713 $fn_val = $fn_val + $p;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
714 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
715 else {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
716 $n2 = $nord - 2;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
717 $j = $n2 + 1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
718 for($i = 1; $i <= $n2; $i++){
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
719 $p = ($p + @$c[$j-1])*$x;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
720 $j = $j - 1;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
721 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
722 $fn_val = $fn_val + $p;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
723 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
724
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
725 return $fn_val;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
726 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
727
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
728 ###################################### min function ############################################
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
729
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
730 # FUNCTION min(a,b) RESULT min of a, b
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
731
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
732 sub min {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
733
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
734 my ($a, $b) = @_;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
735
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
736 if($a <= $b) { return $a; }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
737 else { return $b; }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
738 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
739
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
740 ###################################### sign function ############################################
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
741
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
742 # FUNCTION sign(a,b) RESULT sign of a, b
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
743
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
744 sub sign {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
745
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
746 my ($a) = @_;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
747
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
748 if($a >= 0) { return 1; }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
749 else { return -1; }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
750 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
751
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
752 ###################################### asin function ############################################
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
753
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
754 # FUNCTION asin(a) RESULT arcsin of a
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
755
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
756 sub asin {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
757
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
758 my ($a) = @_;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
759 if($a > 1 || $a < -1) {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
760 print "error: abs sin value > 1";
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
761 return 0; }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
762 else {
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
763 my $b = (1-$a**2)**0.5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
764 my $fn_val = atan2($a, (1-$a**2)**0.5);
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
765 my $fn_test = (1-$a**2)**0.5;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
766 return $fn_val;
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
767 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
768 }
8dd3f7144428 Uploaded
jeremie
parents:
diff changeset
769