-
Notifications
You must be signed in to change notification settings - Fork 0
/
fralib.pm
executable file
·12038 lines (11985 loc) · 165 KB
/
fralib.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/usr/bin/perl
=head1 NAME
fralib
=head1 SYNOPSIS
=head1 DESCRIPTION
This modules contains the commonly used functions in fraTools.
=head2 Methods
=over 12
=item C<getDBConnectionString>
=cut
sub getDBConnectionString
{
return 'DBI:mysql:fratools:10.217.28.55';
}
=item C<getDBUser>
=cut
sub getDBUser
{
return 'fratools';
}
=item C<getDBUserPassword>
=cut
sub getDBUserPassword
{
return '4r15707l3';
}
=item C<isGtOrTg>
Arguments: file-name
Returns true if file is a gt or tg file
=cut
sub isGtOrTg
{
my $file = shift;
return isGt($file) || isTg($file);
}
=item C<isGt>
Arguments: file-name
Returns true if file is a gt file
=cut
sub isGt
{
my $file = shift;
if($file!~/\.gt$/)
{
return 0;
}
open(MY_IN, $file) || die "Cannot open $file";
$_ = <MY_IN>;
close(MY_IN);
s/\r?\n?$//;
my @fields = split('\t', $_, 2);
if($fields[0] eq 'sample-id')
{
return 1;
}
else
{
return 0;
}
}
=item C<isTg>
Arguments: file-name
Returns true if file is a tg file
=cut
sub isTg
{
my $file = shift;
if($file!~/\.tg$/)
{
return 0;
}
open(MY_IN, $file) || die "Cannot open $file";
$_ = <MY_IN>;
close(MY_IN);
s/\r?\n?$//;
my @fields = split('\t', $_, 2);
if($fields[0] =~ /(snp-id|marker-id)/)
{
return 1;
}
else
{
return 0;
}
}
=item C<complement>
Arguments: ACGT
Returns the reverse complement of a sequence
=cut
sub reverseComplement
{
my $sequence = shift;
my @sequence = split(//, $sequence);
my @reverseSequence = ();
for my $i (0 .. $#sequence)
{
$reverseSequence[$#sequence - $i] = complementBase($sequence[$i]);
}
return join("", @reverseSequence);
}
=item C<complement>
Arguments: A C G T ...
Returns the complement of the nucleotide
=cut
sub complementBase
{
my $base = shift;
if ($base eq 'A')
{
return 'T';
}
elsif ($base eq 'C')
{
return 'G';
}
elsif ($base eq 'G')
{
return 'C';
}
elsif ($base eq 'T')
{
return 'A';
}
elsif ($base eq 'M')
{
return 'K';
}
elsif ($base eq 'R')
{
return 'Y';
}
elsif ($base eq 'W')
{
return 'S';
}
elsif ($base eq 'S')
{
return 'W';
}
elsif ($base eq 'Y')
{
return 'R';
}
elsif ($base eq 'K')
{
return 'M';
}
elsif ($base eq 'V')
{
return 'B';
}
elsif ($base eq 'H')
{
return 'D';
}
elsif ($base eq 'D')
{
return 'H';
}
elsif ($base eq 'B')
{
return 'V';
}
elsif ($base eq 'N')
{
return 'N';
}
elsif ($base eq 'X')
{
return 'X';
}
#special case for gaps ...
#this is bad way of handling I suppose
elsif ($base eq '-')
{
return '-';
}
else
{
die "Invalid base: $base";
}
}
sub baseMatch
{
my ($base1, $base2) = ($_[0], $_[1]);
if (!defined($base1) || !defined($base2))
{
die "bases: ($base1,$base2)";
}
my $adenineGroup = 'AMRWVHDNX';
my $cytosineGroup = 'CMSYVHBNX';
my $guanineGroup = 'GRSKVDBNX';
my $thymineGroup = 'TWKYHDBNX';
if (($base1=~/$adenineGroup/ && $base2=~/$adenineGroup/) ||
($base1=~/$cytosineGroup/ && $base2=~/$cytosineGroup/) ||
($base1=~/$guanineGroup/ && $base2=~/$guanineGroup/) ||
($base1=~/$thymineGroup/ && $base2=~/$thymineGroup/))
{
return 1;
}
else
{
return 0;
}
}
=item C<max>
Arguments: int i, int j
Returns max(i,j)
=cut
sub max
{
my ($val1, $val2) = @_;
return $val1>$val2 ? $val1 : $val2;
}
=item C<max>
Arguments: int i, int j
Returns min(i,j)
=cut
sub min
{
my ($val1, $val2) = @_;
return $val1>$val2 ? $val2 : $val1;
}
=item C<trim>
Arguments: string
returns trimmed string
=cut
sub trim
{
my $value = shift;
$value=~ s/^\s+//;
$value=~ s/\s+$//;
return $value;
}
sub getTopBotStrandFromFlanks
{
my $flanks = shift;
#split into 5' and 3' ends and the polymorphic locus
if ($flanks=~/([ACGTMRWSYKVHDBNX]*)\[([ACGT]\/[ACGT])\]([ACGTMRWSYKVHDBNX]*)/i)
{
my @fivePrime = split('', uc($1));
my @alleles = sort(split('/', $2));
if($alleles[0] eq $alleles[1])
{
die "Alleles are the same: @alleles";
}
my $alleles = join('', @alleles);
my @threePrime = split('', uc($3));
#if ambiguous
if(($alleles eq 'AT' || $alleles eq 'CG'))
{
my $maxLength = min(scalar(@fivePrime), scalar(@threePrime));
for my $i (0 .. $maxLength-1)
{
my $pseudoAlleles = join('', sort($fivePrime[-($i+1)], $threePrime[$i]));
if ($pseudoAlleles=~/(AC|AG|CT|GT)/)
{
if($fivePrime[-($i+1)]=~/[AT]/)
{
return 'top';
}
else
{
return 'bot';
}
}
elsif($pseudoAlleles=~/[MRWSYKVHDBNX]/)
{
#polymorphic SNP detected in flanks, topbot annotation is unstable
return undef;
}
#pseudo alleles are ambiguous
#AT, CG, AA, CC, GG, TT
}
#flanks are untopbotifiable
return undef;
}
#if non-ambiguous SNP
else
{
if($alleles=~/A/)
{
return 'top';
}
elsif($alleles=~/T/)
{
return 'bot';
}
}
}
else
{
#flank issues
return undef;
}
}
sub getAffyRefOppStrandFromFlanks
{
my $flanks = shift;
#split into 5' and 3' ends and the polymorphic locus
if ($flanks=~/([ACGTMRWSYKVHDBNX]+)\[([ACGT]\/[ACGT])\]([ACGTMRWSYKVHDBNX]+)/i)
{
my @fivePrime = split('', uc($1));
my $alleles = join('', sort(split('/', $2)));
my @threePrime = split('', uc($3));
my $maxLength = min(scalar(@fivePrime), scalar(@threePrime));
for my $i (0 .. $maxLength-1)
{
my $twomer = join('', $fivePrime[-($i+1)], $threePrime[$i]);
if($twomer=~/[MRWSYKVHDBNX]/)
{
#polymorphic SNP detected in flanks, affymetrix reference strand is unstable
return undef;
}
#complementary twomer
elsif($twomer=~/^(AT|TA|CG|GC)$/)
{
#ambiguous, move on to next twomer
}
elsif($twomer=~/A/)
{
return 'affyref';
}
elsif($twomer=~/T/)
{
return 'affyopp';
}
elsif($twomer=~/CC/)
{
return 'affyref';
}
elsif($twomer=~/GG/)
{
return 'affyopp';
}
}
#flanks are unraffyeferencible
return undef
}
else
{
#flank issues
return undef;
}
}
#list of snps
my $affymetrixExceptionClassSNPs = <<EXCEPTION_CLASS_SNPS;
SNP_A-1780733
SNP_A-1782432
SNP_A-1784336
SNP_A-1794867
SNP_A-1794941
SNP_A-1797637
SNP_A-1803920
SNP_A-1808280
SNP_A-1809703
SNP_A-1811005
SNP_A-1818097
SNP_A-1820937
SNP_A-1822631
SNP_A-1822633
SNP_A-1827907
SNP_A-1831054
SNP_A-1831157
SNP_A-1836942
SNP_A-1838674
SNP_A-1839412
SNP_A-1839565
SNP_A-1839566
SNP_A-1839664
SNP_A-1839665
SNP_A-1839682
SNP_A-1840479
SNP_A-1847794
SNP_A-1851117
SNP_A-1853719
SNP_A-1856149
SNP_A-1860220
SNP_A-1866397
SNP_A-1869312
SNP_A-1870181
SNP_A-1871165
SNP_A-1879884
SNP_A-1880075
SNP_A-1881819
SNP_A-1883892
SNP_A-1885798
SNP_A-1886018
SNP_A-1890317
SNP_A-1896362
SNP_A-1899987
SNP_A-1900060
SNP_A-1902385
SNP_A-1905459
SNP_A-1907755
SNP_A-1910447
SNP_A-1910936
SNP_A-1914110
SNP_A-1920577
SNP_A-1922370
SNP_A-1924736
SNP_A-1931257
SNP_A-1937116
SNP_A-1948603
SNP_A-1948716
SNP_A-1961690
SNP_A-1961994
SNP_A-1961995
SNP_A-1962081
SNP_A-1962115
SNP_A-1962393
SNP_A-1962547
SNP_A-1962582
SNP_A-1962585
SNP_A-1962856
SNP_A-1962936
SNP_A-1963132
SNP_A-1963242
SNP_A-1963250
SNP_A-1963384
SNP_A-1963480
SNP_A-1963525
SNP_A-1963641
SNP_A-1963688
SNP_A-1963761
SNP_A-1963872
SNP_A-1964397
SNP_A-1964460
SNP_A-1964488
SNP_A-1964561
SNP_A-1964992
SNP_A-1965185
SNP_A-1965195
SNP_A-1965294
SNP_A-1965297
SNP_A-1965401
SNP_A-1965515
SNP_A-1965625
SNP_A-1965682
SNP_A-1965833
SNP_A-1965880
SNP_A-1966000
SNP_A-1966098
SNP_A-1966288
SNP_A-1966327
SNP_A-1966487
SNP_A-1966821
SNP_A-1966937
SNP_A-1966951
SNP_A-1966988
SNP_A-1967293
SNP_A-1967423
SNP_A-1967497
SNP_A-1967595
SNP_A-1967602
SNP_A-1967605
SNP_A-1967664
SNP_A-1967669
SNP_A-1967814
SNP_A-1967948
SNP_A-1967975
SNP_A-1968096
SNP_A-1968254
SNP_A-1968413
SNP_A-1968457
SNP_A-1968587
SNP_A-1968630
SNP_A-1968721
SNP_A-1969210
SNP_A-1969221
SNP_A-1969278
SNP_A-1969356
SNP_A-1969471
SNP_A-1969733
SNP_A-1969830
SNP_A-1970483
SNP_A-1970516
SNP_A-1970544
SNP_A-1970567
SNP_A-1970714
SNP_A-1970788
SNP_A-1970968
SNP_A-1970989
SNP_A-1971019
SNP_A-1971058
SNP_A-1971383
SNP_A-1971436
SNP_A-1971582
SNP_A-1971598
SNP_A-1971756
SNP_A-1971818
SNP_A-1971897
SNP_A-1971931
SNP_A-1971999
SNP_A-1972074
SNP_A-1972193
SNP_A-1972299
SNP_A-1972317
SNP_A-1972322
SNP_A-1972392
SNP_A-1972441
SNP_A-1972442
SNP_A-1972457
SNP_A-1972509
SNP_A-1972555
SNP_A-1972677
SNP_A-1972733
SNP_A-1972740
SNP_A-1972753
SNP_A-1972767
SNP_A-1972782
SNP_A-1972978
SNP_A-1972989
SNP_A-1973029
SNP_A-1973193
SNP_A-1973275
SNP_A-1973388
SNP_A-1973426
SNP_A-1973439
SNP_A-1973472
SNP_A-1973613
SNP_A-1973624
SNP_A-1973809
SNP_A-1973872
SNP_A-1974074
SNP_A-1974223
SNP_A-1974259
SNP_A-1974315
SNP_A-1974333
SNP_A-1974356
SNP_A-1974494
SNP_A-1974607
SNP_A-1974622
SNP_A-1974740
SNP_A-1974770
SNP_A-1974953
SNP_A-1975055
SNP_A-1975115
SNP_A-1975308
SNP_A-1975317
SNP_A-1975414
SNP_A-1975624
SNP_A-1975641
SNP_A-1975768
SNP_A-1975785
SNP_A-1975794
SNP_A-1975914
SNP_A-1975935
SNP_A-1976086
SNP_A-1976099
SNP_A-1976151
SNP_A-1976292
SNP_A-1976358
SNP_A-1976446
SNP_A-1976610
SNP_A-1976742
SNP_A-1976762
SNP_A-1976902
SNP_A-1976915
SNP_A-1976963
SNP_A-1977043
SNP_A-1977084
SNP_A-1977261
SNP_A-1977531
SNP_A-1977757
SNP_A-1977814
SNP_A-1977815
SNP_A-1977835
SNP_A-1978021
SNP_A-1978207
SNP_A-1978224
SNP_A-1978248
SNP_A-1978506
SNP_A-1978616
SNP_A-1978646
SNP_A-1978834
SNP_A-1978851
SNP_A-1979155
SNP_A-1979200
SNP_A-1979440
SNP_A-1979467
SNP_A-1979481
SNP_A-1979564
SNP_A-1979581
SNP_A-1980018
SNP_A-1980200
SNP_A-1980236
SNP_A-1980242
SNP_A-1980249
SNP_A-1980253
SNP_A-1980262
SNP_A-1980269
SNP_A-1980270
SNP_A-1980318
SNP_A-1980401
SNP_A-1980419
SNP_A-1980736
SNP_A-1981068
SNP_A-1981130
SNP_A-1981432
SNP_A-1981562
SNP_A-1981585
SNP_A-1981625
SNP_A-1981693
SNP_A-1981952
SNP_A-1981961
SNP_A-1981970
SNP_A-1982076
SNP_A-1982148
SNP_A-1982254
SNP_A-1982419
SNP_A-1982471
SNP_A-1982519
SNP_A-1982835
SNP_A-1982915
SNP_A-1982917
SNP_A-1982943
SNP_A-1982987
SNP_A-1983165
SNP_A-1983318
SNP_A-1983456
SNP_A-1983506
SNP_A-1983544
SNP_A-1983612
SNP_A-1983658
SNP_A-1983852
SNP_A-1983974
SNP_A-1984067
SNP_A-1984071
SNP_A-1984125
SNP_A-1984129
SNP_A-1984223
SNP_A-1984291
SNP_A-1984309
SNP_A-1984463
SNP_A-1984545
SNP_A-1984568
SNP_A-1984599
SNP_A-1984688
SNP_A-1984761
SNP_A-1984853
SNP_A-1984960
SNP_A-1984973
SNP_A-1984974
SNP_A-1984992
SNP_A-1984994
SNP_A-1985231
SNP_A-1985254
SNP_A-1985328
SNP_A-1985349
SNP_A-1985367
SNP_A-1985436
SNP_A-1985513
SNP_A-1985626
SNP_A-1985631
SNP_A-1985670
SNP_A-1985775
SNP_A-1985929
SNP_A-1986011
SNP_A-1986099
SNP_A-1986174
SNP_A-1986279
SNP_A-1986404
SNP_A-1986449
SNP_A-1986486
SNP_A-1986607
SNP_A-1986673
SNP_A-1986741
SNP_A-1986853
SNP_A-1987095
SNP_A-1987104
SNP_A-1987165
SNP_A-1987180
SNP_A-1987273
SNP_A-1987290
SNP_A-1987418
SNP_A-1987502
SNP_A-1987670
SNP_A-1987687
SNP_A-1987899
SNP_A-1987958
SNP_A-1988007
SNP_A-1988119
SNP_A-1988295
SNP_A-1988308
SNP_A-1988429
SNP_A-1988461
SNP_A-1988476
SNP_A-1988514
SNP_A-1988718
SNP_A-1988723
SNP_A-1988734
SNP_A-1988777
SNP_A-1989176
SNP_A-1989197
SNP_A-1989405
SNP_A-1989480
SNP_A-1989507
SNP_A-1989707
SNP_A-1989711
SNP_A-1989744
SNP_A-1989776
SNP_A-1989937
SNP_A-1989988
SNP_A-1990440
SNP_A-1990627
SNP_A-1990957
SNP_A-1990979
SNP_A-1991020
SNP_A-1991110
SNP_A-1991224
SNP_A-1991225
SNP_A-1991262
SNP_A-1991334
SNP_A-1991526
SNP_A-1991573
SNP_A-1991634
SNP_A-1991652
SNP_A-1991720
SNP_A-1991843
SNP_A-1991891
SNP_A-1991974
SNP_A-1992101
SNP_A-1992422
SNP_A-1992423
SNP_A-1992685
SNP_A-1992959
SNP_A-1993039
SNP_A-1993254
SNP_A-1993537
SNP_A-1993607
SNP_A-1993687
SNP_A-1993721
SNP_A-1993736
SNP_A-1993796
SNP_A-1993909
SNP_A-1994069
SNP_A-1994221
SNP_A-1994231
SNP_A-1994263
SNP_A-1994589
SNP_A-1994710
SNP_A-1994721
SNP_A-1994816
SNP_A-1994879
SNP_A-1994920
SNP_A-1994928
SNP_A-1995028
SNP_A-1995038
SNP_A-1995129
SNP_A-1995254
SNP_A-1995352
SNP_A-1995447
SNP_A-1995540
SNP_A-1995556
SNP_A-1995593
SNP_A-1995680
SNP_A-1995797
SNP_A-1995834
SNP_A-1995931
SNP_A-1995947
SNP_A-1995973
SNP_A-1996016
SNP_A-1996085
SNP_A-1996089
SNP_A-1996099
SNP_A-1996101
SNP_A-1996125
SNP_A-1996196
SNP_A-1996247
SNP_A-1996413
SNP_A-1996518
SNP_A-1996688
SNP_A-1996689
SNP_A-1996855
SNP_A-1996860
SNP_A-1996872
SNP_A-1996932
SNP_A-1997035
SNP_A-1997141
SNP_A-1997198
SNP_A-1997224
SNP_A-1997309
SNP_A-1997445
SNP_A-1997521
SNP_A-1997593
SNP_A-1997610
SNP_A-1997690
SNP_A-1997785
SNP_A-1997882
SNP_A-1997914
SNP_A-1997940
SNP_A-1998015
SNP_A-1998060
SNP_A-1998064
SNP_A-1998179
SNP_A-1998217
SNP_A-1998372
SNP_A-1998398
SNP_A-1998415
SNP_A-1998455
SNP_A-1998467
SNP_A-1998468
SNP_A-1998569
SNP_A-1998581
SNP_A-1998586
SNP_A-1998631
SNP_A-1998811
SNP_A-1998824
SNP_A-1998843
SNP_A-1998870
SNP_A-1999231
SNP_A-1999368
SNP_A-1999474
SNP_A-1999492
SNP_A-1999548
SNP_A-1999620
SNP_A-1999694
SNP_A-1999931
SNP_A-2000209
SNP_A-2001162
SNP_A-2001369
SNP_A-2001397
SNP_A-2001405
SNP_A-2001649
SNP_A-2001963
SNP_A-2002270
SNP_A-2002662
SNP_A-2002809
SNP_A-2002855
SNP_A-2003143
SNP_A-2003231
SNP_A-2003233
SNP_A-2003775
SNP_A-2003904
SNP_A-2004163
SNP_A-2004313
SNP_A-2004535
SNP_A-2005419
SNP_A-2005552
SNP_A-2005705
SNP_A-2006416
SNP_A-2006493
SNP_A-2006596
SNP_A-2006647
SNP_A-2006750
SNP_A-2006783
SNP_A-2006890
SNP_A-2007150
SNP_A-2007270
SNP_A-2007581
SNP_A-2007864
SNP_A-2008473
SNP_A-2010454
SNP_A-2010576
SNP_A-2011670
SNP_A-2011836
SNP_A-2011980
SNP_A-2012121
SNP_A-2013050
SNP_A-2013749
SNP_A-2014565
SNP_A-2014578
SNP_A-2014634
SNP_A-2014865
SNP_A-2017350
SNP_A-2020824
SNP_A-2020867
SNP_A-2020982
SNP_A-2021014
SNP_A-2021465
SNP_A-2022813
SNP_A-2022824
SNP_A-2022857
SNP_A-2023361
SNP_A-2024295
SNP_A-2024717
SNP_A-2026762
SNP_A-2029057
SNP_A-2037265
SNP_A-2037848
SNP_A-2037850
SNP_A-2039461
SNP_A-2041737
SNP_A-2045165
SNP_A-2049669
SNP_A-2054607
SNP_A-2056679
SNP_A-2060761
SNP_A-2061710
SNP_A-2063632
SNP_A-2066088
SNP_A-2066822
SNP_A-2068133
SNP_A-2070640
SNP_A-2073665
SNP_A-2073667
SNP_A-2081808
SNP_A-2082017
SNP_A-2082022
SNP_A-2088765
SNP_A-2089115
SNP_A-2089744
SNP_A-2092729
SNP_A-2094087
SNP_A-2094244
SNP_A-2094256
SNP_A-2098115
SNP_A-2099345
SNP_A-2100306
SNP_A-2100900
SNP_A-2103132
SNP_A-2103970
SNP_A-2104782
SNP_A-2105559
SNP_A-2106776
SNP_A-2107448
SNP_A-2110959
SNP_A-2113716
SNP_A-2114688
SNP_A-2118349
SNP_A-2119072
SNP_A-2120818
SNP_A-2121272
SNP_A-2129353
SNP_A-2130630
SNP_A-2130995
SNP_A-2131274
SNP_A-2134274
SNP_A-2134773
SNP_A-2143727
SNP_A-2144295
SNP_A-2146166
SNP_A-2154181
SNP_A-2157939
SNP_A-2158515
SNP_A-2160262
SNP_A-2161450
SNP_A-2162287
SNP_A-2163280
SNP_A-2164107
SNP_A-2170758
SNP_A-2171950
SNP_A-2172527
SNP_A-2172988
SNP_A-2177202
SNP_A-2178048
SNP_A-2178241
SNP_A-2182075
SNP_A-2183543