6 #use Data::Dump qw(ddx);
12 =head1 AUTHOR && CONTACT
13 Author : gaoshengjie huxuesong 2018/05/06
14 modified at 2019/06/18
15 Contact: gaoshengjie@genomics.org.cn
17 For missing record, MAF = 0.45, Ref/Alt follow VCF.
20 our (%Markers,%MarkerAF);
23 # rs1000381 => ["chr5", 56885878, 0.124304011506483, 0.187151034246758],
24 # rs10005624 => ["chr4", 125929227, 0.122668415174707, 0.186323232412646],
25 # rs10011941 => ["chr4", 156398437, 0.116374475912992, 0.183033072043504],
29 # rs9995391 => { A => 0.5391, T => 0.4609 },
30 # rs9929923 => { A => 0.4429, C => 0.5522, G => "0.0050" },
31 # rs9996524 => { A => "0.5450", G => "0.4550" },
34 #print $CHR{"SNP5538"}{"ref"}."\n";
35 #SNP1110 501 G,A 999 G/G;9996,7 A/A;8,9955 G/A;5895,61;2.58311161233576e-19;G/G;5895,61
43 return [1,0,$err,$special,$pass];
45 my @alleles = qw{A C G T
};
46 my @geno=split /\,/,$a[2];
48 if (exists $MarkerAF{$a[0]}){
49 $pe = $Markers{$a[0]}->[2];
50 foreach my $allele (@alleles){
51 unless (defined $MarkerAF{$a[0]}{$allele}){
52 $MarkerAF{$a[0]}{$allele} = 0.01;
56 $MarkerAF{$a[0]}{$geno[0]} = 0.55;
57 for my $i (1..scalar @geno - 1){
58 $MarkerAF{$a[0]}{$geno[$i]} = 0.45;
62 my @dad=split /\;/,$a[5];
63 my @ch=split /\;/,$a[6];
64 my @genodad=split /\//,$dad[0];
65 my @genoch=split /\//,$ch[0];
66 if ($genoch[0] ne $genodad[0] && $genoch[0] ne $genodad[1] && $genoch[1] ne $genodad[0] && $genoch[1] ne $genodad[1]){
68 return [1e-4,$pe,$err,$special,$pass];
69 } elsif ($genoch[0] eq $genoch[1]){
70 if ($genodad[0] eq $genodad[1]){
71 return [1/$MarkerAF{$a[0]}{$genoch[0]},$pe,$err,$special,$pass];
72 }elsif ($genodad[0] ne $genodad[1]){
73 return [0.5/$MarkerAF{$a[0]}{$genoch[0]},$pe,$err,$special,$pass];
75 } elsif ($genoch[0] ne $genoch[1]){
76 if ($genodad[0] eq $genodad[1]){
77 return [0.5/$MarkerAF{$a[0]}{$genodad[0]},$pe,$err,$special,$pass];
78 } elsif ($genodad[0] ne $genodad[1]){
79 my @Gchild = sort @genoch;
80 my @Gdad = sort @genodad;
81 if ($Gchild[0] eq $Gdad[0] && $Gchild[1] eq $Gdad[1]){
82 my $pi = ($MarkerAF{$a[0]}{$Gchild[0]} + $MarkerAF{$a[0]}{$Gchild[1]}) / (4 * $MarkerAF{$a[0]}{$Gchild[0]} * $MarkerAF{$a[0]}{$Gchild[1]});
83 return [$pi,$pe,$err,$special,$pass];
87 my @need = grep { ++$count{$_} > 1 } @Gchild;
88 return [0.25/$MarkerAF{$a[0]}{$need[0]},$pe,$err,$special,$pass];
92 return [999,$pe,-111,-222,-333];
95 no warnings
'uninitialized';
99 return [1,0,$err,$special,$pass];
101 my @geno=split /\,/,$a[2];
103 my @alleles = qw{A C G T
};
104 if (exists $MarkerAF{$a[0]}) {
105 $pe = $Markers{$a[0]}->[3];
106 foreach my $allele (@alleles){
107 unless (defined $MarkerAF{$a[0]}{$allele}){
108 $MarkerAF{$a[0]}{$allele} = 0.01;
112 $MarkerAF{$a[0]}{$geno[0]} = 0.55;
113 for my $i (1..scalar @geno - 1){
114 $MarkerAF{$a[0]}{$geno[$i]} = 0.45;
118 my @mm=split /\;/,$a[4];
119 my @dad=split /\;/,$a[5];
120 my @ch=split /\;/,$a[6];
121 my @genomm=split /\//,$mm[0];
122 my @genodad=split /\//,$dad[0];
123 my @genoch=split /\//,$ch[0];
124 if($genoch[0] ne $genomm[0] && $genoch[1] ne $genomm[1]){
126 return [1,0,$pe,$err,$special,$pass];
127 } elsif ($genoch[0] eq $genoch[1]){
128 if ($genoch[0] ne $genodad[0] && $genoch[0] ne $genodad[1]){
130 return [1e-4,$pe,$err,$special,$pass];
131 } elsif ($genodad[0] eq $genodad[1]){
132 return [1/$MarkerAF{$a[0]}{$genoch[0]},$pe,$err,$special,$pass];
133 } elsif ($genodad[0] ne $genodad[1]){
134 return [0.5/$MarkerAF{$a[0]}{$genoch[0]},$pe,$err,$special,$pass];
136 } elsif ($genoch[0] ne $genoch[1]){
137 my $fromF = $genoch[0] eq $genomm[0] ?
$genoch[1] : $genoch[0];
138 if ($fromF ne $genodad[0] && $fromF ne $genodad[1]){
140 return [1e-4,$pe,$err,$special,$pass];
141 } elsif ($genodad[0] eq $genodad[1]){
142 return [1/$MarkerAF{$a[0]}{$fromF},$pe,$err,$special,$pass];
143 } elsif ($genodad[0] ne $genodad[1]){
144 return [0.5/$MarkerAF{$a[0]}{$fromF},$pe,$err,$special,$pass];
147 return [999,$pe,-111,-222,-333];