diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..225cf9b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,57 @@ +# Based on Jeremiah H. Savage 's kent image +FROM fedora:28 + +MAINTAINER Alex Kotlar + +ENV PATH="/root/mpd-perl/bin:${PATH}" \ + PERL5LIB="/root/perl5/lib/perl5:/root/mpd-perl/lib:${PERL5LIB}" + +WORKDIR /root + +RUN dnf install -y \ + gcc \ + gcc-c++ \ + libpng-devel \ + libuuid-devel \ + make \ + mariadb-devel \ + patch \ + perl \ + rsync \ + unzip \ + wget \ + which \ + git \ + openssh-clients + +RUN wget http://hgdownload.cse.ucsc.edu/admin/jksrc.v371.zip \ + && unzip -q jksrc.v371.zip \ + && rm jksrc.v371.zip + +RUN mkdir -p bin/x86_64 \ + && export MACHTYPE=x86_64 \ + && cd kent/src/ && make libs \ + && cd lib/ && make \ + && cd ../jkOwnLib/ && make \ + && cd ../isPcr/ && make \ + && cd /root && rm -rf kent + +WORKDIR /root + +RUN git clone https://bitbucket.org/wingolab/mpd-dat \ + && mkdir /root/2bit && cd $_ \ + && wget http://hgdownload.cse.ucsc.edu/goldenPath/hg38/bigZips/hg38.2bit \ + && cd /root + +WORKDIR /root + +ADD ./ /root/mpd-perl/ + +RUN curl -L https://cpanmin.us | perl - App::cpanminus \ + && mkdir -p /root/perl5/lib/perl \ + && cpanm --local-lib=/root/perl5 local::lib && eval $(perl -I /root/perl5/lib/perl5 -Mlocal::lib) \ + && cd /root/mpd-perl && cpanm MPD.tar.gz && cpanm --installdeps . \ + && git clone https://github.com/wingolab-org/mpd-c /root/mpd-c \ + && cd /root/mpd-c && make + +WORKDIR /root/mpd-perl/ diff --git a/MPD-0.001.tar.gz b/MPD-0.001.tar.gz deleted file mode 100644 index 4500a82..0000000 Binary files a/MPD-0.001.tar.gz and /dev/null differ diff --git a/MPD.tar.gz b/MPD.tar.gz new file mode 100644 index 0000000..2830ede Binary files /dev/null and b/MPD.tar.gz differ diff --git a/README.md b/README.md index 2f7b7bf..de2c5d1 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,29 @@ This package assists in the automation of multiplex primer design. This package Please cite our [paper](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-016-1453-3) if you use MPD in your work. Thanks. -## Installation +## Install in Docker + +Run mpd-perl inside of a Docker instance. Configured for hg38. + +```sh +git clone https://github.com/wingolab-org/mpd-perl && cd $_ +docker build -t mpd ./ + +# Run +docker run mpd design.pl +``` + +Example running MPD from within Docker: + +```sh +# Assuming you have a /mnt/data and wish to mount it as /data inside of the docker container +# that you have ~/data/markers.txt.bed with your targets, and that you wish to write to ~/data/outdir/outfile.txt +# config/hg38.yml comes installed with this docker image, inside of the image +# if you wish, you can pass in your own config +docker run -v ~/data:/data mpd design.pl -b /data/markers.txt.bed -c config/hg38.yml -d ~/data/outdir -o outfile.txt +``` + +## Manual Installation - Compiling the c binaries. Follow the instructions here: [mpd-c](http://github.com/wingolab-org/mpd-c). - Clone the perl MPD package (e.g., `git clone https://github.com/wingolab-org/mpd-perl.git`). @@ -18,6 +40,7 @@ Please cite our [paper](https://bmcbioinformatics.biomedcentral.com/articles/10. - See examples scripts in the `ex` directory or look at the tests, specifically, `t/05-Mpd.t` to see how to build and use the MPD object. ## Optional features + - The MPD package can be made to use the standalone binary for isPcr by Jim Kent. If you are not familiar with isPcr [here is a web version](https://genome.ucsc.edu/cgi-bin/hgPcr) which has details about obtaining the source code to build the stand alone binary. - If you use the isPcr you will need the 2bit genome of the organism. diff --git a/bin/beantalk_queue_server.pl b/bin/beantalk_queue_server.pl new file mode 100755 index 0000000..dab4104 --- /dev/null +++ b/bin/beantalk_queue_server.pl @@ -0,0 +1,273 @@ +#!/usr/bin/env perl +# Name: snpfile_annotate_mongo_redis_queue.pl +# Description: +# Date Created: Wed Dec 24 +# By: Alex Kotlar +# Requires: Snpfile::AnnotatorBase + +#Todo: Handle job expiration (what happens when job:id expired; make sure no other job operations happen, let Node know via sess:?) +#There may be much more performant ways of handling this without loss of reliability; loook at just storing entire message in perl, and relying on decode_json +#Todo: (Probably in Node.js): add failed jobs, and those stuck in processingJobs list for too long, back into job queue, for N attempts (stored in jobs:jobID) + +use 5.10.0; +use strict; +use warnings; + +use Beanstalk::Client; +use Parallel::ForkManager; +use Cpanel::JSON::XS; +use DDP output => 'stdout'; +use Getopt::Long; +use File::Basename; +use Log::Any::Adapter; +use Path::Tiny; +use Try::Tiny; +use Hash::Merge::Simple qw/merge/; +use YAML::XS qw/LoadFile/; + +use lib './lib'; + +use MPD; + +# use AnyEvent; +# use AnyEvent::PocketIO::Client; +#use Sys::Info; +#use Sys::Info::Constants qw( :device_cpu ) +#for choosing max connections based on available resources + +# max of 1 job at a time for now + +my $DEBUG = 0; +my $conf = LoadFile("./config/queue.yaml"); + +# Beanstalk servers will be sharded +my $beanstalkHost = $conf->{beanstalk_host_1}; +my $beanstalkPort = $conf->{beanstalk_port_1}; + +my $configPathBaseDir = "./config/web/"; + +my $verbose = 1; + +my $beanstalk = Beanstalk::Client->new( + { + server => $conf->{beanstalkd}{host} . ':' . $conf->{beanstalkd}{port}, + default_tube => $conf->{beanstalkd}{tubes}{annotation}{submission}, + connect_timeout => 1, + encoder => sub { encode_json( \@_ ) }, + decoder => sub { @{ decode_json(shift) } }, + } +); + +my $beanstalkEvents = Beanstalk::Client->new( + { + server => $conf->{beanstalkd}{host} . ':' . $conf->{beanstalkd}{port}, + default_tube => $conf->{beanstalkd}{tubes}{annotation}{events}, + connect_timeout => 1, + encoder => sub { encode_json( \@_ ) }, + decoder => sub { @{ decode_json(shift) } }, + } +); + +# my $pm = Parallel::ForkManager->new(8); + +while ( my $job = $beanstalk->reserve ) { + + # Parallel ForkManager used only to throttle number of jobs run in parallel + # cannot use run_on_finish with blocking reserves, use try catch instead + # Also using forks helps clean up leaked memory from LMDB_File + # Unfortunately, parallel fork manager doesn't play nicely with try tiny + # prevents anything within the try from executing + my $jobDataHref = decode_json( $job->data ); + + $beanstalkEvents->put( + { + priority => 0, + data => encode_json { + event => 'started', + queueId => $job->id, + } + } + ); + + my ( $err, $result ) = handleJob( $jobDataHref, $job->id ); + + if ($err) { + say "job " . $job->id . " failed with $err"; + + $beanstalkEvents->put( + { + priority => 0, + data => encode_json( + { + event => 'failed', + queueId => $job->id, + reason => $err, + } + ) + } + ); + + $beanstalk->bury( $job->id ); + } + else { + say "completed job with queue id " . $job->id; + + # Signal completion before completion actually occurs via delete + # To be conservative; since after delete message is lost + $beanstalkEvents->put( + { + priority => 0, + data => encode_json( + { + event => 'completed', + queueId => $job->id, + results => $result, + } + ) + } + ); + + $beanstalk->delete( $job->id ); + } + + say "finished"; +} + +sub handleJob { + my $submittedJob = shift; + my $queueId = shift; + + my $failed; + + my $inputHref = coerceInputs( $submittedJob, $queueId ); + + say "inputHref is"; + p $inputHref; + + try { + my $dir = path( $inputHref->{OutDir} ); + + if ( !$dir->is_dir ) { $dir->mkpath(); } + + my $m = MPD->new_with_config($inputHref); + + say "MPD is "; + p $m; + + my $result = $m->RunAll(); + + return ( undef, $result ); + } + catch { + my $indexOfConstructor = index( $_, "MPD::" ); + + if ( ~$indexOfConstructor ) { + $failed = substr( $_, 0, $indexOfConstructor ); + } + else { + $failed = $_; + } + + return ( $_, undef ); + }; +} + +#Here we may wish to read a json or yaml file containing argument mappings +sub coerceInputs { + my $jobDetailsHref = shift; + my $queueId = shift; + + my $inputFilePath = $jobDetailsHref->{inputFilePath}; + my $outputDir = $jobDetailsHref->{dirs}{out}; + my $outputExt = $jobDetailsHref->{name}; + + my $configFilePath = getConfigFilePath( $jobDetailsHref->{assembly} ); + + my $config = LoadFile($configFilePath); + + my $coreHref = $config->{Core}; + + ########## Gather basic and advanced options ################### + my $basic = $config->{User}{Basic}; + my $advanced = $config->{User}{Advanced}; + + my %basicOptions = map { $_->{name} => $_->{val} } @$basic; + my %advancedOptions = map { $_->{name} => $_->{val} } @$advanced; + + my $userBasic = $jobDetailsHref->{options}{Basic}; + my $userAdvanced = $jobDetailsHref->{options}{Advanced}; + + my %userBasicOptions = map { $_->{name} => $_->{val} } @$userBasic; + my %userAdvancedOptions = map { $_->{name} => $_->{val} } @$userAdvanced; + + # right hand precedence; + + my $mergedConfig = + merge( $coreHref, \%basicOptions, \%advancedOptions, \%userBasicOptions, + \%userAdvancedOptions ); + + # JSON::PP::Boolean will not pass moose constraint for Bool + foreach my $val ( values %$mergedConfig ) { + if ( ref $val eq 'JSON::PP::Boolean' ) { + $val = !!$val; + } + } + + $mergedConfig->{publisher} = { + server => $conf->{beanstalkd}{host} . ':' . $conf->{beanstalkd}{port}, + queue => $conf->{beanstalkd}{tubes}{annotation}{events}, + messageBase => { + event => 'progress', + queueId => $queueId, + data => undef, + }, + }; + + $mergedConfig->{configfile} = $configFilePath; + $mergedConfig->{BedFile} = $jobDetailsHref->{inputFilePath}; + $mergedConfig->{OutExt} = $jobDetailsHref->{name}; + $mergedConfig->{OutDir} = $jobDetailsHref->{dirs}{out}; + $mergedConfig->{ProjectName} = $jobDetailsHref->{name}; + + # need to compress so web can get a single file to download + $mergedConfig->{compress} = 1; + + return $mergedConfig; +} + +# { +# configfile => $config_file, +# BedFile => $bed_file, +# OutExt => $out_ext, +# OutDir => $dir, +# InitTmMin => 58, +# InitTmMax => 61, +# PoolMin => $poolMin, +# Debug => $verbose, +# IterMax => 2, +# RunIsPcr => 0, +# Act => $act, +# ProjectName => $out_ext, +# FwdAdapter => 'ACACTGACGACATGGTTCTACA', +# RevAdapter => 'TACGGTAGCAGAGACTTGGTCT', +# Offset => 0, +# Randomize => 1, +# a => 1 +# } + +sub getConfigFilePath { + my $assembly = shift; + + my @maybePath = glob( path($configPathBaseDir)->child($assembly . ".y*ml")->stringify ); + + if ( scalar @maybePath ) { + if ( scalar @maybePath > 1 ) { + #should log + say "\n\nMore than 1 config path found, choosing first"; + } + + return $maybePath[0]; + } + + die "\n\nNo config path found for the assembly $assembly. Exiting\n\n"; +} diff --git a/bin/cleanBed.pl b/bin/cleanBed.pl new file mode 100755 index 0000000..f0376cd --- /dev/null +++ b/bin/cleanBed.pl @@ -0,0 +1,39 @@ +#!/usr/bin/env perl +# Name: cleanBed.pl +# Date Created: Fri Jun 17 09:33:06 2016 +# Date Modified: Fri Jun 17 09:33:06 2016 +# By: TS Wingo +# +# Description: + +use 5.10.0; +use warnings; +use strict; + +use Getopt::Long; +use Path::Tiny; +use MPD::Bed; + +# variables +my ( $file_name, $out_ext, $useLetterChr ); + +# get options +die "Usage: $0 -f -o [--l|etter]\n" + unless GetOptions( + 'f|file=s' => \$file_name, + 'o|out=s' => \$out_ext, + 'l|letter' => \$useLetterChr, + ) + and $file_name + and $out_ext; + +my $b = MPD::Bed->new($file_name); +my $outFh = path("$out_ext.bed")->filehandle(">"); + +if ($useLetterChr) { + say {$outFh} $b->Entries_as_BedFileLetter(); +} +else { + say {$outFh} $b->Entries_as_BedFile(); +} + diff --git a/bin/config.yaml b/bin/config.yaml new file mode 100644 index 0000000..4340076 --- /dev/null +++ b/bin/config.yaml @@ -0,0 +1,26 @@ +--- +BedFile: ex/markers.txt.bed +isPcrBinary: /home/ec2-user/bin/x86_64/isPcr +TwoBitFile: /mnt/annnotator/2bit/hg38.2bit +MpdBinary: /home/ec2-user/bin/mpd +MpdIdx: hg38.d14.sdx +dbSnpIdx: ds_flat.sdx + +CoverageThreshold: 0.8 +PrimerSizeMin: 17 +PrimerSizeMax: 27 +PadSize: 60 +PoolMax: 10 +PoolMin: 5 + +AmpSizeMax: 260 +AmpSizeMin: 230 +TmMax: 62 +TmMin: 57 +GcMax: 0.7 +GcMin: 0.3 + +Iter: 2 +IncrTm: 1 +IncrTmStep: 1 +IncrAmpSize: 10 diff --git a/bin/design.pl b/bin/design.pl new file mode 100755 index 0000000..e600def --- /dev/null +++ b/bin/design.pl @@ -0,0 +1,85 @@ +#!/usr/bin/env perl +# Name: ex/design.pl +# Date Created: Wed Mar 9 15:36:28 2016 +# Date Modified: Wed Mar 9 15:36:28 2016 +# By: TS Wingo +# +# Description: + +use 5.10.0; +use warnings; +use strict; +use Getopt::Long; +use Path::Tiny; +use YAML::XS qw/LoadFile/; +use lib '../lib'; + +use MPD; + +# variables +my ( $verbose, $act, $dir, $prn, $poolMin, $bed_file, $config_file, $out_ext ); + +# get options +die + "Usage: $0 [-v] [-a] -b -c -d -o \n" + unless GetOptions( + 'v|verbose' => \$verbose, + 'a|act' => \$act, + 'b|bed=s' => \$bed_file, + 'c|config=s' => \$config_file, + 'o|out=s' => \$out_ext, + 'd|dir=s' => \$dir, + 'min_pool=n' => \$poolMin, + ) + and $bed_file + and $config_file + and $out_ext; +$verbose++ unless $act; + +$poolMin = 1 unless defined $poolMin; + +$dir = path($dir); + +if ( !$dir->is_dir ) { $dir->mkpath(); } + +my $file = LoadFile($config_file); + +if($file->{Core} || $file->{User}) { + my $coreHref = $file->{Core} || {}; + my $userBasic = $file->{User} && $file->{User}{Basic} || {}; + my $userAdvanced = $file->{User} && $file->{User}{Advanced} || {}; + + %$file = (%$coreHref, %$userBasic, %$userAdvanced); + + for my $key (keys %$file) { + if(ref $file->{$key}) { + if(exists $file->{$key}{val}) { + $file->{$key} = $file->{$key}{val}; + } + } + } +} + +my $default = { + BedFile => $bed_file, + OutExt => $out_ext, + OutDir => $dir, + InitTmMin => 58, + InitTmMax => 61, + PoolMin => $poolMin, + Debug => $verbose, + IterMax => 2, + RunIsPcr => 0, + Act => $act, + ProjectName => $out_ext, + FwdAdapter => 'ACACTGACGACATGGTTCTACA', + RevAdapter => 'TACGGTAGCAGAGACTTGGTCT', + Offset => 0, + Randomize => 1, +}; + +my %config = (%$default, %$file); + +my $m = MPD->new(\%config); + +$m->RunAll(); diff --git a/bin/markers.txt b/bin/markers.txt new file mode 100644 index 0000000..02b2d41 --- /dev/null +++ b/bin/markers.txt @@ -0,0 +1,1774 @@ +rs12562034 +rs12145826 +rs4970420 +rs3128342 +rs3052 +rs2017143 +rs903901 +rs2494428 +rs12022929 +rs10797342 +rs6685625 +rs2376821 +rs4415513 +rs1984069 +rs4648505 +rs4648524 +rs7544357 +rs4276857 +rs2181484 +rs2275831 +rs3205087 +rs6661168 +rs1353341 +rs12408012 +rs10047182 +rs11799990 +rs3753702 +rs10915621 +rs10915315 +rs6698702 +rs604664 +rs7415936 +rs11260698 +rs1775421 +rs945322 +rs1698976 +rs489933 +rs3138158 +rs12751613 +rs6577395 +rs6577430 +rs12409413 +rs2301462 +rs845217 +rs10864301 +rs1618346 +rs2301488 +rs228648 +rs4908736 +rs7529511 +rs6701300 +rs11805233 +rs12726360 +rs6688312 +rs6691645 +rs4845948 +rs7514751 +rs205472 +rs1292666 +rs4845960 +rs12755921 +rs12058244 +rs3125815 +rs2336034 +rs9430631 +rs12095517 +rs198388 +rs2295281 +rs11569864 +rs235219 +rs475983 +rs4846127 +rs10779772 +rs7515525 +rs982510 +rs1203709 +rs12568548 +rs943918 +rs4385705 +rs7527439 +rs11585327 +rs804129 +rs3845596 +rs10927902 +rs12756041 +rs708096 +rs16861648 +rs585075 +rs12121503 +rs4508039 +rs2294630 +rs4912019 +rs12140071 +rs4509550 +rs1108974 +rs631134 +rs10916718 +rs230178 +rs11799849 +rs3026845 +rs213022 +rs1780320 +rs2305562 +rs10917067 +rs2473277 +rs12130508 +rs1561624 +rs3218121 +rs909534 +rs10917395 +rs2902663 +rs4648930 +rs10903095 +rs6600267 +rs3924486 +rs2982304 +rs1981135 +rs11247945 +rs12741800 +rs7555931 +rs199613 +rs7528451 +rs1188394 +rs4949302 +rs4949315 +rs11807560 +rs11578323 +rs648718 +rs6678903 +rs6661037 +rs16835734 +rs717030 +rs1321630 +rs6697504 +rs549048 +rs2994598 +rs771401 +rs2294190 +rs6689092 +rs7530283 +rs7540413 +rs6702349 +rs631432 +rs3795494 +rs11210569 +rs4290027 +rs882000 +rs1932364 +rs4970603 +rs4660401 +rs17264901 +rs704787 +rs11811998 +rs3134613 +rs2769258 +rs913382 +rs11802778 +rs4660192 +rs2801962 +rs12065902 +rs11584933 +rs10890022 +rs6687333 +rs913426 +rs12130264 +rs12404679 +rs12135483 +rs2906457 +rs12058010 +rs1340647 +rs11210998 +rs11582764 +rs2088102 +rs324419 +rs3125630 +rs11578572 +rs4926966 +rs2065606 +rs6664402 +rs1539530 +rs2803269 +rs2803274 +rs923028 +rs320020 +rs320021 +rs973886 +rs2050695 +rs4926976 +rs4926992 +rs2986655 +rs4927007 +rs1183394 +rs12078845 +rs6697414 +rs11584093 +rs11589310 +rs11206407 +rs644955 +rs7542637 +rs12081312 +rs619895 +rs11206464 +rs2182832 +rs17111909 +rs2404389 +rs2793673 +rs11810204 +rs6662617 +rs6672416 +rs669444 +rs1754538 +rs12029757 +rs11207011 +rs1341320 +rs6687355 +rs1886139 +rs2038379 +rs4912301 +rs338919 +rs3015321 +rs3010326 +rs4619004 +rs1004772 +rs6587875 +rs922355 +rs11585396 +rs6674001 +rs10493298 +rs12122228 +rs1002005 +rs2121598 +rs1572312 +rs924273 +rs2152093 +rs7521242 +rs2499540 +rs2499516 +rs7541526 +rs12408292 +rs1892022 +rs6587948 +rs2476194 +rs7512821 +rs4915827 +rs12747317 +rs1191758 +rs17318933 +rs10489612 +rs855314 +rs2484245 +rs12408795 +rs12097652 +rs2765873 +rs12129709 +rs2201689 +rs1336472 +rs12143459 +rs2997091 +rs688630 +rs1566246 +rs2312591 +rs17129664 +rs787501 +rs4655768 +rs1367452 +rs1579514 +rs1367448 +rs1367444 +rs9436812 +rs1492062 +rs1492074 +rs4650044 +rs655938 +rs10518338 +rs1536261 +rs875727 +rs782268 +rs9425020 +rs11210343 +rs274604 +rs9661462 +rs10789400 +rs3753190 +rs277354 +rs4949673 +rs387831 +rs1436087 +rs13375961 +rs191827 +rs12030080 +rs2352038 +rs1937026 +rs12097617 +rs951507 +rs1030414 +rs12041774 +rs1146418 +rs1327609 +rs10157210 +rs1930272 +rs4907021 +rs680308 +rs2911571 +rs9659298 +rs709767 +rs233104 +rs1321686 +rs17421106 +rs12409961 +rs10747342 +rs1330864 +rs12094766 +rs2991701 +rs11801253 +rs12126965 +rs6428572 +rs4415546 +rs613176 +rs2478178 +rs1805113 +rs17131536 +rs6677523 +rs284202 +rs7549306 +rs7355067 +rs2249590 +rs4147851 +rs1889548 +rs4147822 +rs915012 +rs7533303 +rs965314 +rs1995802 +rs10783020 +rs7545712 +rs2811219 +rs12724493 +rs1854510 +rs12075686 +rs2484535 +rs6577219 +rs961566 +rs10493973 +rs4908211 +rs17127731 +rs6701091 +rs480255 +rs7543568 +rs4915125 +rs12066815 +rs6681988 +rs746603 +rs525007 +rs2494067 +rs4531312 +rs17020088 +rs1277213 +rs587727 +rs17035949 +rs943640 +rs7524737 +rs514341 +rs4838931 +rs7514102 +rs1416812 +rs10857833 +rs1282023 +rs1149185 +rs1282129 +rs3393 +rs1767282 +rs9429425 +rs17029987 +rs2995774 +rs2488778 +rs1216796 +rs1683253 +rs401666 +rs11589933 +rs1286201 +rs2856813 +rs17540656 +rs2334915 +rs3811006 +rs17035127 +rs4839061 +rs4839073 +rs10801929 +rs1555794 +rs1289667 +rs4659167 +rs10801937 +rs4261104 +rs838534 +rs3765953 +rs2282403 +rs647596 +rs12022413 +rs10494251 +rs10888382 +rs1752380 +rs7540530 +rs1332506 +rs7517755 +rs4845623 +rs925042 +rs6426905 +rs2306124 +rs4414033 +rs7532302 +rs4402117 +rs6334 +rs6675916 +rs11264737 +rs11264764 +rs1925034 +rs12088518 +rs12742463 +rs2276401 +rs2814771 +rs863027 +rs4443888 +rs3093077 +rs11265265 +rs11265269 +rs3820099 +rs7521729 +rs11809878 +rs4656258 +rs485618 +rs2501873 +rs1417580 +rs2490431 +rs6691548 +rs2490424 +rs347313 +rs423125 +rs449908 +rs464649 +rs17431968 +rs12134171 +rs951437 +rs3001080 +rs6700901 +rs10494395 +rs811435 +rs3945008 +rs1338626 +rs6426879 +rs10918063 +rs6663388 +rs10737508 +rs6662349 +rs10489745 +rs1337444 +rs3762365 +rs2349106 +rs4642869 +rs17460402 +rs4657543 +rs6427004 +rs10918488 +rs7516525 +rs11580495 +rs704852 +rs704853 +rs704859 +rs4657670 +rs12067995 +rs204264 +rs2268550 +rs7536740 +rs2143091 +rs1570334 +rs12048750 +rs1200100 +rs2051145 +rs12120605 +rs6427199 +rs12049148 +rs12563881 +rs7535322 +rs16863955 +rs12738952 +rs7519763 +rs12741782 +rs2071929 +rs1578624 +rs10912807 +rs859398 +rs859415 +rs12089079 +rs10913056 +rs640692 +rs10798473 +rs12021769 +rs9662701 +rs1923626 +rs842192 +rs12747656 +rs10753177 +rs11806102 +rs6683781 +rs502036 +rs3737062 +rs2282348 +rs6425668 +rs3856080 +rs695072 +rs12135968 +rs12038056 +rs7540658 +rs6694038 +rs1058177 +rs4047801 +rs3842897 +rs2500097 +rs10494568 +rs2182625 +rs10911494 +rs16823952 +rs11583193 +rs10798035 +rs3820185 +rs1474864 +rs2453727 +rs10798106 +rs1339082 +rs11802712 +rs10754136 +rs4255388 +rs1342561 +rs11578153 +rs6700152 +rs11800005 +rs2984921 +rs6661522 +rs17304238 +rs10801256 +rs642668 +rs10494719 +rs1408868 +rs3790370 +rs10922298 +rs2813164 +rs427790 +rs1359451 +rs17637275 +rs12725952 +rs10919946 +rs6427832 +rs10494819 +rs10920115 +rs12022389 +rs10920138 +rs2365299 +rs10800784 +rs11586342 +rs556903 +rs4915236 +rs545372 +rs633367 +rs1032524 +rs7513 +rs6656470 +rs6427933 +rs10158382 +rs4359077 +rs4072661 +rs3923371 +rs4950949 +rs762625 +rs2486949 +rs10800919 +rs6428006 +rs4951357 +rs2796433 +rs6593993 +rs4951309 +rs11240735 +rs2942133 +rs2815829 +rs2802841 +rs10751435 +rs913722 +rs10900490 +rs1999131 +rs10900493 +rs6661827 +rs12143020 +rs33985287 +rs2842754 +rs2796247 +rs1152832 +rs1318276 +rs2897064 +rs2163039 +rs696958 +rs7548249 +rs10863723 +rs4844730 +rs7368359 +rs6670957 +rs1183044 +rs7526722 +rs10746420 +rs7525534 +rs2236891 +rs3765851 +rs12121296 +rs11807403 +rs4245753 +rs9430044 +rs1890844 +rs9970961 +rs9430069 +rs1373293 +rs3795833 +rs4951426 +rs12087287 +rs6703980 +rs1284851 +rs11120070 +rs1699185 +rs10864043 +rs11120170 +rs12041173 +rs2359937 +rs6540817 +rs11120305 +rs3013445 +rs4129186 +rs12129366 +rs11120316 +rs4394613 +rs441318 +rs6687999 +rs1415181 +rs17025432 +rs4363405 +rs11120726 +rs301734 +rs4846466 +rs6687745 +rs2813703 +rs11572636 +rs11117706 +rs4846453 +rs3009947 +rs1932971 +rs2965012 +rs12039986 +rs12732806 +rs10863546 +rs12041182 +rs11806418 +rs12091463 +rs4240927 +rs3934724 +rs11590870 +rs3008598 +rs851178 +rs851170 +rs10495209 +rs7553931 +rs6685014 +rs1467143 +rs11588657 +rs7524430 +rs12729579 +rs2872243 +rs4074668 +rs1573059 +rs10916354 +rs10799489 +rs11585386 +rs2000163 +rs7513940 +rs551755 +rs1870362 +rs9435869 +rs10916508 +rs927204 +rs687266 +rs7515331 +rs6673349 +rs7538126 +rs1124110 +rs11122478 +rs1108707 +rs1317764 +rs3790955 +rs16854012 +rs1765780 +rs701158 +rs4596830 +rs11803212 +rs789645 +rs1970168 +rs1986615 +rs904068 +rs701232 +rs595191 +rs4506523 +rs12129782 +rs12058613 +rs2587536 +rs17589414 +rs10910522 +rs11580121 +rs4659946 +rs10159416 +rs7545788 +rs12566852 +rs17648708 +rs7556238 +rs12125972 +rs10925289 +rs1409052 +rs888438 +rs6429040 +rs789375 +rs10925747 +rs4659902 +rs10495435 +rs12119540 +rs17657156 +rs6690809 +rs10495449 +rs10926029 +rs4443876 +rs6429195 +rs11590081 +rs10495470 +rs11578184 +rs9428478 +rs10465630 +rs7540147 +rs11578889 +rs6429215 +rs187783 +rs523361 +rs11802956 +rs11808201 +rs613032 +rs12133073 +rs2526697 +rs4658565 +rs7516206 +rs316835 +rs2796077 +rs2810011 +rs2184185 +rs10926828 +rs2998678 +rs1000543 +rs4658613 +rs10803181 +rs678004 +rs12088062 +rs10927330 +rs6672147 +rs12039117 +rs1173851 +rs1093937 +rs1771522 +rs4658792 +rs4654186 +rs10924772 +rs3124089 +rs7542425 +rs1144815 +rs11587369 +rs11688330 +rs10183412 +rs7598261 +rs4971463 +rs4927602 +rs2298873 +rs4927594 +rs4853946 +rs17247253 +rs4853800 +rs10202240 +rs1470738 +rs1993081 +rs1451197 +rs1667060 +rs1729903 +rs2031028 +rs1078821 +rs7592700 +rs10197283 +rs7563964 +rs11886534 +rs11903032 +rs2034730 +rs4850016 +rs1437701 +rs1983365 +rs2602629 +rs6542644 +rs6422704 +rs11677035 +rs792071 +rs2163025 +rs11694877 +rs7559948 +rs4349325 +rs7424127 +rs10519722 +rs6712182 +rs10190662 +rs4669100 +rs905968 +rs1077583 +rs4669122 +rs7562418 +rs732078 +rs6431885 +rs11682611 +rs1861506 +rs40996 +rs1981456 +rs11674752 +rs4669265 +rs409169 +rs1532791 +rs168293 +rs4669318 +rs3927971 +rs17722392 +rs907165 +rs10200632 +rs4669453 +rs871820 +rs7559852 +rs6708858 +rs1469541 +rs4233874 +rs11680378 +rs6741290 +rs759341 +rs4669564 +rs11677361 +rs1974676 +rs2430424 +rs1734389 +rs1734395 +rs1734464 +rs1997523 +rs7564899 +rs13019468 +rs7584842 +rs12612207 +rs2581053 +rs1530145 +rs10495589 +rs1971516 +rs10197467 +rs12992291 +rs7563729 +rs16858854 +rs4377309 +rs6432315 +rs10514648 +rs659599 +rs1469217 +rs2380457 +rs7583428 +rs4603735 +rs4669964 +rs360468 +rs12476448 +rs2015245 +rs13427628 +rs6716200 +rs6706165 +rs2380680 +rs2380708 +rs6716344 +rs1365966 +rs10194143 +rs1567965 +rs340724 +rs2333979 +rs12615806 +rs1515968 +rs6531056 +rs1870822 +rs4381790 +rs2272519 +rs4240223 +rs4233762 +rs12105891 +rs851066 +rs1427547 +rs17686199 +rs10184780 +rs10495703 +rs1032075 +rs13006062 +rs1013363 +rs746776 +rs653347 +rs6709100 +rs1002755 +rs693 +rs219556 +rs1562900 +rs2176472 +rs1607267 +rs12618688 +rs1374460 +rs10495737 +rs6711889 +rs2577720 +rs748860 +rs2879609 +rs1982200 +rs4665765 +rs730072 +rs6721434 +rs9309386 +rs499728 +rs11126114 +rs12470327 +rs6547829 +rs11902329 +rs1581035 +rs4665470 +rs906868 +rs7578949 +rs2076932 +rs472161 +rs1983383 +rs6709502 +rs7562766 +rs1559497 +rs13404171 +rs1540926 +rs10202440 +rs17012963 +rs12471341 +rs10204349 +rs1220211 +rs12712470 +rs2372441 +rs848596 +rs4670600 +rs2373001 +rs1024816 +rs6544093 +rs10172526 +rs6715108 +rs12616929 +rs7590255 +rs7557493 +rs1992881 +rs6544166 +rs17024091 +rs12052585 +rs7579930 +rs9309061 +rs207613 +rs10187485 +rs6756874 +rs4305317 +rs11898187 +rs2302346 +rs10495897 +rs1561505 +rs11686640 +rs10175942 +rs6749927 +rs1991739 +rs2917768 +rs1447107 +rs6723092 +rs12464646 +rs11896942 +rs2342702 +rs1862890 +rs12712941 +rs7582320 +rs4074080 +rs935661 +rs4953292 +rs1867786 +rs4952818 +rs6720535 +rs2881586 +rs12470974 +rs904162 +rs9789479 +rs1126497 +rs10182660 +rs10165893 +rs4325805 +rs6755901 +rs2301267 +rs4971718 +rs2176603 +rs1518823 +rs6753833 +rs601010 +rs7581256 +rs6733430 +rs2193225 +rs7594170 +rs735315 +rs6717556 +rs7574971 +rs11892271 +rs2141844 +rs7586951 +rs12995294 +rs843748 +rs6705079 +rs12999197 +rs2165006 +rs10168457 +rs4672084 +rs929689 +rs17047517 +rs6545554 +rs10191130 +rs6718973 +rs1116357 +rs11125728 +rs11693731 +rs6758100 +rs11687358 +rs7590342 +rs10168190 +rs6545760 +rs1861151 +rs979687 +rs6729815 +rs2556378 +rs6545832 +rs778139 +rs13412212 +rs6545977 +rs329489 +rs10496107 +rs1529102 +rs11126005 +rs6754629 +rs7576393 +rs3845821 +rs2631669 +rs4671716 +rs2951282 +rs6722685 +rs6709958 +rs2081397 +rs4671784 +rs2128769 +rs6760732 +rs2541022 +rs2116051 +rs6715551 +rs1430795 +rs4671873 +rs17034987 +rs6717329 +rs7558602 +rs6546442 +rs10191936 +rs12987661 +rs2169843 +rs1458868 +rs750355 +rs755409 +rs10188058 +rs4853019 +rs205621 +rs11678377 +rs3771781 +rs6546952 +rs12328696 +rs2110933 +rs6547014 +rs7419897 +rs6708139 +rs2860732 +rs1996634 +rs10203812 +rs7561233 +rs370099 +rs4853352 +rs9309543 +rs6710298 +rs6757830 +rs11892349 +rs3755095 +rs747920 +rs598453 +rs318369 +rs1930 +rs2131255 +rs1598759 +rs2862492 +rs4852646 +rs1430726 +rs10469974 +rs1486837 +rs2923861 +rs1882271 +rs6754757 +rs4247303 +rs1135604 +rs1356621 +rs10184538 +rs10445963 +rs2113608 +rs4972052 +rs7058 +rs11683207 +rs2309389 +rs4851130 +rs1028144 +rs12615689 +rs1376444 +rs6716842 +rs3917335 +rs6709515 +rs1482751 +rs10191917 +rs6761396 +rs1033302 +rs13404931 +rs4851079 +rs17031627 +rs2163350 +rs6543342 +rs2098836 +rs4455150 +rs12463880 +rs1013014 +rs2907907 +rs6542725 +rs6542736 +rs4676169 +rs17770672 +rs4676040 +rs260642 +rs1471074 +rs6760953 +rs6542832 +rs11123551 +rs954521 +rs10211073 +rs7580446 +rs6739740 +rs12711768 +rs6756587 +rs17452616 +rs13012337 +rs11673900 +rs1965130 +rs2008776 +rs4848526 +rs3806496 +rs3731612 +rs729735 +rs6759589 +rs6707849 +rs4383344 +rs17659633 +rs1446305 +rs7589138 +rs7592778 +rs6758414 +rs1568836 +rs4849909 +rs2713241 +rs4488664 +rs4848692 +rs1554808 +rs1401561 +rs1343822 +rs1400064 +rs959320 +rs11123030 +rs17676225 +rs6541961 +rs724655 +rs1435578 +rs437866 +rs6431134 +rs10194375 +rs11690893 +rs2011526 +rs841080 +rs1595400 +rs4662980 +rs1574605 +rs1134119 +rs1542604 +rs4850101 +rs2313693 +rs7584315 +rs10928155 +rs4063769 +rs4145337 +rs4547577 +rs1037173 +rs17817190 +rs1446741 +rs1867896 +rs4603824 +rs10208875 +rs1879019 +rs11900787 +rs2593708 +rs535900 +rs13420371 +rs4245843 +rs2465095 +rs13413874 +rs1357404 +rs7576870 +rs2950615 +rs12992137 +rs1882638 +rs13013197 +rs10166697 +rs4954702 +rs6721397 +rs11898334 +rs1997287 +rs12619445 +rs10206424 +rs1515263 +rs6708653 +rs4662539 +rs10183992 +rs10490073 +rs1405214 +rs330650 +rs4667375 +rs860992 +rs1528430 +rs6734792 +rs9287983 +rs10497105 +rs3811567 +rs1347395 +rs1369256 +rs6745326 +rs3910524 +rs10183136 +rs12104610 +rs2053671 +rs11679712 +rs17238525 +rs12694551 +rs4664818 +rs7577045 +rs4664844 +rs13383985 +rs12479151 +rs1357183 +rs7559893 +rs9789420 +rs16844045 +rs1975999 +rs197273 +rs12692642 +rs4500960 +rs6715506 +rs3849346 +rs13389923 +rs1394242 +rs6712770 +rs4667819 +rs1877872 +rs4393770 +rs1431900 +rs13020412 +rs11884717 +rs1517342 +rs1020603 +rs518337 +rs477224 +rs3770582 +rs2302693 +rs2389557 +rs12991583 +rs4667620 +rs6738892 +rs16858186 +rs12993953 +rs11693682 +rs2883782 +rs7574074 +rs6745725 +rs1399956 +rs7566285 +rs12471128 +rs4283388 +rs3108779 +rs2113807 +rs868294 +rs1865236 +rs1020013 +rs4972588 +rs7421996 +rs1024125 +rs7591669 +rs10172858 +rs12620150 +rs9287980 +rs7565836 +rs13017316 +rs1374369 +rs12693085 +rs6433564 +rs6736786 +rs1026027 +rs2069172 +rs6749901 +rs1554406 +rs7603168 +rs3770011 +rs2573088 +rs10497537 +rs6433781 +rs10930870 +rs1400825 +rs6433791 +rs12473469 +rs11888692 +rs3845718 +rs1477502 +rs10048799 +rs10192997 +rs1972947 +rs1992179 +rs2368443 +rs1454053 +rs719736 +rs12693377 +rs263767 +rs17403192 +rs2350195 +rs11886097 +rs1263117 +rs7594501 +rs16833762 +rs3923556 +rs2356758 +rs2356955 +rs16831761 +rs1026629 +rs6746308 +rs6761022 +rs1526070 +rs295130 +rs3769433 +rs2540051 +rs2293554 +rs16837959 +rs4675242 +rs1477031 +rs6751210 +rs3933629 +rs13003194 +rs7607984 +rs6714929 +rs9653325 +rs6435232 +rs12613305 +rs4675467 +rs6733159 +rs1468997 +rs849266 +rs4675528 +rs1877341 +rs759455 +rs7562683 +rs12694049 +rs4271750 +rs4673360 +rs1001110 +rs2042135 +rs11903403 +rs10932176 +rs2551968 +rs10932236 +rs896637 +rs7572263 +rs10497902 +rs6761179 +rs6714124 +rs12464940 +rs186471 +rs17335169 +rs1521658 +rs1482378 +rs7580519 +rs4672667 +rs10167348 +rs7573232 +rs11677793 +rs6719800 +rs11675561 +rs6435818 +rs10932543 +rs4674024 +rs10167212 +rs6728666 +rs4672798 +rs12624027 +rs1525610 +rs12463731 +rs7590938 +rs2067041 +rs1882421 +rs2888456 +rs12466929 +rs10932707 +rs12620884 +rs3747 +rs1035671 +rs13022785 +rs3791911 +rs13409846 +rs6745037 +rs9646859 +rs7588807 +rs678134 +rs10498067 +rs1007684 +rs995842 +rs13001386 +rs4234035 +rs1796432 +rs10932875 +rs1517443 +rs10084181 +rs1955117 +rs1991736 +rs6737417 +rs1519483 +rs348980 +rs6728176 +rs7600206 +rs6436310 +rs10168232 +rs11676701 +rs11676002 +rs4674677 +rs7589928 +rs6436364 +rs11899732 +rs1517628 +rs11675944 +rs686700 +rs631922 +rs6721089 +rs2037755 +rs6714466 +rs6743368 +rs1993323 +rs13413808 +rs6436602 +rs2707543 +rs2894608 +rs1922531 +rs2396453 +rs4673194 +rs11688520 +rs11889798 +rs12469987 +rs4284828 +rs11694155 +rs7570716 +rs13424461 +rs2396595 +rs12619625 +rs31276 +rs17676036 +rs10197959 +rs6436908 +rs6710287 +rs7590429 +rs9678342 +rs13418392 +rs4972964 +rs10933363 +rs753855 +rs1729077 +rs1865375 +rs1850593 +rs6431586 +rs4047189 +rs1597944 +rs741160 +rs12473889 +rs7605850 +rs4663998 +rs676546 +rs11684379 +rs6431234 +rs6733065 +rs1714945 +rs10803620 +rs7576760 +rs884062 +rs2014366 +rs4663517 +rs722161 +rs11684741 +rs1367882 +rs12475206 +rs12471567 +rs3768926 +rs1986988 +rs11690453 +rs13431876 +rs6758509 +rs6746771 +rs4663269 +rs2880132 +rs9287631 +rs4078406 +rs3935696 +rs6704807 +rs1399629 +rs2411843 +rs1796449 +rs10180205 +rs12612406 +rs1437731 +rs12695007 +rs903760 +rs3811624 +rs7607996 +rs11900363 +rs4538195 +rs10933514 +rs11706690 +rs17032419 +rs9878022 +rs4481145 +rs1391916 +rs4684882 +rs9875177 +rs7626838 +rs443052 +rs1914006 +rs9864375 +rs9860556 +rs2729277 +rs2727925 +rs13059227 +rs1827451 +rs7649181 +rs2046037 +rs17584516 +rs11712375 +rs10510242 +rs7649378 +rs163577 +rs2540078 +rs1153459 +rs1278150 +rs12633281 +rs4465931 +rs723168 +rs6776819 +rs795727 +rs6804671 +rs4684427 +rs2029665 +rs4685829 +rs11708908 +rs6764243 +rs11925620 +rs1995205 +rs398708 +rs10510302 +rs17042585 +rs6762892 +rs1914413 +rs7609589 +rs4686076 +rs10510341 +rs1400286 +rs421802 +rs9311966 +rs7623046 +rs161885 +rs6779176 +rs13061566 +rs10510390 +rs10510393 +rs873227 +rs11131140 +rs3774210 +rs2172557 +rs7634632 +rs237893 +rs7615763 +rs4389469 +rs1513315 +rs1162326 +rs9825026 +rs422552 +rs938116 +rs9861610 +rs12631463 +rs9818611 +rs2633789 +rs6797473 +rs13323090 +rs34892 +rs4684731 +rs4610207 +rs2930149 +rs2928078 +rs9879137 +rs11719708 +rs6763039 +rs9871522 +rs17661797 +rs2133060 +rs51578 +rs305491 +rs11712537 +rs12487324 +rs165435 +rs7610284 +rs4428160 +rs1871856 +rs2128163 +rs9851340 +rs10446439 +rs7647134 +rs748098 +rs1062540 +rs2341985 +rs11709154 +rs12495033 +rs829182 +rs1549983 +rs6442511 +rs3852037 +rs13075694 +rs10510444 +rs6442577 +rs4685337 +rs6774181 +rs7620376 +rs9837205 +rs714141 +rs336629 +rs11927855 +rs11717739 +rs7628760 +rs1995722 +rs6801666 +rs1403651 +rs7630274 +rs17809619 +rs1498994 +rs6763061 +rs2661410 +rs341844 +rs424842 +rs6800260 +rs161196 +rs4440141 +rs11129021 +rs1679217 +rs259540 +rs9834074 +rs1817442 +rs10513638 +rs1494220 +rs1494227 +rs10510527 +rs6799349 +rs1870480 +rs512541 +rs4072410 +rs7651576 +rs3845923 +rs6791130 +rs7617186 +rs1868575 +rs982953 +rs12631757 +rs4858125 +rs6780762 +rs6550930 +rs7613553 +rs6550976 +rs12631063 +rs2033447 +rs17526839 +rs12635379 +rs1160717 +rs6767457 +rs1488248 +rs12635000 +rs11129290 +rs2370985 +rs7649139 +rs6551238 +rs1156909 +rs9310864 +rs2199411 +rs9883412 +rs6796246 +rs1020041 +rs4552314 +rs6777437 +rs4574243 +rs35911 +rs6783423 +rs10446421 +rs4680877 +rs2371997 +rs6549980 +rs6783860 +rs11917602 +rs1567025 +rs294314 +rs4955188 +rs2290531 +rs4438696 +rs4478116 +rs4334675 +rs2880339 +rs4440157 +rs9837923 +rs749948 +rs4364205 +rs614004 +rs9810960 +rs3888882 +rs6550169 +rs1133253 +rs4455284 +rs11916425 +rs4588312 +rs9809050 +rs1598529 +rs870445 +rs7620657 +rs7624701 +rs4075977 +rs6785634 +rs11129771 +rs9869652 +rs2236630 +rs1384006 +rs4679028 +rs503327 +rs12632771 +rs7619161 +rs6807519 +rs4276160 +rs7627972 +rs26352 +rs938922 +rs4432612 +rs6800118 +rs4234441 +rs7626631 diff --git a/bin/markers.txt.bed b/bin/markers.txt.bed new file mode 100644 index 0000000..24592ee --- /dev/null +++ b/bin/markers.txt.bed @@ -0,0 +1,1790 @@ +chrom chromStart chromEnd name +chr1 833067 833068 rs12562034 +chr1 1130648 1130649 rs12145826 +chr1 1171092 1171093 rs4970420 +chr1 1551453 1551454 rs3128342 +chr1 2165198 2165199 rs3052 +chr1 2289209 2289210 rs2017143 +chr1 2378753 2378754 rs903901 +chr1 2407634 2407635 rs2494428 +chr1 2428541 2428542 rs12022929 +chr1 2881290 2881291 rs10797342 +chr1 3011059 3011060 rs6685625 +chr1 3058287 3058288 rs2376821 +chr1 3345117 3345118 rs4415513 +chr1 3419635 3419636 rs1984069 +chr1 3488731 3488732 rs4648505 +chr1 3540027 3540028 rs4648524 +chr1 3594730 3594731 rs7544357 +chr1 3627781 3627782 rs4276857 +chr1 3656209 3656210 rs2181484 +chr1 3829359 3829360 rs2275831 +chr1 3883677 3883678 rs3205087 +chr1 3949895 3949896 rs6661168 +chr1 4312931 4312932 rs1353341 +chr1 4319626 4319627 rs12408012 +chr1 4474260 4474261 rs10047182 +chr1 4481329 4481330 rs11799990 +chr1 4739139 4739140 rs3753702 +chr1 4825625 4825626 rs10915621 +chr1 5018288 5018289 rs10915315 +chr1 5176049 5176050 rs6698702 +chr1 5282971 5282972 rs604664 +chr1 5431440 5431441 rs7415936 +chr1 5489464 5489465 rs11260698 +chr1 5581521 5581522 rs1775421 +chr1 5624240 5624241 rs945322 +chr1 5840734 5840735 rs1698976 +chr1 5865740 5865741 rs489933 +chr1 6460251 6460252 rs3138158 +chr1 6918561 6918562 rs12751613 +chr1 6931864 6931865 rs6577395 +chr1 7264407 7264408 rs6577430 +chr1 7282045 7282046 rs12409413 +chr1 7332533 7332534 rs2301462 +chr1 7374010 7374011 rs845217 +chr1 7409190 7409191 rs10864301 +chr1 7520708 7520709 rs1618346 +chr1 7732350 7732351 rs2301488 +chr1 7853369 7853370 rs228648 +chr1 8127150 8127151 rs4908736 +chr1 8135165 8135166 rs7529511 +chr1 8140629 8140630 rs6701300 +chr1 8923708 8923709 rs11805233 +chr1 9080018 9080019 rs12726360 +chr1 9398733 9398734 rs6688312 +chr1 10197108 10197109 rs6691645 +chr1 10697141 10697142 rs4845948 +chr1 10702374 10702375 rs7514751 +chr1 10772264 10772265 rs205472 +chr1 10848354 10848355 rs1292666 +chr1 10887522 10887523 rs4845960 +chr1 10940218 10940219 rs12755921 +chr1 11395969 11395970 rs12058244 +chr1 11662630 11662631 rs3125815 +chr1 11712282 11712283 rs2336034 +chr1 11714898 11714899 rs9430631 +chr1 11737128 11737129 rs12095517 +chr1 11857282 11857283 rs198388 +chr1 11999354 11999355 rs2295281 +chr1 12108465 12108466 rs11569864 +chr1 12204297 12204298 rs235219 +chr1 12448886 12448887 rs475983 +chr1 12603768 12603769 rs4846127 +chr1 12703778 12703779 rs10779772 +chr1 13626368 13626369 rs7515525 +chr1 13834258 13834259 rs982510 +chr1 13901994 13901995 rs1203709 +chr1 14170291 14170292 rs12568548 +chr1 14399552 14399553 rs943918 +chr1 14549535 14549536 rs4385705 +chr1 14575755 14575756 rs7527439 +chr1 14840506 14840507 rs11585327 +chr1 14856812 14856813 rs804129 +chr1 14862802 14862803 rs3845596 +chr1 16068651 16068652 rs10927902 +chr1 17582916 17582917 rs12756041 +chr1 17853890 17853891 rs708096 +chr1 18156634 18156635 rs16861648 +chr1 18694878 18694879 rs585075 +chr1 18748485 18748486 rs12121503 +chr1 19549530 19549531 rs4508039 +chr1 19655297 19655298 rs2294630 +chr1 19710396 19710397 rs4912019 +chr1 19783942 19783943 rs12140071 +chr1 19831747 19831748 rs4509550 +chr1 19922215 19922216 rs1108974 +chr1 20138397 20138398 rs631134 +chr1 20174948 20174949 rs10916718 +chr1 20355836 20355837 rs230178 +chr1 20448856 20448857 rs11799849 +chr1 21305976 21305977 rs3026845 +chr1 21322121 21322122 rs213022 +chr1 21572997 21572998 rs1780320 +chr1 21857245 21857246 rs2305562 +chr1 21938799 21938800 rs10917067 +chr1 22035351 22035352 rs2473277 +chr1 22537499 22537500 rs12130508 +chr1 22775194 22775195 rs1561624 +chr1 23531824 23531825 rs3218121 +chr1 23553716 23553717 rs909534 +chr1 23577854 23577855 rs10917395 +chr1 23667710 23667711 rs2902663 +chr1 24062544 24062545 rs4648930 +chr1 24595637 24595638 rs10903095 +chr1 25181699 25181700 rs6600267 +chr1 25566388 25566389 rs3924486 +chr1 25638686 25638687 rs2982304 +chr1 26121247 26121248 rs1981135 +chr1 26387713 26387714 rs11247945 +chr1 26476056 26476057 rs12741800 +chr1 26532260 26532261 rs7555931 +chr1 29660654 29660655 rs199613 +chr1 30325588 30325589 rs7528451 +chr1 30711370 30711371 rs1188394 +chr1 30788189 30788190 rs4949302 +chr1 30842554 30842555 rs4949315 +chr1 31660468 31660469 rs11807560 +chr1 31836506 31836507 rs11578323 +chr1 31944880 31944881 rs648718 +chr1 32596952 32596953 rs6678903 +chr1 33406991 33406992 rs6661037 +chr1 33709750 33709751 rs16835734 +chr1 33783728 33783729 rs717030 +chr1 33883269 33883270 rs1321630 +chr1 33922262 33922263 rs6697504 +chr1 33958791 33958792 rs549048 +chr1 34187676 34187677 rs2994598 +chr1 34261977 34261978 rs771401 +chr1 34421052 34421053 rs2294190 +chr1 34836024 34836025 rs6689092 +chr1 36520916 36520917 rs7530283 +chr1 36574772 36574773 rs7540413 +chr1 37068653 37068654 rs6702349 +chr1 37735698 37735699 rs631432 +chr1 37805822 37805823 rs3795494 +chr1 38340256 38340257 rs11210569 +chr1 38418856 38418857 rs4290027 +chr1 38452137 38452138 rs882000 +chr1 38496462 38496463 rs1932364 +chr1 38575994 38575995 rs4970603 +chr1 39092015 39092016 rs4660401 +chr1 39659652 39659653 rs17264901 +chr1 39734181 39734182 rs704787 +chr1 39893053 39893054 rs11811998 +chr1 39899130 39899131 rs3134613 +chr1 40794495 40794496 rs2769258 +chr1 40858209 40858210 rs913382 +chr1 41169283 41169284 rs11802778 +chr1 41376677 41376678 rs4660192 +chr1 41413315 41413316 rs2801962 +chr1 41438879 41438880 rs12065902 +chr1 41446703 41446704 rs11584933 +chr1 41453834 41453835 rs10890022 +chr1 42065874 42065875 rs6687333 +chr1 42340519 42340520 rs913426 +chr1 42941028 42941029 rs12130264 +chr1 42992786 42992787 rs12404679 +chr1 43240289 43240290 rs12135483 +chr1 43872902 43872903 rs2906457 +chr1 44299973 44299974 rs12058010 +chr1 44423836 44423837 rs1340647 +chr1 44427658 44427659 rs11210998 +chr1 44611256 44611257 rs11582764 +chr1 45567301 45567302 rs2088102 +chr1 46406313 46406314 rs324419 +chr1 47302241 47302242 rs3125630 +chr1 47488084 47488085 rs11578572 +chr1 47698949 47698950 rs4926966 +chr1 47979239 47979240 rs2065606 +chr1 48044266 48044267 rs6664402 +chr1 48509260 48509261 rs1539530 +chr1 48564203 48564204 rs2803269 +chr1 48577756 48577757 rs2803274 +chr1 48589207 48589208 rs923028 +chr1 48610765 48610766 rs320020 +chr1 48610983 48610984 rs320021 +chr1 48654847 48654848 rs973886 +chr1 52629313 52629314 rs2050695 +chr1 53349864 53349865 rs4926976 +chr1 53404793 53404794 rs4926992 +chr1 53545518 53545519 rs2986655 +chr1 53563968 53563969 rs4927007 +chr1 53756897 53756898 rs1183394 +chr1 54137303 54137304 rs12078845 +chr1 54289417 54289418 rs6697414 +chr1 54531339 54531340 rs11584093 +chr1 54547207 54547208 rs11589310 +chr1 54653470 54653471 rs11206407 +chr1 54702410 54702411 rs644955 +chr1 54739525 54739526 rs7542637 +chr1 54904500 54904501 rs12081312 +chr1 54914265 54914266 rs619895 +chr1 54918757 54918758 rs11206464 +chr1 55014537 55014538 rs2182832 +chr1 55320100 55320101 rs17111909 +chr1 55965068 55965069 rs2404389 +chr1 56291234 56291235 rs2793673 +chr1 56554842 56554843 rs11810204 +chr1 56803847 56803848 rs6662617 +chr1 56821182 56821183 rs6672416 +chr1 56853428 56853429 rs669444 +chr1 56913965 56913966 rs1754538 +chr1 57121859 57121860 rs12029757 +chr1 57337676 57337677 rs11207011 +chr1 57500855 57500856 rs1341320 +chr1 57555533 57555534 rs6687355 +chr1 57736624 57736625 rs1886139 +chr1 57870385 57870386 rs2038379 +chr1 58094437 58094438 rs4912301 +chr1 58399726 58399727 rs338919 +chr1 58840323 58840324 rs3015321 +chr1 59104722 59104723 rs3010326 +chr1 59705532 59705533 rs4619004 +chr1 59744976 59744977 rs1004772 +chr1 59990299 59990300 rs6587875 +chr1 60165210 60165211 rs922355 +chr1 60351687 60351688 rs11585396 +chr1 60841604 60841605 rs6674001 +chr1 60870856 60870857 rs10493298 +chr1 60890847 60890848 rs12122228 +chr1 60894506 60894507 rs1002005 +chr1 60910555 60910556 rs2121598 +chr1 60952056 60952057 rs1572312 +chr1 61016271 61016272 rs924273 +chr1 61287282 61287283 rs2152093 +chr1 61338216 61338217 rs7521242 +chr1 61452371 61452372 rs2499540 +chr1 61511624 61511625 rs2499516 +chr1 61538273 61538274 rs7541526 +chr1 61747149 61747150 rs12408292 +chr1 61772740 61772741 rs1892022 +chr1 61865902 61865903 rs6587948 +chr1 62128920 62128921 rs2476194 +chr1 62308797 62308798 rs7512821 +chr1 62339047 62339048 rs4915827 +chr1 62405411 62405412 rs12747317 +chr1 62957238 62957239 rs1191758 +chr1 63151894 63151895 rs17318933 +chr1 63629108 63629109 rs10489612 +chr1 63629439 63629440 rs855314 +chr1 64467504 64467505 rs2484245 +chr1 64550997 64550998 rs12408795 +chr1 64620258 64620259 rs12097652 +chr1 64809387 64809388 rs2765873 +chr1 64991139 64991140 rs12129709 +chr1 65064430 65064431 rs2201689 +chr1 65230246 65230247 rs1336472 +chr1 65762795 65762796 rs12143459 +chr1 65933951 65933952 rs2997091 +chr1 66757282 66757283 rs688630 +chr1 66779591 66779592 rs1566246 +chr1 66802958 66802959 rs2312591 +chr1 67117614 67117615 rs17129664 +chr1 67607243 67607244 rs787501 +chr1 68009957 68009958 rs4655768 +chr1 68120329 68120330 rs1367452 +chr1 68152553 68152554 rs1579514 +chr1 68168240 68168241 rs1367448 +chr1 68173296 68173297 rs1367444 +chr1 68355855 68355856 rs9436812 +chr1 68801505 68801506 rs1492062 +chr1 68824947 68824948 rs1492074 +chr1 70393713 70393714 rs4650044 +chr1 70500769 70500770 rs655938 +chr1 70516063 70516064 rs10518338 +chr1 70872713 70872714 rs1536261 +chr1 70908054 70908055 rs875727 +chr1 72529714 72529715 rs782268 +chr1 73701597 73701598 rs9425020 +chr1 73755112 73755113 rs11210343 +chr1 74491640 74491641 rs274604 +chr1 74585737 74585738 rs9661462 +chr1 74674614 74674615 rs10789400 +chr1 74709577 74709578 rs3753190 +chr1 74825388 74825389 rs277354 +chr1 75575324 75575325 rs4949673 +chr1 76509333 76509334 rs387831 +chr1 76509751 76509752 rs1436087 +chr1 76845267 76845268 rs13375961 +chr1 77082832 77082833 rs191827 +chr1 77732636 77732637 rs12030080 +chr1 78345550 78345551 rs2352038 +chr1 78757801 78757802 rs1937026 +chr1 79105931 79105932 rs12097617 +chr1 80876208 80876209 rs951507 +chr1 81002756 81002757 rs1030414 +chr1 81017259 81017260 rs12041774 +chr1 81137751 81137752 rs1146418 +chr1 81289758 81289759 rs1327609 +chr1 81544760 81544761 rs10157210 +chr1 83026226 83026227 rs1930272 +chr1 83391685 83391686 rs4907021 +chr1 84281161 84281162 rs680308 +chr1 84691137 84691138 rs2911571 +chr1 84769715 84769716 rs9659298 +chr1 85096270 85096271 rs709767 +chr1 85309502 85309503 rs233104 +chr1 86508431 86508432 rs1321686 +chr1 87214554 87214555 rs17421106 +chr1 87230414 87230415 rs12409961 +chr1 87246208 87246209 rs10747342 +chr1 87257281 87257282 rs1330864 +chr1 87370871 87370872 rs12094766 +chr1 87991904 87991905 rs2991701 +chr1 88001983 88001984 rs11801253 +chr1 88138110 88138111 rs12126965 +chr1 90135562 90135563 rs6428572 +chr1 90192492 90192493 rs4415546 +chr1 91161540 91161541 rs613176 +chr1 91646009 91646010 rs2478178 +chr1 91712380 91712381 rs1805113 +chr1 91715920 91715921 rs17131536 +chr1 91736909 91736910 rs6677523 +chr1 91775475 91775476 rs284202 +chr1 91930556 91930557 rs7549306 +chr1 92037573 92037574 rs7355067 +chr1 93057525 93057526 rs2249590 +chr1 94013227 94013228 rs4147851 +chr1 94037640 94037641 rs1889548 +chr1 94095932 94095933 rs4147822 +chr1 94831817 94831818 rs915012 +chr1 94997414 94997415 rs7533303 +chr1 95168165 95168166 rs965314 +chr1 95674463 95674464 rs1995802 +chr1 95793368 95793369 rs10783020 +chr1 97484477 97484478 rs7545712 +chr1 97561244 97561245 rs2811219 +chr1 98223835 98223836 rs12724493 +chr1 98924687 98924688 rs1854510 +chr1 99142738 99142739 rs12075686 +chr1 100642191 100642192 rs2484535 +chr1 100950150 100950151 rs6577219 +chr1 101544210 101544211 rs961566 +chr1 101830722 101830723 rs10493973 +chr1 102031019 102031020 rs4908211 +chr1 103295906 103295907 rs17127731 +chr1 104342546 104342547 rs6701091 +chr1 106034532 106034533 rs480255 +chr1 106249335 106249336 rs7543568 +chr1 106432425 106432426 rs4915125 +chr1 107340420 107340421 rs12066815 +chr1 107387742 107387743 rs6681988 +chr1 107388537 107388538 rs746603 +chr1 107531682 107531683 rs525007 +chr1 107702992 107702993 rs2494067 +chr1 107753885 107753886 rs4531312 +chr1 107809189 107809190 rs17020088 +chr1 108816879 108816880 rs1277213 +chr1 109142650 109142651 rs587727 +chr1 109278296 109278297 rs17035949 +chr1 109764817 109764818 rs943640 +chr1 109790193 109790194 rs7524737 +chr1 110110257 110110258 rs514341 +chr1 110158448 110158449 rs4838931 +chr1 110456231 110456232 rs7514102 +chr1 110574129 110574130 rs1416812 +chr1 110878804 110878805 rs10857833 +chr1 110917224 110917225 rs1282023 +chr1 111003908 111003909 rs1149185 +chr1 111080116 111080117 rs1282129 +chr1 111499526 111499527 rs3393 +chr1 111814478 111814479 rs1767282 +chr1 111937953 111937954 rs9429425 +chr1 112298378 112298379 rs17029987 +chr1 112330252 112330253 rs2995774 +chr1 112369220 112369221 rs2488778 +chr1 113121817 113121818 rs1216796 +chr1 114095954 114095955 rs1683253 +chr1 114200063 114200064 rs401666 +chr1 114264936 114264937 rs11589933 +chr1 115112244 115112245 rs1286201 +chr1 115295297 115295298 rs2856813 +chr1 115337510 115337511 rs17540656 +chr1 115458058 115458059 rs2334915 +chr1 115697590 115697591 rs3811006 +chr1 116025410 116025411 rs17035127 +chr1 116265554 116265555 rs4839061 +chr1 116490160 116490161 rs4839073 +chr1 117051841 117051842 rs10801929 +chr1 117059454 117059455 rs1555794 +chr1 117095011 117095012 rs1289667 +chr1 117178922 117178923 rs4659167 +chr1 117203588 117203589 rs10801937 +chr1 117576911 117576912 rs4261104 +chr1 119351304 119351305 rs838534 +chr1 119374629 119374630 rs3765953 +chr1 119802276 119802277 rs2282403 +chr1 147063849 147063850 rs647596 +chr1 147525420 147525421 rs12022413 +chr1 147552119 147552120 rs10494251 +chr1 150558531 150558532 rs10888382 +chr1 151375269 151375270 rs1752380 +chr1 151818381 151818382 rs7540530 +chr1 152751576 152751577 rs1332506 +chr1 152823972 152823973 rs7517755 +chr1 154443300 154443301 rs4845623 +chr1 154732118 154732119 rs925042 +chr1 154734143 154734144 rs6426905 +chr1 155087374 155087375 rs2306124 +chr1 156437060 156437061 rs4414033 +chr1 156689975 156689976 rs7532302 +chr1 156693485 156693486 rs4402117 +chr1 156876440 156876441 rs6334 +chr1 157181732 157181733 rs6675916 +chr1 157472326 157472327 rs11264737 +chr1 157568821 157568822 rs11264764 +chr1 158012788 158012789 rs1925034 +chr1 158103463 158103464 rs12088518 +chr1 158360451 158360452 rs12742463 +chr1 158654988 158654989 rs2276401 +chr1 159042447 159042448 rs2814771 +chr1 159134197 159134198 rs863027 +chr1 159351884 159351885 rs4443888 +chr1 159709845 159709846 rs3093077 +chr1 159743765 159743766 rs11265265 +chr1 159758336 159758337 rs11265269 +chr1 159779397 159779398 rs3820099 +chr1 159875028 159875029 rs7521729 +chr1 160004949 160004950 rs11809878 +chr1 160438772 160438773 rs4656258 +chr1 160830689 160830690 rs485618 +chr1 161234747 161234748 rs2501873 +chr1 161759958 161759959 rs1417580 +chr1 161971428 161971429 rs2490431 +chr1 161997496 161997497 rs6691548 +chr1 162004185 162004186 rs2490424 +chr1 162334485 162334486 rs347313 +chr1 162339488 162339489 rs423125 +chr1 162354654 162354655 rs449908 +chr1 162486529 162486530 rs464649 +chr1 162621516 162621517 rs17431968 +chr1 162852749 162852750 rs12134171 +chr1 163063720 163063721 rs951437 +chr1 163464959 163464960 rs3001080 +chr1 163568446 163568447 rs6700901 +chr1 163657977 163657978 rs10494395 +chr1 163868273 163868274 rs811435 +chr1 164485232 164485233 rs3945008 +chr1 164519219 164519220 rs1338626 +chr1 164680042 164680043 rs6426879 +chr1 164750823 164750824 rs10918063 +chr1 165077358 165077359 rs6663388 +chr1 165217252 165217253 rs10737508 +chr1 165295618 165295619 rs6662349 +chr1 165412606 165412607 rs10489745 +chr1 165620297 165620298 rs1337444 +chr1 165891575 165891576 rs3762365 +chr1 165934724 165934725 rs2349106 +chr1 166072230 166072231 rs4642869 +chr1 166358742 166358743 rs17460402 +chr1 166400413 166400414 rs4657543 +chr1 166430337 166430338 rs6427004 +chr1 166490192 166490193 rs10918488 +chr1 166569763 166569764 rs7516525 +chr1 167191721 167191722 rs11580495 +chr1 167494678 167494679 rs704852 +chr1 167499626 167499627 rs704853 +chr1 167531577 167531578 rs704859 +chr1 167565032 167565033 rs4657670 +chr1 167652881 167652882 rs12067995 +chr1 167843120 167843121 rs204264 +chr1 168379932 168379933 rs2268550 +chr1 168503682 168503683 rs7536740 +chr1 168847006 168847007 rs2143091 +chr1 168882804 168882805 rs1570334 +chr1 168953343 168953344 rs12048750 +chr1 169080642 169080643 rs1200100 +chr1 169101093 169101094 rs2051145 +chr1 169553315 169553316 rs12120605 +chr1 169554298 169554299 rs6427199 +chr1 169682542 169682543 rs12049148 +chr1 170567568 170567569 rs12563881 +chr1 170585782 170585783 rs7535322 +chr1 171065655 171065656 rs16863955 +chr1 171388110 171388111 rs12738952 +chr1 171420335 171420336 rs7519763 +chr1 171463969 171463970 rs12741782 +chr1 172698826 172698827 rs2071929 +chr1 173399531 173399532 rs1578624 +chr1 174547227 174547228 rs10912807 +chr1 175406665 175406666 rs859398 +chr1 175478659 175478660 rs859415 +chr1 175653291 175653292 rs12089079 +chr1 175689262 175689263 rs10913056 +chr1 175769866 175769867 rs640692 +chr1 176677246 176677247 rs10798473 +chr1 177162930 177162931 rs12021769 +chr1 177414899 177414900 rs9662701 +chr1 177787368 177787369 rs1923626 +chr1 177946338 177946339 rs842192 +chr1 177962372 177962373 rs12747656 +chr1 178039337 178039338 rs10753177 +chr1 179641885 179641886 rs11806102 +chr1 179790662 179790663 rs6683781 +chr1 179891943 179891944 rs502036 +chr1 180962371 180962372 rs3737062 +chr1 181058788 181058789 rs2282348 +chr1 181150698 181150699 rs6425668 +chr1 181165737 181165738 rs3856080 +chr1 181847373 181847374 rs695072 +chr1 181934372 181934373 rs12135968 +chr1 182542113 182542114 rs12038056 +chr1 182775069 182775070 rs7540658 +chr1 182988743 182988744 rs6694038 +chr1 183140035 183140036 rs1058177 +chr1 183446182 183446183 rs4047801 +chr1 183534528 183534529 rs3842897 +chr1 183795924 183795925 rs2500097 +chr1 183819435 183819436 rs10494568 +chr1 183961614 183961615 rs2182625 +chr1 184021611 184021612 rs10911494 +chr1 185373429 185373430 rs16823952 +chr1 185571485 185571486 rs11583193 +chr1 186081284 186081285 rs10798035 +chr1 186839210 186839211 rs3820185 +chr1 187064456 187064457 rs1474864 +chr1 187278017 187278018 rs2453727 +chr1 187340471 187340472 rs10798106 +chr1 187555147 187555148 rs1339082 +chr1 187925059 187925060 rs11802712 +chr1 188742320 188742321 rs10754136 +chr1 188801457 188801458 rs4255388 +chr1 189201086 189201087 rs1342561 +chr1 189789641 189789642 rs11578153 +chr1 191428385 191428386 rs6700152 +chr1 191461092 191461093 rs11800005 +chr1 192582493 192582494 rs2984921 +chr1 193041492 193041493 rs6661522 +chr1 193601203 193601204 rs17304238 +chr1 193804952 193804953 rs10801256 +chr1 193960846 193960847 rs642668 +chr1 195073246 195073247 rs10494719 +chr1 196183997 196183998 rs1408868 +chr1 197341616 197341617 rs3790370 +chr1 197842435 197842436 rs10922298 +chr1 198452277 198452278 rs2813164 +chr1_GL383520v2_alt 82195 82196 rs2813164 +chr1 199128148 199128149 rs427790 +chr1 199260499 199260500 rs1359451 +chr1 199511757 199511758 rs17637275 +chr1 199624713 199624714 rs12725952 +chr1 200487295 200487296 rs10919946 +chr1 200496875 200496876 rs6427832 +chr1 200735625 200735626 rs10494819 +chr1 201102755 201102756 rs10920115 +chr1 201105164 201105165 rs12022389 +chr1 201173425 201173426 rs10920138 +chr1 201200425 201200426 rs2365299 +chr1 201496928 201496929 rs10800784 +chr1 201526439 201526440 rs11586342 +chr1 201555342 201555343 rs556903 +chr1 201568356 201568357 rs4915236 +chr1 201592491 201592492 rs545372 +chr1 201773627 201773628 rs633367 +chr1 201821697 201821698 rs1032524 +chr1 201969866 201969867 rs7513 +chr1 202048271 202048272 rs6656470 +chr1 202056161 202056162 rs6427933 +chr1 202076101 202076102 rs10158382 +chr1 202159983 202159984 rs4359077 +chr1 202705068 202705069 rs4072661 +chr1 202708662 202708663 rs3923371 +chr1 202841433 202841434 rs4950949 +chr1 203176172 203176173 rs762625 +chr1 203204227 203204228 rs2486949 +chr1 203367679 203367680 rs10800919 +chr1 203380523 203380524 rs6428006 +chr1 203675499 203675500 rs4951357 +chr1 204013204 204013205 rs2796433 +chr1 204093863 204093864 rs6593993 +chr1 204143277 204143278 rs4951309 +chr1 204390204 204390205 rs11240735 +chr1 204400746 204400747 rs2942133 +chr1 204663352 204663353 rs2815829 +chr1 205006606 205006607 rs2802841 +chr1 205349192 205349193 rs10751435 +chr1 205349854 205349855 rs913722 +chr1 205435749 205435750 rs10900490 +chr1 205449005 205449006 rs1999131 +chr1 205454764 205454765 rs10900493 +chr1 205641645 205641646 rs6661827 +chr1 205928279 205928280 rs12143020 +chr1 206110071 206110072 rs33985287 +chr1 207083957 207083958 rs2842754 +chr1 207863630 207863631 rs2796247 +chr1 208020386 208020387 rs1152832 +chr1 208209663 208209664 rs1318276 +chr1 208317549 208317550 rs2897064 +chr1 208388007 208388008 rs2163039 +chr1 208460656 208460657 rs696958 +chr1 208546502 208546503 rs7548249 +chr1 208686947 208686948 rs10863723 +chr1 208882506 208882507 rs4844730 +chr1 208915168 208915169 rs7368359 +chr1 209021902 209021903 rs6670957 +chr1 209082468 209082469 rs1183044 +chr1 209458858 209458859 rs7526722 +chr1 209555244 209555245 rs10746420 +chr1 209566557 209566558 rs7525534 +chr1 209631153 209631154 rs2236891 +chr1 210440271 210440272 rs3765851 +chr1 210526308 210526309 rs12121296 +chr1 210557891 210557892 rs11807403 +chr1 210607171 210607172 rs4245753 +chr1 210711356 210711357 rs9430044 +chr1 210733896 210733897 rs1890844 +chr1 211089910 211089911 rs9970961 +chr1 211553632 211553633 rs9430069 +chr1 211641944 211641945 rs1373293 +chr1 211654378 211654379 rs3795833 +chr1 211773032 211773033 rs4951426 +chr1 212125461 212125462 rs12087287 +chr1 212177632 212177633 rs6703980 +chr1 212900023 212900024 rs1284851 +chr1 212982223 212982224 rs11120070 +chr1 213325888 213325889 rs1699185 +chr1 213348089 213348090 rs10864043 +chr1 213605852 213605853 rs11120170 +chr1 213759477 213759478 rs12041173 +chr1 213859707 213859708 rs2359937 +chr1 214302667 214302668 rs6540817 +chr1 214367992 214367993 rs11120305 +chr1 214385314 214385315 rs3013445 +chr1 214395763 214395764 rs4129186 +chr1 214403757 214403758 rs12129366 +chr1 214420847 214420848 rs11120316 +chr1 214449474 214449475 rs4394613 +chr1 214684618 214684619 rs441318 +chr1 214735751 214735752 rs6687999 +chr1 214857807 214857808 rs1415181 +chr1 215794514 215794515 rs17025432 +chr1 215799452 215799453 rs4363405 +chr1 216042398 216042399 rs11120726 +chr1 216119223 216119224 rs301734 +chr1 216460048 216460049 rs4846466 +chr1 216460292 216460293 rs6687745 +chr1 216739918 216739919 rs2813703 +chr1 216766442 216766443 rs11572636 +chr1 216852799 216852800 rs11117706 +chr1 217975334 217975335 rs4846453 +chr1 218515812 218515813 rs3009947 +chr1 218575615 218575616 rs1932971 +chr1 218613206 218613207 rs2965012 +chr1 218912241 218912242 rs12039986 +chr1 218922039 218922040 rs12732806 +chr1 220352650 220352651 rs10863546 +chr1 220371230 220371231 rs12041182 +chr1 220937523 220937524 rs11806418 +chr1 221725440 221725441 rs12091463 +chr1 221784846 221784847 rs4240927 +chr1 221806419 221806420 rs3934724 +chr1 222030082 222030083 rs11590870 +chr1 222606605 222606606 rs3008598 +chr1 223133088 223133089 rs851178 +chr1 223176587 223176588 rs851170 +chr1 223483194 223483195 rs10495209 +chr1 225682527 225682528 rs7553931 +chr1 225771154 225771155 rs6685014 +chr1 225813264 225813265 rs1467143 +chr1 226488597 226488598 rs11588657 +chr1 226505840 226505841 rs7524430 +chr1 226768479 226768480 rs12729579 +chr1 227857806 227857807 rs2872243 +chr1 227885107 227885108 rs4074668 +chr1 227898629 227898630 rs1573059 +chr1 228683209 228683210 rs10916354 +chr1 228804122 228804123 rs10799489 +chr1 228883400 228883401 rs11585386 +chr1 228916384 228916385 rs2000163 +chr1 228971531 228971532 rs7513940 +chr1 229019417 229019418 rs551755 +chr1 229037604 229037605 rs1870362 +chr1 229252923 229252924 rs9435869 +chr1 229524043 229524044 rs10916508 +chr1 229545258 229545259 rs927204 +chr1 229838600 229838601 rs687266 +chr1 230051096 230051097 rs7515331 +chr1 230075650 230075651 rs6673349 +chr1 230128314 230128315 rs7538126 +chr1 230175225 230175226 rs1124110 +chr1 230287734 230287735 rs11122478 +chr1 230361061 230361062 rs1108707 +chr1 230741653 230741654 rs1317764 +chr1 230761716 230761717 rs3790955 +chr1 231227253 231227254 rs16854012 +chr1 231509878 231509879 rs1765780 +chr1 231937381 231937382 rs701158 +chr1 232257670 232257671 rs4596830 +chr1 232279346 232279347 rs11803212 +chr1 232546374 232546375 rs789645 +chr1 232625369 232625370 rs1970168 +chr1 232668360 232668361 rs1986615 +chr1 233575485 233575486 rs904068 +chr1 233655722 233655723 rs701232 +chr1 233688178 233688179 rs595191 +chr1 233945125 233945126 rs4506523 +chr1 234133422 234133423 rs12129782 +chr1 234646702 234646703 rs12058613 +chr1 234742967 234742968 rs2587536 +chr1 234760711 234760712 rs17589414 +chr1 234875977 234875978 rs10910522 +chr1 235079949 235079950 rs11580121 +chr1 235601196 235601197 rs4659946 +chr1 235651206 235651207 rs10159416 +chr1 235686638 235686639 rs7545788 +chr1 236133649 236133650 rs12566852 +chr1 236691887 236691888 rs17648708 +chr1 236785241 236785242 rs7556238 +chr1 236955103 236955104 rs12125972 +chr1 237010734 237010735 rs10925289 +chr1 237150421 237150422 rs1409052 +chr1 237249991 237249992 rs888438 +chr1 237830999 237831000 rs6429040 +chr1 238555730 238555731 rs789375 +chr1 238736602 238736603 rs10925747 +chr1 239108477 239108478 rs4659902 +chr1 239309812 239309813 rs10495435 +chr1 239606644 239606645 rs12119540 +chr1 239763708 239763709 rs17657156 +chr1 239810705 239810706 rs6690809 +chr1 239913307 239913308 rs10495449 +chr1 239954336 239954337 rs10926029 +chr1 240085781 240085782 rs4443876 +chr1 240244082 240244083 rs6429195 +chr1 240449685 240449686 rs11590081 +chr1 240462898 240462899 rs10495470 +chr1 240479866 240479867 rs11578184 +chr1 240497189 240497190 rs9428478 +chr1 240503701 240503702 rs10465630 +chr1 240511898 240511899 rs7540147 +chr1 240610365 240610366 rs11578889 +chr1 240634788 240634789 rs6429215 +chr1 240889821 240889822 rs187783 +chr1 241022755 241022756 rs523361 +chr1 241508337 241508338 rs11802956 +chr1 241548400 241548401 rs11808201 +chr1 241609118 241609119 rs613032 +chr1 241688442 241688443 rs12133073 +chr1 241876826 241876827 rs2526697 +chr1 241924341 241924342 rs4658565 +chr1 241926492 241926493 rs7516206 +chr1 242185299 242185300 rs316835 +chr1 242431565 242431566 rs2796077 +chr1 242527079 242527080 rs2810011 +chr1 242648291 242648292 rs2184185 +chr1 242710292 242710293 rs10926828 +chr1 242821863 242821864 rs2998678 +chr1 244024297 244024298 rs1000543 +chr1 244097172 244097173 rs4658613 +chr1 244156037 244156038 rs10803181 +chr1 244296480 244296481 rs678004 +chr1 244811283 244811284 rs12088062 +chr1 244834650 244834651 rs10927330 +chr1 245125190 245125191 rs6672147 +chr1 245164782 245164783 rs12039117 +chr1 245427893 245427894 rs1173851 +chr1_KI270759v1_alt 122197 122198 rs1173851 +chr1 245445516 245445517 rs1093937 +chr1_KI270759v1_alt 139820 139821 rs1093937 +chr1 245615681 245615682 rs1771522 +chr1_KI270759v1_alt 309985 309986 rs1771522 +chr1 245654196 245654197 rs4658792 +chr1_KI270759v1_alt 348508 348509 rs4658792 +chr1 246004714 246004715 rs4654186 +chr1 246533293 246533294 rs10924772 +chr1 246655331 246655332 rs3124089 +chr1 247387028 247387029 rs7542425 +chr1 247618266 247618267 rs1144815 +chr1 247619297 247619298 rs11587369 +chr2 623469 623470 rs11688330 +chr2 782576 782577 rs10183412 +chr2_KI270770v1_alt 58516 58517 rs10183412 +chr2 1005373 1005374 rs7598261 +chr2 1120961 1120962 rs4971463 +chr2 1374287 1374288 rs4927602 +chr2_KI270774v1_alt 57482 57483 rs4927602 +chr2 1411186 1411187 rs2298873 +chr2_KI270774v1_alt 94384 94385 rs2298873 +chr2 1521785 1521786 rs4927594 +chr2_KI270774v1_alt 204156 204157 rs4927594 +chr2 2232508 2232509 rs4853946 +chr2 2233026 2233027 rs17247253 +chr2 2529430 2529431 rs4853800 +chr2 2663193 2663194 rs10202240 +chr2 2684138 2684139 rs1470738 +chr2 2697892 2697893 rs1993081 +chr2 2737673 2737674 rs1451197 +chr2 2941682 2941683 rs1667060 +chr2 2961628 2961629 rs1729903 +chr2 3008517 3008518 rs2031028 +chr2 3125150 3125151 rs1078821 +chr2 3476791 3476792 rs7592700 +chr2_KI270769v1_alt 86261 86262 rs7592700 +chr2 3538938 3538939 rs10197283 +chr2 3737954 3737955 rs7563964 +chr2 3789712 3789713 rs11886534 +chr2 3815526 3815527 rs11903032 +chr2 3834586 3834587 rs2034730 +chr2 3947048 3947049 rs4850016 +chr2 4126137 4126138 rs1437701 +chr2 4151150 4151151 rs1983365 +chr2 4408464 4408465 rs2602629 +chr2 4882739 4882740 rs6542644 +chr2 4938165 4938166 rs6422704 +chr2 5355829 5355830 rs11677035 +chr2 5454635 5454636 rs792071 +chr2 5851836 5851837 rs2163025 +chr2 5852384 5852385 rs11694877 +chr2 5905411 5905412 rs7559948 +chr2 5938287 5938288 rs4349325 +chr2 6196662 6196663 rs7424127 +chr2 6240815 6240816 rs10519722 +chr2 6352305 6352306 rs6712182 +chr2 6435530 6435531 rs10190662 +chr2 6789186 6789187 rs4669100 +chr2 6795107 6795108 rs905968 +chr2 6810898 6810899 rs1077583 +chr2 6968080 6968081 rs4669122 +chr2 7203027 7203028 rs7562418 +chr2 7438971 7438972 rs732078 +chr2 7516308 7516309 rs6431885 +chr2 7672584 7672585 rs11682611 +chr2 7905055 7905056 rs1861506 +chr2 7958490 7958491 rs40996 +chr2 8170863 8170864 rs1981456 +chr2 8271937 8271938 rs11674752 +chr2 8401999 8402000 rs4669265 +chr2 8415953 8415954 rs409169 +chr2 8533796 8533797 rs1532791 +chr2 8584171 8584172 rs168293 +chr2 8630433 8630434 rs4669318 +chr2 8635971 8635972 rs3927971 +chr2 8800023 8800024 rs17722392 +chr2 9168018 9168019 rs907165 +chr2 9766015 9766016 rs10200632 +chr2 9768771 9768772 rs4669453 +chr2 9772699 9772700 rs871820 +chr2 9812069 9812070 rs7559852 +chr2 9958097 9958098 rs6708858 +chr2 10005219 10005220 rs1469541 +chr2 10069865 10069866 rs4233874 +chr2 10089783 10089784 rs11680378 +chr2 10124581 10124582 rs6741290 +chr2 10240082 10240083 rs759341 +chr2 10282215 10282216 rs4669564 +chr2 10362606 10362607 rs11677361 +chr2 10423786 10423787 rs1974676 +chr2 10477898 10477899 rs2430424 +chr2 10845237 10845238 rs1734389 +chr2 10846775 10846776 rs1734395 +chr2 10860795 10860796 rs1734464 +chr2 10864676 10864677 rs1997523 +chr2 11060220 11060221 rs7564899 +chr2 11083835 11083836 rs13019468 +chr2 11616133 11616134 rs7584842 +chr2 11667089 11667090 rs12612207 +chr2 11984035 11984036 rs2581053 +chr2 11988923 11988924 rs1530145 +chr2 12067250 12067251 rs10495589 +chr2 12151529 12151530 rs1971516 +chr2 12232285 12232286 rs10197467 +chr2 12247178 12247179 rs12992291 +chr2 12391070 12391071 rs7563729 +chr2 12428776 12428777 rs16858854 +chr2 12485364 12485365 rs4377309 +chr2 12580184 12580185 rs6432315 +chr2 12665036 12665037 rs10514648 +chr2 12700448 12700449 rs659599 +chr2 12809997 12809998 rs1469217 +chr2 12992851 12992852 rs2380457 +chr2 13826045 13826046 rs7583428 +chr2 13913184 13913185 rs4603735 +chr2 13932434 13932435 rs4669964 +chr2 14092926 14092927 rs360468 +chr2 14260349 14260350 rs12476448 +chr2 14605021 14605022 rs2015245 +chr2 15019495 15019496 rs13427628 +chr2 15109097 15109098 rs6716200 +chr2 15769475 15769476 rs6706165 +chr2 15805501 15805502 rs2380680 +chr2 15874231 15874232 rs2380708 +chr2 15972705 15972706 rs6716344 +chr2 16009657 16009658 rs1365966 +chr2 16036771 16036772 rs10194143 +chr2 16197703 16197704 rs1567965 +chr2 16209430 16209431 rs340724 +chr2 16278267 16278268 rs2333979 +chr2 16898169 16898170 rs12615806 +chr2 17044637 17044638 rs1515968 +chr2 17828051 17828052 rs6531056 +chr2 17918651 17918652 rs1870822 +chr2 18490528 18490529 rs4381790 +chr2 18530483 18530484 rs2272519 +chr2 18819407 18819408 rs4240223 +chr2 19103093 19103094 rs4233762 +chr2 19154979 19154980 rs12105891 +chr2 19352627 19352628 rs851066 +chr2 19540214 19540215 rs1427547 +chr2 19573382 19573383 rs17686199 +chr2 19854630 19854631 rs10184780 +chr2 20151021 20151022 rs10495703 +chr2 20391361 20391362 rs1032075 +chr2 20566202 20566203 rs13006062 +chr2 20663525 20663526 rs1013363 +chr2 20676625 20676626 rs746776 +chr2 20739947 20739948 rs653347 +chr2 20847534 20847535 rs6709100 +chr2 20886932 20886933 rs1002755 +chr2 21009322 21009323 rs693 +chr2 21355509 21355510 rs219556 +chr2 21723566 21723567 rs1562900 +chr2 22184461 22184462 rs2176472 +chr2 22203201 22203202 rs1607267 +chr2 22844614 22844615 rs12618688 +chr2 23004964 23004965 rs1374460 +chr2 23015131 23015132 rs10495737 +chr2 23308596 23308597 rs6711889 +chr2 23325742 23325743 rs2577720 +chr2 23532077 23532078 rs748860 +chr2 23716609 23716610 rs2879609 +chr2 24982557 24982558 rs1982200 +chr2 25139645 25139646 rs4665765 +chr2 25374811 25374812 rs730072 +chr2 25446647 25446648 rs6721434 +chr2 25505040 25505041 rs9309386 +chr2 25518151 25518152 rs499728 +chr2 25584236 25584237 rs11126114 +chr2 26553258 26553259 rs12470327 +chr2 28101001 28101002 rs6547829 +chr2 28369248 28369249 rs11902329 +chr2 28463464 28463465 rs1581035 +chr2 29578782 29578783 rs4665470 +chr2 30225477 30225478 rs906868 +chr2 30346488 30346489 rs7578949 +chr2 30414049 30414050 rs2076932 +chr2 30707298 30707299 rs472161 +chr2 30754765 30754766 rs1983383 +chr2 30788057 30788058 rs6709502 +chr2 30838431 30838432 rs7562766 +chr2 30895191 30895192 rs1559497 +chr2 31085152 31085153 rs13404171 +chr2 31236877 31236878 rs1540926 +chr2 32874312 32874313 rs10202440 +chr2 33410049 33410050 rs17012963 +chr2 33720646 33720647 rs12471341 +chr2 34369374 34369375 rs10204349 +chr2 34589450 34589451 rs1220211 +chr2 35909963 35909964 rs12712470 +chr2 36154260 36154261 rs2372441 +chr2 36576719 36576720 rs848596 +chr2 36752368 36752369 rs4670600 +chr2 37371277 37371278 rs2373001 +chr2 37374064 37374065 rs1024816 +chr2 37580228 37580229 rs6544093 +chr2 37690629 37690630 rs10172526 +chr2 37710988 37710989 rs6715108 +chr2 37720597 37720598 rs12616929 +chr2 37762935 37762936 rs7590255 +chr2 38052877 38052878 rs7557493 +chr2 38284238 38284239 rs1992881 +chr2 38511363 38511364 rs6544166 +chr2 39620028 39620029 rs17024091 +chr2 40399505 40399506 rs12052585 +chr2 40422775 40422776 rs7579930 +chr2 40828682 40828683 rs9309061 +chr2 40875905 40875906 rs207613 +chr2 41250706 41250707 rs10187485 +chr2 41715104 41715105 rs6756874 +chr2 41853483 41853484 rs4305317 +chr2 42040287 42040288 rs11898187 +chr2 42260904 42260905 rs2302346 +chr2 42463740 42463741 rs10495897 +chr2 42726204 42726205 rs1561505 +chr2 43012285 43012286 rs11686640 +chr2 43032024 43032025 rs10175942 +chr2 43257416 43257417 rs6749927 +chr2 43716385 43716386 rs1991739 +chr2 44990140 44990141 rs2917768 +chr2 45045057 45045058 rs1447107 +chr2 45068933 45068934 rs6723092 +chr2 45112351 45112352 rs12464646 +chr2 45116256 45116257 rs11896942 +chr2 45184048 45184049 rs2342702 +chr2 45287014 45287015 rs1862890 +chr2 45335674 45335675 rs12712941 +chr2 45761883 45761884 rs7582320 +chr2 45788495 45788496 rs4074080 +chr2 45828217 45828218 rs935661 +chr2 45964843 45964844 rs4953292 +chr2 46291754 46291755 rs1867786 +chr2 46309916 46309917 rs4952818 +chr2 46320354 46320355 rs6720535 +chr2 46953966 46953967 rs2881586 +chr2 47096292 47096293 rs12470974 +chr2 47283184 47283185 rs904162 +chr2 47316105 47316106 rs9789479 +chr2 47373966 47373967 rs1126497 +chr2 47607173 47607174 rs10182660 +chr2 47618611 47618612 rs10165893 +chr2 47715685 47715686 rs4325805 +chr2 48698606 48698607 rs6755901 +chr2 48757251 48757252 rs2301267 +chr2 49209449 49209450 rs4971718 +chr2 49682531 49682532 rs2176603 +chr2 49763229 49763230 rs1518823 +chr2 50020010 50020011 rs6753833 +chr2 50221999 50222000 rs601010 +chr2 50523289 50523290 rs7581256 +chr2 50590331 50590332 rs6733430 +chr2 50852343 50852344 rs2193225 +chr2 51010628 51010629 rs7594170 +chr2 51104018 51104019 rs735315 +chr2 51341903 51341904 rs6717556 +chr2 52091441 52091442 rs7574971 +chr2 52156559 52156560 rs11892271 +chr2 52266787 52266788 rs2141844 +chr2 52418565 52418566 rs7586951 +chr2 53155301 53155302 rs12995294 +chr2 54275774 54275775 rs843748 +chr2 54783055 54783056 rs6705079 +chr2 54824689 54824690 rs12999197 +chr2 54848256 54848257 rs2165006 +chr2 55130290 55130291 rs10168457 +chr2 56002248 56002249 rs4672084 +chr2 56130446 56130447 rs929689 +chr2 56151351 56151352 rs17047517 +chr2 56156626 56156627 rs6545554 +chr2 56395335 56395336 rs10191130 +chr2 56529721 56529722 rs6718973 +chr2 57060275 57060276 rs1116357 +chr2 57710608 57710609 rs11125728 +chr2 58660514 58660515 rs11693731 +chr2 58887603 58887604 rs6758100 +chr2 59012232 59012233 rs11687358 +chr2 59033268 59033269 rs7590342 +chr2 59756768 59756769 rs10168190 +chr2 59874076 59874077 rs6545760 +chr2 60057478 60057479 rs1861151 +chr2 60118326 60118327 rs979687 +chr2 60496536 60496537 rs6729815 +chr2 60535366 60535367 rs2556378 +chr2 60832247 60832248 rs6545832 +chr2 61457428 61457429 rs778139 +chr2 62435568 62435569 rs13412212 +chr2 63074028 63074029 rs6545977 +chr2 64036395 64036396 rs329489 +chr2 64142201 64142202 rs10496107 +chr2 64268492 64268493 rs1529102 +chr2 64472002 64472003 rs11126005 +chr2 64914975 64914976 rs6754629 +chr2 65672152 65672153 rs7576393 +chr2 65826338 65826339 rs3845821 +chr2 65877746 65877747 rs2631669 +chr2 66131104 66131105 rs4671716 +chr2 66183813 66183814 rs2951282 +chr2 66497009 66497010 rs6722685 +chr2 66680575 66680576 rs6709958 +chr2 66732786 66732787 rs2081397 +chr2 67161099 67161100 rs4671784 +chr2 67315321 67315322 rs2128769 +chr2 67477947 67477948 rs6760732 +chr2 67531773 67531774 rs2541022 +chr2 67755058 67755059 rs2116051 +chr2 67808829 67808830 rs6715551 +chr2 67832613 67832614 rs1430795 +chr2 68103701 68103702 rs4671873 +chr2 68111480 68111481 rs17034987 +chr2 68328567 68328568 rs6717329 +chr2 68797656 68797657 rs7558602 +chr2 68856985 68856986 rs6546442 +chr2 68911893 68911894 rs10191936 +chr2 69586325 69586326 rs12987661 +chr2 70388997 70388998 rs2169843 +chr2 71149070 71149071 rs1458868 +chr2 71702644 71702645 rs750355 +chr2 72943600 72943601 rs755409 +chr2 73877744 73877745 rs10188058 +chr2 74261570 74261571 rs4853019 +chr2 74741112 74741113 rs205621 +chr2 74743265 74743266 rs11678377 +chr2 74858035 74858036 rs3771781 +chr2 75074635 75074636 rs6546952 +chr2 75233428 75233429 rs12328696 +chr2 75345591 75345592 rs2110933 +chr2 75626661 75626662 rs6547014 +chr2 75763918 75763919 rs7419897 +chr2 75999248 75999249 rs6708139 +chr2 76261437 76261438 rs2860732 +chr2 76387031 76387032 rs1996634 +chr2 76584651 76584652 rs10203812 +chr2 76802196 76802197 rs7561233 +chr2 77414726 77414727 rs370099 +chr2 77912422 77912423 rs4853352 +chr2 78933490 78933491 rs9309543 +chr2 79251732 79251733 rs6710298 +chr2 79259123 79259124 rs6757830 +chr2 79298916 79298917 rs11892349 +chr2 79870152 79870153 rs3755095 +chr2 79958790 79958791 rs747920 +chr2 79987427 79987428 rs598453 +chr2 80261648 80261649 rs318369 +chr2 80287546 80287547 rs1930 +chr2 80875138 80875139 rs2131255 +chr2 81136815 81136816 rs1598759 +chr2 81267767 81267768 rs2862492 +chr2 81871375 81871376 rs4852646 +chr2 82183337 82183338 rs1430726 +chr2 82893602 82893603 rs10469974 +chr2 83579129 83579130 rs1486837 +chr2 83696514 83696515 rs2923861 +chr2 85061448 85061449 rs1882271 +chr2 85139847 85139848 rs6754757 +chr2 85326956 85326957 rs4247303 +chr2 85387888 85387889 rs1135604 +chr2 85745990 85745991 rs1356621 +chr2 85795898 85795899 rs10184538 +chr2 85820089 85820090 rs10445963 +chr2 86372172 86372173 rs2113608 +chr2 88279023 88279024 rs4972052 +chr2 96251849 96251850 rs7058 +chr2 97716826 97716827 rs11683207 +chr2 98167811 98167812 rs2309389 +chr2 98385984 98385985 rs4851130 +chr2 98662890 98662891 rs1028144 +chr2 98767907 98767908 rs12615689 +chr2 99524565 99524566 rs1376444 +chr2 100449588 100449589 rs6716842 +chr2 102154832 102154833 rs3917335 +chr2 103136571 103136572 rs6709515 +chr2 103139957 103139958 rs1482751 +chr2 103334116 103334117 rs10191917 +chr2 103496999 103497000 rs6761396 +chr2 104477239 104477240 rs1033302 +chr2 105509924 105509925 rs13404931 +chr2 105641567 105641568 rs4851079 +chr2 105718831 105718832 rs17031627 +chr2 105828824 105828825 rs2163350 +chr2 105845799 105845800 rs6543342 +chr2 105924772 105924773 rs2098836 +chr2 106526433 106526434 rs4455150 +chr2 106915538 106915539 rs12463880 +chr2 107007240 107007241 rs1013014 +chr2 107169559 107169560 rs2907907 +chr2 107577566 107577567 rs6542725 +chr2 107799245 107799246 rs6542736 +chr2 107993688 107993689 rs4676169 +chr2 108326746 108326747 rs17770672 +chr2 108699298 108699299 rs4676040 +chr2 108920327 108920328 rs260642 +chr2 109060062 109060063 rs1471074 +chr2 109240029 109240030 rs6760953 +chr2 109460696 109460697 rs6542832 +chr2 111519762 111519763 rs11123551 +chr2 112108980 112108981 rs954521 +chr2 112699471 112699472 rs10211073 +chr2 112966336 112966337 rs7580446 +chr2 113359934 113359935 rs6739740 +chr2 113396791 113396792 rs12711768 +chr2 113983859 113983860 rs6756587 +chr2 115065177 115065178 rs17452616 +chr2 115639203 115639204 rs13012337 +chr2 118118539 118118540 rs11673900 +chr2 118463329 118463330 rs1965130 +chr2 118523217 118523218 rs2008776 +chr2 118830133 118830134 rs4848526 +chr2 118940997 118940998 rs3806496 +chr2 118985288 118985289 rs3731612 +chr2 119026616 119026617 rs729735 +chr2 119212254 119212255 rs6759589 +chr2 119267895 119267896 rs6707849 +chr2 119520594 119520595 rs4383344 +chr2 119574399 119574400 rs17659633 +chr2 119984432 119984433 rs1446305 +chr2 120338343 120338344 rs7589138 +chr2 120429486 120429487 rs7592778 +chr2 120538908 120538909 rs6758414 +chr2 120599518 120599519 rs1568836 +chr2 120600678 120600679 rs4849909 +chr2 121147957 121147958 rs2713241 +chr2 121167821 121167822 rs4488664 +chr2 121182424 121182425 rs4848692 +chr2 122899350 122899351 rs1554808 +chr2 123254671 123254672 rs1401561 +chr2 123519373 123519374 rs1343822 +chr2 123971433 123971434 rs1400064 +chr2 124065220 124065221 rs959320 +chr2 124218585 124218586 rs11123030 +chr2 124523130 124523131 rs17676225 +chr2 124565257 124565258 rs6541961 +chr2 124762885 124762886 rs724655 +chr2 125380361 125380362 rs1435578 +chr2 126390881 126390882 rs437866 +chr2 126582723 126582724 rs6431134 +chr2 127082204 127082205 rs10194375 +chr2 128444866 128444867 rs11690893 +chr2 128478009 128478010 rs2011526 +chr2 128526580 128526581 rs841080 +chr2 128634670 128634671 rs1595400 +chr2 129702522 129702523 rs4662980 +chr2 129896311 129896312 rs1574605 +chr2 130766097 130766098 rs1134119 +chr2 130835471 130835472 rs1542604 +chr2 130975830 130975831 rs4850101 +chr2 131402272 131402273 rs2313693 +chr2 131409032 131409033 rs7584315 +chr2 131825704 131825705 rs10928155 +chr2 131973813 131973814 rs4063769 +chr2 132558518 132558519 rs4145337 +chr2 132636234 132636235 rs4547577 +chr2 132872668 132872669 rs1037173 +chr2 133594076 133594077 rs17817190 +chr2 133772089 133772090 rs1446741 +chr2 133818884 133818885 rs1867896 +chr2 133866704 133866705 rs4603824 +chr2 133995484 133995485 rs10208875 +chr2 134114465 134114466 rs1879019 +chr2 134156184 134156185 rs11900787 +chr2 134221843 134221844 rs2593708 +chr2 134444883 134444884 rs535900 +chr2 136279548 136279549 rs13420371 +chr2 136282213 136282214 rs4245843 +chr2 136779333 136779334 rs2465095 +chr2 137159532 137159533 rs13413874 +chr2 138124757 138124758 rs1357404 +chr2 138391482 138391483 rs7576870 +chr2 140157539 140157540 rs2950615 +chr2 140338337 140338338 rs12992137 +chr2 141119631 141119632 rs1882638 +chr2 141125393 141125394 rs13013197 +chr2 141383845 141383846 rs10166697 +chr2 141414796 141414797 rs4954702 +chr2 141834366 141834367 rs6721397 +chr2 143753659 143753660 rs11898334 +chr2 145117721 145117722 rs1997287 +chr2 145634781 145634782 rs12619445 +chr2 146664685 146664686 rs10206424 +chr2 146992606 146992607 rs1515263 +chr2 147613959 147613960 rs6708653 +chr2 147675110 147675111 rs4662539 +chr2 148695231 148695232 rs10183992 +chr2 149603355 149603356 rs10490073 +chr2 149814250 149814251 rs1405214 +chr2 150033718 150033719 rs330650 +chr2 150173463 150173464 rs4667375 +chr2 150426891 150426892 rs860992 +chr2 150477946 150477947 rs1528430 +chr2 150768367 150768368 rs6734792 +chr2 151544796 151544797 rs9287983 +chr2 152552829 152552830 rs10497105 +chr2 152715641 152715642 rs3811567 +chr2 153016330 153016331 rs1347395 +chr2 153137293 153137294 rs1369256 +chr2 153200632 153200633 rs6745326 +chr2 153460872 153460873 rs3910524 +chr2 153763294 153763295 rs10183136 +chr2 154567152 154567153 rs12104610 +chr2 154780725 154780726 rs2053671 +chr2 155608501 155608502 rs11679712 +chr2 155963072 155963073 rs17238525 +chr2 156133793 156133794 rs12694551 +chr2 156444109 156444110 rs4664818 +chr2 156634133 156634134 rs7577045 +chr2 156981357 156981358 rs4664844 +chr2 157599467 157599468 rs13383985 +chr2 157870042 157870043 rs12479151 +chr2 158180033 158180034 rs1357183 +chr2 158244700 158244701 rs7559893 +chr2 158919108 158919109 rs9789420 +chr2 159466144 159466145 rs16844045 +chr2 160747757 160747758 rs1975999 +chr2 161038151 161038152 rs197273 +chr2 161780103 161780104 rs12692642 +chr2 161962110 161962111 rs4500960 +chr2 162613830 162613831 rs6715506 +chr2 162646210 162646211 rs3849346 +chr2 163192148 163192149 rs13389923 +chr2 163222580 163222581 rs1394242 +chr2 163250487 163250488 rs6712770 +chr2 165431465 165431466 rs4667819 +chr2 165564088 165564089 rs1877872 +chr2 166774220 166774221 rs4393770 +chr2 167620961 167620962 rs1431900 +chr2 167789530 167789531 rs13020412 +chr2 167993184 167993185 rs11884717 +chr2 168159162 168159163 rs1517342 +chr2 168525831 168525832 rs1020603 +chr2 168842839 168842840 rs518337 +chr2_GL383522v1_alt 12477 12478 rs518337 +chr2 168893972 168893973 rs477224 +chr2_GL383522v1_alt 80599 80600 rs477224 +chr2 168963313 168963314 rs3770582 +chr2 169231966 169231967 rs2302693 +chr2 169354866 169354867 rs2389557 +chr2 169902192 169902193 rs12991583 +chr2 170144288 170144289 rs4667620 +chr2 170204218 170204219 rs6738892 +chr2 170348577 170348578 rs16858186 +chr2 170559281 170559282 rs12993953 +chr2 170572858 170572859 rs11693682 +chr2 170577314 170577315 rs2883782 +chr2 170691982 170691983 rs7574074 +chr2 171598422 171598423 rs6745725 +chr2 171654178 171654179 rs1399956 +chr2 172264607 172264608 rs7566285 +chr2 172290989 172290990 rs12471128 +chr2 172374993 172374994 rs4283388 +chr2 172430568 172430569 rs3108779 +chr2 172919929 172919930 rs2113807 +chr2 173290463 173290464 rs868294 +chr2 173402552 173402553 rs1865236 +chr2 173405522 173405523 rs1020013 +chr2 173579861 173579862 rs4972588 +chr2 173828459 173828460 rs7421996 +chr2 173843470 173843471 rs1024125 +chr2 173853330 173853331 rs7591669 +chr2 174552282 174552283 rs10172858 +chr2 174700823 174700824 rs12620150 +chr2 174901619 174901620 rs9287980 +chr2 175676954 175676955 rs7565836 +chr2 175756671 175756672 rs13017316 +chr2 175857255 175857256 rs1374369 +chr2 175873811 175873812 rs12693085 +chr2 175885049 175885050 rs6433564 +chr2 176144185 176144186 rs6736786 +chr2 176206191 176206192 rs1026027 +chr2 176384243 176384244 rs2069172 +chr2 176462473 176462474 rs6749901 +chr2 176466238 176466239 rs1554406 +chr2 176935023 176935024 rs7603168 +chr2 177673161 177673162 rs3770011 +chr2 177971901 177971902 rs2573088 +chr2 179313068 179313069 rs10497537 +chr2 179350582 179350583 rs6433781 +chr2 179401404 179401405 rs10930870 +chr2 179411160 179411161 rs1400825 +chr2 179414614 179414615 rs6433791 +chr2 179473093 179473094 rs12473469 +chr2 179881313 179881314 rs11888692 +chr2 180292262 180292263 rs3845718 +chr2 180647303 180647304 rs1477502 +chr2 180920566 180920567 rs10048799 +chr2 180946220 180946221 rs10192997 +chr2 183305624 183305625 rs1972947 +chr2 183488726 183488727 rs1992179 +chr2 183493673 183493674 rs2368443 +chr2 183632794 183632795 rs1454053 +chr2 184322416 184322417 rs719736 +chr2 184461523 184461524 rs12693377 +chr2 185067587 185067588 rs263767 +chr2 185380925 185380926 rs17403192 +chr2 187972820 187972821 rs2350195 +chr2 188097698 188097699 rs11886097 +chr2 190748652 190748653 rs1263117 +chr2 191073873 191073874 rs7594501 +chr2 191474804 191474805 rs16833762 +chr2 191933261 191933262 rs3923556 +chr2 192079071 192079072 rs2356758 +chr2 192170296 192170297 rs2356955 +chr2 194512712 194512713 rs16831761 +chr2 195757797 195757798 rs1026629 +chr2 196270065 196270066 rs6746308 +chr2 198768027 198768028 rs6761022 +chr2 198918871 198918872 rs1526070 +chr2 200365260 200365261 rs295130 +chr2 200468277 200468278 rs3769433 +chr2 200706419 200706420 rs2540051 +chr2 201266863 201266864 rs2293554 +chr2 201666900 201666901 rs16837959 +chr2 201990470 201990471 rs4675242 +chr2 202019669 202019670 rs1477031 +chr2 202488213 202488214 rs6751210 +chr2 202901643 202901644 rs3933629 +chr2 203984094 203984095 rs13003194 +chr2 204189317 204189318 rs7607984 +chr2 204197909 204197910 rs6714929 +chr2 204346525 204346526 rs9653325 +chr2 204360735 204360736 rs6435232 +chr2 204481943 204481944 rs12613305 +chr2 204527210 204527211 rs4675467 +chr2 204869123 204869124 rs6733159 +chr2 205170341 205170342 rs1468997 +chr2 205410335 205410336 rs849266 +chr2 205481480 205481481 rs4675528 +chr2 205482843 205482844 rs1877341 +chr2 205640580 205640581 rs759455 +chr2 205946210 205946211 rs7562683 +chr2 206279079 206279080 rs12694049 +chr2 206406073 206406074 rs4271750 +chr2 206644016 206644017 rs4673360 +chr2 206718490 206718491 rs1001110 +chr2 206861572 206861573 rs2042135 +chr2 206959659 206959660 rs11903403 +chr2 207056240 207056241 rs10932176 +chr2 207671811 207671812 rs2551968 +chr2 208086988 208086989 rs10932236 +chr2 208093025 208093026 rs896637 +chr2 208186861 208186862 rs7572263 +chr2 208571660 208571661 rs10497902 +chr2 209836376 209836377 rs6761179 +chr2 210571340 210571341 rs6714124 +chr2 210818262 210818263 rs12464940 +chr2 210964772 210964773 rs186471 +chr2 211572435 211572436 rs17335169 +chr2 212145580 212145581 rs1521658 +chr2 212482379 212482380 rs1482378 +chr2 212694504 212694505 rs7580519 +chr2 212933155 212933156 rs4672667 +chr2 213101083 213101084 rs10167348 +chr2 213175700 213175701 rs7573232 +chr2 213296796 213296797 rs11677793 +chr2 213952711 213952712 rs6719800 +chr2 214022297 214022298 rs11675561 +chr2 214203028 214203029 rs6435818 +chr2 214544445 214544446 rs10932543 +chr2 215766642 215766643 rs4674024 +chr2 215920964 215920965 rs10167212 +chr2 216322017 216322018 rs6728666 +chr2 216380220 216380221 rs4672798 +chr2 216532695 216532696 rs12624027 +chr2 216550907 216550908 rs1525610 +chr2 216559385 216559386 rs12463731 +chr2 216598718 216598719 rs7590938 +chr2 216669520 216669521 rs2067041 +chr2 216985693 216985694 rs1882421 +chr2 217057008 217057009 rs2888456 +chr2 217115709 217115710 rs12466929 +chr2 217249971 217249972 rs10932707 +chr2 217374157 217374158 rs12620884 +chr2 217799909 217799910 rs3747 +chr2 217809760 217809761 rs1035671 +chr2 217918096 217918097 rs13022785 +chr2 217929259 217929260 rs3791911 +chr2 218349916 218349917 rs13409846 +chr2 218365038 218365039 rs6745037 +chr2 219351126 219351127 rs9646859 +chr2 219574379 219574380 rs7588807 +chr2 219715825 219715826 rs678134 +chr2 219728791 219728792 rs10498067 +chr2 219925915 219925916 rs1007684 +chr2 219996871 219996872 rs995842 +chr2 220127421 220127422 rs13001386 +chr2 220529588 220529589 rs4234035 +chr2 220582362 220582363 rs1796432 +chr2 220617921 220617922 rs10932875 +chr2 220695041 220695042 rs1517443 +chr2 221180253 221180254 rs10084181 +chr2 221206544 221206545 rs1955117 +chr2 221285869 221285870 rs1991736 +chr2 221348322 221348323 rs6737417 +chr2 221657149 221657150 rs1519483 +chr2 222061960 222061961 rs348980 +chr2 222106554 222106555 rs6728176 +chr2 222291867 222291868 rs7600206 +chr2 222302990 222302991 rs6436310 +chr2 222439801 222439802 rs10168232 +chr2 222470355 222470356 rs11676701 +chr2 222487694 222487695 rs11676002 +chr2 222664938 222664939 rs4674677 +chr2 222790395 222790396 rs7589928 +chr2 222945547 222945548 rs6436364 +chr2 223158498 223158499 rs11899732 +chr2 223311112 223311113 rs1517628 +chr2 223543771 223543772 rs11675944 +chr2 223767471 223767472 rs686700 +chr2 223778673 223778674 rs631922 +chr2 223935298 223935299 rs6721089 +chr2 224018587 224018588 rs2037755 +chr2 224926361 224926362 rs6714466 +chr2 225289414 225289415 rs6743368 +chr2 225591744 225591745 rs1993323 +chr2 225797041 225797042 rs13413808 +chr2 226140633 226140634 rs6436602 +chr2 226664197 226664198 rs2707543 +chr2 226692470 226692471 rs2894608 +chr2 226699308 226699309 rs1922531 +chr2 227136463 227136464 rs2396453 +chr2 227423468 227423469 rs4673194 +chr2 227431427 227431428 rs11688520 +chr2 227616702 227616703 rs11889798 +chr2 227658423 227658424 rs12469987 +chr2 227769823 227769824 rs4284828 +chr2 227806706 227806707 rs11694155 +chr2 228174086 228174087 rs7570716 +chr2 228377714 228377715 rs13424461 +chr2 228916253 228916254 rs2396595 +chr2 229015182 229015183 rs12619625 +chr2 229055803 229055804 rs31276 +chr2 229098687 229098688 rs17676036 +chr2 229505397 229505398 rs10197959 +chr2 230130730 230130731 rs6436908 +chr2 230366635 230366636 rs6710287 +chr2 230393434 230393435 rs7590429 +chr2 230418995 230418996 rs9678342 +chr2 230568343 230568344 rs13418392 +chr2 230612507 230612508 rs4972964 +chr2 230992360 230992361 rs10933363 +chr2 231201937 231201938 rs753855 +chr2 231228583 231228584 rs1729077 +chr2 231616506 231616507 rs1865375 +chr2 232367353 232367354 rs1850593 +chr2 233210988 233210989 rs6431586 +chr2 233534302 233534303 rs4047189 +chr2 233595451 233595452 rs1597944 +chr2 233796742 233796743 rs741160 +chr2 233936300 233936301 rs12473889 +chr2 233971208 233971209 rs7605850 +chr2 233994449 233994450 rs4663998 +chr2 234024985 234024986 rs676546 +chr2 234033891 234033892 rs11684379 +chr2 234170978 234170979 rs6431234 +chr2 234303411 234303412 rs6733065 +chr2 234327966 234327967 rs1714945 +chr2 234522079 234522080 rs10803620 +chr2 234582493 234582494 rs7576760 +chr2 234662089 234662090 rs884062 +chr2 234820510 234820511 rs2014366 +chr2 234886450 234886451 rs4663517 +chr2 234886883 234886884 rs722161 +chr2 234900870 234900871 rs11684741 +chr2 235286066 235286067 rs1367882 +chr2 235549243 235549244 rs12475206 +chr2 235792176 235792177 rs12471567 +chr2 236109865 236109866 rs3768926 +chr2 236524888 236524889 rs1986988 +chr2 237032718 237032719 rs11690453 +chr2 237407365 237407366 rs13431876 +chr2 237665782 237665783 rs6758509 +chr2 237893143 237893144 rs6746771 +chr2 237897727 237897728 rs4663269 +chr2 238174334 238174335 rs2880132 +chr2 238534516 238534517 rs9287631 +chr2 238913514 238913515 rs4078406 +chr2 239001871 239001872 rs3935696 +chr2 239029298 239029299 rs6704807 +chr2 239336262 239336263 rs1399629 +chr2 239373273 239373274 rs2411843 +chr2 239498980 239498981 rs1796449 +chr2 239578742 239578743 rs10180205 +chr2 239668219 239668220 rs12612406 +chr2 239710933 239710934 rs1437731 +chr2 240145808 240145809 rs12695007 +chr2 240234096 240234097 rs903760 +chr2 240470038 240470039 rs3811624 +chr2 240531317 240531318 rs7607996 +chr2 240835648 240835649 rs11900363 +chr2 240859848 240859849 rs4538195 +chr2 240896014 240896015 rs10933514 +chr3 381334 381335 rs11706690 +chr3 1026551 1026552 rs17032419 +chr3 1101739 1101740 rs9878022 +chr3 1133890 1133891 rs4481145 +chr3 1210983 1210984 rs1391916 +chr3 1308230 1308231 rs4684882 +chr3 1399691 1399692 rs9875177 +chr3 1425990 1425991 rs7626838 +chr3 1547234 1547235 rs443052 +chr3 1649405 1649406 rs1914006 +chr3 1665828 1665829 rs9864375 +chr3 1835449 1835450 rs9860556 +chr3 2087149 2087150 rs2729277 +chr3 2153679 2153680 rs2727925 +chr3 2279407 2279408 rs13059227 +chr3 2385345 2385346 rs1827451 +chr3 2542691 2542692 rs7649181 +chr3 2559119 2559120 rs2046037 +chr3 2844842 2844843 rs17584516 +chr3 2854125 2854126 rs11712375 +chr3 2949935 2949936 rs10510242 +chr3 3049646 3049647 rs7649378 +chr3 3059102 3059103 rs163577 +chr3 3115126 3115127 rs2540078 +chr3 3116800 3116801 rs1153459 +chr3 3124222 3124223 rs1278150 +chr3 3236585 3236586 rs12633281 +chr3 3311028 3311029 rs4465931 +chr3 3541378 3541379 rs723168 +chr3 3919588 3919589 rs6776819 +chr3 4062241 4062242 rs795727 +chr3 4584512 4584513 rs6804671 +chr3 4604231 4604232 rs4684427 +chr3 4623880 4623881 rs2029665 +chr3 4830513 4830514 rs4685829 +chr3 4833106 4833107 rs11708908 +chr3 4936807 4936808 rs6764243 +chr3 4985212 4985213 rs11925620 +chr3 5302115 5302116 rs1995205 +chr3 5315846 5315847 rs398708 +chr3 5366616 5366617 rs10510302 +chr3 5451702 5451703 rs17042585 +chr3 6023041 6023042 rs6762892 +chr3 6040864 6040865 rs1914413 +chr3 6089510 6089511 rs7609589 +chr3 6650733 6650734 rs4686076 +chr3 6791847 6791848 rs10510341 +chr3 6820027 6820028 rs1400286 +chr3 6878130 6878131 rs421802 +chr3 6914046 6914047 rs9311966 +chr3 7469168 7469169 rs7623046 +chr3 7755804 7755805 rs161885 +chr3 8107008 8107009 rs6779176 +chr3 8151738 8151739 rs13061566 +chr3 8482634 8482635 rs10510390 +chr3 8606809 8606810 rs10510393 +chr3 8607952 8607953 rs873227 +chr3 8634091 8634092 rs11131140 +chr3 8634517 8634518 rs3774210 +chr3 8667518 8667519 rs2172557 +chr3 8712482 8712483 rs7634632 +chr3 8764263 8764264 rs237893 +chr3 8842315 8842316 rs7615763 +chr3 8882155 8882156 rs4389469 +chr3 9030601 9030602 rs1513315 +chr3 9039654 9039655 rs1162326 +chr3 9076103 9076104 rs9825026 +chr3 9116453 9116454 rs422552 +chr3 9234398 9234399 rs938116 +chr3 9258145 9258146 rs9861610 +chr3 9285602 9285603 rs12631463 +chr3 9515229 9515230 rs9818611 +chr3 9574455 9574456 rs2633789 +chr3 9628462 9628463 rs6797473 +chr3 10464959 10464960 rs13323090 +chr3 10483961 10483962 rs34892 +chr3 10624978 10624979 rs4684731 +chr3 10957807 10957808 rs4610207 +chr3 10979410 10979411 rs2930149 +chr3 11018160 11018161 rs2928078 +chr3 11024701 11024702 rs9879137 +chr3 11045357 11045358 rs11719708 +chr3 11055288 11055289 rs6763039 +chr3 11622501 11622502 rs9871522 +chr3 11757726 11757727 rs17661797 +chr3 11782844 11782845 rs2133060 +chr3 11871713 11871714 rs51578 +chr3_JH636055v2_alt 114746 114747 rs51578 +chr3 11972037 11972038 rs305491 +chr3_JH636055v2_alt 14459 14460 rs305491 +chr3 13011143 13011144 rs11712537 +chr3 13089708 13089709 rs12487324 +chr3 13141434 13141435 rs165435 +chr3 13639360 13639361 rs7610284 +chr3 14212086 14212087 rs4428160 +chr3 14249392 14249393 rs1871856 +chr3 14252671 14252672 rs2128163 +chr3 14323765 14323766 rs9851340 +chr3 14379738 14379739 rs10446439 +chr3 14409688 14409689 rs7647134 +chr3 14429402 14429403 rs748098 +chr3 14485029 14485030 rs1062540 +chr3 14486519 14486520 rs2341985 +chr3 14541415 14541416 rs11709154 +chr3 14614217 14614218 rs12495033 +chr3 14774245 14774246 rs829182 +chr3 15152628 15152629 rs1549983 +chr3 15299155 15299156 rs6442511 +chr3 15336678 15336679 rs3852037 +chr3 15408892 15408893 rs13075694 +chr3 15968968 15968969 rs10510444 +chr3 16060654 16060655 rs6442577 +chr3 16432824 16432825 rs4685337 +chr3 16528238 16528239 rs6774181 +chr3 18047612 18047613 rs7620376 +chr3 18272131 18272132 rs9837205 +chr3 18453808 18453809 rs714141 +chr3 18565678 18565679 rs336629 +chr3 18843688 18843689 rs11927855 +chr3 18890303 18890304 rs11717739 +chr3 19554409 19554410 rs7628760 +chr3 20187277 20187278 rs1995722 +chr3 20303883 20303884 rs6801666 +chr3_KI270783v1_alt 30486 30487 rs6801666 +chr3 20528880 20528881 rs1403651 +chr3 20676631 20676632 rs7630274 +chr3 20699150 20699151 rs17809619 +chr3 20903327 20903328 rs1498994 +chr3 21270294 21270295 rs6763061 +chr3 21313745 21313746 rs2661410 +chr3 21426170 21426171 rs341844 +chr3 21450446 21450447 rs424842 +chr3 21477652 21477653 rs6800260 +chr3 21536603 21536604 rs161196 +chr3 21730217 21730218 rs4440141 +chr3 21774973 21774974 rs11129021 +chr3 21869067 21869068 rs1679217 +chr3 21913891 21913892 rs259540 +chr3 22001018 22001019 rs9834074 +chr3 22062571 22062572 rs1817442 +chr3 22160660 22160661 rs10513638 +chr3 22306652 22306653 rs1494220 +chr3 22330961 22330962 rs1494227 +chr3 22392322 22392323 rs10510527 +chr3 22571302 22571303 rs6799349 +chr3 22603428 22603429 rs1870480 +chr3 23001545 23001546 rs512541 +chr3 23647709 23647710 rs4072410 +chr3 23743568 23743569 rs7651576 +chr3 23761155 23761156 rs3845923 +chr3 23792542 23792543 rs6791130 +chr3 24232486 24232487 rs7617186 +chr3 24288791 24288792 rs1868575 +chr3 24469761 24469762 rs982953 +chr3 24602081 24602082 rs12631757 +chr3 24716876 24716877 rs4858125 +chr3 24956020 24956021 rs6780762 +chr3 24995438 24995439 rs6550930 +chr3 25435920 25435921 rs7613553 +chr3 25439186 25439187 rs6550976 +chr3 25444264 25444265 rs12631063 +chr3 25467859 25467860 rs2033447 +chr3 25563609 25563610 rs17526839 +chr3 25572956 25572957 rs12635379 +chr3 26372591 26372592 rs1160717 +chr3 26645625 26645626 rs6767457 +chr3 26752026 26752027 rs1488248 +chr3 26839614 26839615 rs12635000 +chr3 27490304 27490305 rs11129290 +chr3 27622949 27622950 rs2370985 +chr3 27802086 27802087 rs7649139 +chr3 28008918 28008919 rs6551238 +chr3 28085103 28085104 rs1156909 +chr3 28408879 28408880 rs9310864 +chr3 28741865 28741866 rs2199411 +chr3 28820930 28820931 rs9883412 +chr3 29047507 29047508 rs6796246 +chr3 29172905 29172906 rs1020041 +chr3 29328285 29328286 rs4552314 +chr3 29330912 29330913 rs6777437 +chr3 29378640 29378641 rs4574243 +chr3 29532057 29532058 rs35911 +chr3 29721457 29721458 rs6783423 +chr3 29835895 29835896 rs10446421 +chr3 30150926 30150927 rs4680877 +chr3 30169614 30169615 rs2371997 +chr3 30274385 30274386 rs6549980 +chr3 30383792 30383793 rs6783860 +chr3 30489406 30489407 rs11917602 +chr3 31000965 31000966 rs1567025 +chr3 31025959 31025960 rs294314 +chr3 31231862 31231863 rs4955188 +chr3 31747791 31747792 rs2290531 +chr3 31884175 31884176 rs4438696 +chr3 31885314 31885315 rs4478116 +chr3 31892126 31892127 rs4334675 +chr3 32024233 32024234 rs2880339 +chr3 32194565 32194566 rs4440157 +chr3 32237472 32237473 rs9837923 +chr3 32346508 32346509 rs749948 +chr3 32376151 32376152 rs4364205 +chr3 32413588 32413589 rs614004 +chr3 32424256 32424257 rs9810960 +chr3 32456081 32456082 rs3888882 +chr3 32871600 32871601 rs6550169 +chr3 33007659 33007660 rs1133253 +chr3 33230200 33230201 rs4455284 +chr3 33932679 33932680 rs11916425 +chr3 33943828 33943829 rs4588312 +chr3 35987827 35987828 rs9809050 +chr3 36435623 36435624 rs1598529 +chr3 36447002 36447003 rs870445 +chr3 36758765 36758766 rs7620657 +chr3 36784659 36784660 rs7624701 +chr3 36787166 36787167 rs4075977 +chr3 37548644 37548645 rs6785634 +chr3 37791895 37791896 rs11129771 +chr3 37921198 37921199 rs9869652 +chr3 38088621 38088622 rs2236630 +chr3 38219545 38219546 rs1384006 +chr3 38285800 38285801 rs4679028 +chr3 38482871 38482872 rs503327 +chr3 39207360 39207361 rs12632771 +chr3 39241431 39241432 rs7619161 +chr3 40858429 40858430 rs6807519 +chr3 40985846 40985847 rs4276160 +chr3 41438555 41438556 rs7627972 +chr3 42363857 42363858 rs26352 +chr3 43173185 43173186 rs938922 +chr3 43658799 43658800 rs4432612 +chr3 44099664 44099665 rs6800118 +chr3 44134394 44134395 rs4234441 +chr3 44155765 44155766 rs7626631 diff --git a/bin/mpdSetup.sh b/bin/mpdSetup.sh new file mode 100644 index 0000000..2b6e137 --- /dev/null +++ b/bin/mpdSetup.sh @@ -0,0 +1,38 @@ +#!/usr/bin/sh + +git clone git@github.com:wingolab-org/mpd-c.git +cd mpd-c +make +cd ~/bin +sudo ln -sv ~/mpd-c/bin/* . + +# get isPcr from UCSC / Jim Kent +sudo yum install mysql-devel libpng-devel libstdc++-devel zlib-devel +export MACHTYPE=x86_64 +git clone git://genome-source.cse.ucsc.edu/kent.git + +# NOTE: +# 1) Here is what you need to change in the make /src/inc/common.mk +# to enable building on AMS. +# [ec2-user@ip-172-31-55-133 kent]$ git diff +# diff --git a/src/inc/common.mk b/src/inc/common.mk +# index 1204208..e2416eb 100644 +# --- a/src/inc/common.mk +# +++ b/src/inc/common.mk +# @@ -25,7 +25,7 @@ UNAME_S := $(shell uname -s) +# FULLWARN = $(shell uname -n) +# +# #global external libraries +# -L=$(kentSrc)/htslib/libhts.a +# +L=$(kentSrc)/htslib/libhts.a -lz +# +# # pthreads is required +# ifneq ($(UNAME_S),Darwin) +# 2) binaries are installed to: /home/ec2-user/kent/src/lib/x86_64/ + +cd jkOwnLib +make +cd .. +make blatSuite + + diff --git a/bin/primerToBed.pl b/bin/primerToBed.pl new file mode 100755 index 0000000..86044e8 --- /dev/null +++ b/bin/primerToBed.pl @@ -0,0 +1,34 @@ +#!/usr/bin/env perl +# Name: primerToBed.pl +# Date Created: Fri May 20 15:33:41 2016 +# Date Modified: Fri May 20 15:33:41 2016 +# By: TS Wingo +# +# Description: + +use 5.10.0; +use warnings; +use strict; + +use Getopt::Long; +use Path::Tiny; +use Data::Dump qw/ dump /; + +use MPD::Primer; + +# variables +my ( $verbose, $act, $file_name, $out_ext ); + +# get options +die "Usage: $0 [-v] [-a] -f -o \n" + unless GetOptions( + 'v|verbose' => \$verbose, + 'a|act' => \$act, + 'f|file=s' => \$file_name, + 'o|out=s' => \$out_ext, + ) and $file_name; +$verbose++ unless $act; + +my $primer = MPD::Primer->new($file_name); +$primer->WriteBedFile("$out_ext.bed"); + diff --git a/bin/primerToUniqBed.pl b/bin/primerToUniqBed.pl new file mode 100755 index 0000000..eae5f5b --- /dev/null +++ b/bin/primerToUniqBed.pl @@ -0,0 +1,82 @@ +#!/usr/bin/env perl +# Name: primerToUniqBed.pl +# Date Created: Mon May 23 10:52:00 2016 +# Date Modified: Mon May 23 10:52:00 2016 +# By: TS Wingo +# +# Description: + +use lib '../lib'; +use 5.10.0; +use warnings; +use strict; + +use Getopt::Long; +use Path::Tiny; +use Data::Dump qw/ dump /; +use MPD::Primer; +use MPD::isPcr; +use MPD::Psl; + +# variables +my ( $TwoBitFile, $isPcrBin, $file_name, $out_ext ); + +# get options +die + "Usage: $0 -f -o --isPcr --twoBit \n" + unless GetOptions( + 'f|file=s' => \$file_name, + 'isPcr=s' => \$isPcrBin, + 'twoBit=s' => \$TwoBitFile, + 'o|out=s' => \$out_ext, + ) + and $isPcrBin + and $TwoBitFile + and $file_name; + +my $primer = UniqPrimers($file_name); +if ( !defined $primer ) { + say "All duplicate primers."; + exit(1); +} +$primer->WriteBedFileLetter("$out_ext.bed"); + +# UniqPrimers calls isPcr to filter away primers that amplify >1 thing in the +# genome based on isPcr's rules and any duplicates from the MPD program +# stolen from MPD::PrimerDesign +sub UniqPrimers { + my $primerFile = shift; + + my $primerPath = path($primerFile); + my $tempFile = Path::Tiny->tempfile(); + my $isPcr = MPD::isPcr->new( + { + PrimerFile => $primerPath->stringify, + PrimerFileFormat => 'mpp', + isPcrBinary => $isPcrBin, + TwoBitFile => $TwoBitFile, + OutFile => $tempFile, + } + ); + + if ( !$isPcr->Run() ) { + return; + } + + my %badPrimers; + + # Remove Degenerate primers + my $psl = MPD::Psl->new( $tempFile->stringify() ); + my $dupAref = $psl->DegenerateMatches(); + $badPrimers{$_}++ for @$dupAref; + + # remove duplicates sometimes introduced by the design process + my $primerObj = MPD::Primer->new( $primerPath->stringify() ); + $dupAref = $primerObj->DuplicatePrimers(); + $badPrimers{$_}++ for @$dupAref; + + if ( !%badPrimers ) { + return $primerObj; + } + return $primerObj->RemovePrimers( [ sort keys %badPrimers ] ); +} diff --git a/config/config.yaml b/config/config.yaml new file mode 100644 index 0000000..f7c2b2d --- /dev/null +++ b/config/config.yaml @@ -0,0 +1,81 @@ +Core: + isPcrBinary: + val: /home/ec2-user/bin/x86_64/isPcr + type: str + TwoBitFile: + val: /mnt/mpd-dat/2bit/hg38.2bit + type: str + MpdBinary: + val: /home/ec2-user/bin/mpd + type: str + MpdIdx: + val: hg38.d14.sdx + type: str + dbSnpIdx: + val: ds_flat.sdx + type: str + +User: + Basic: + CoverageThreshold: + val: 0.8 + type: int + PrimerSizeMin: + val: 17 + type: int + PrimerSizeMax: + val: 27 + type: int + PadSize: + val: 60 + type: int + PoolMax: + val: 10 + type: int + PoolMin: + val: 5 + type: int + AmpSizeMax: + val: 260 + type: int + AmpSizeMin: + val: 230 + type: int + TmMax: + val: 62 + type: float + TmMin: + val: 57 + type: float + GcMax: + val: 0.7 + type: float + GcMin: + val: 0.3 + type: float + Iter: + val: 2 + type: int + IncrTm: + val: 1 + type: int + IncrTmStep: + val: 1 + type: int + IncrAmpSize: + val: 10 + type: int + + Advanced: + FwdAdapter: + val: ACACTGACGACATGGTTCTACA + type: str + RevAdapter: + val: TACGGTAGCAGAGACTTGGTCT + type: str + Offset: + val: 0 + type: bool + Randomize: + val: 1 + type: bool \ No newline at end of file diff --git a/config/hg38.yml b/config/hg38.yml new file mode 100644 index 0000000..3d94dca --- /dev/null +++ b/config/hg38.yml @@ -0,0 +1,81 @@ +Core: + isPcrBinary: + val: ~/bin/x86_64/isPcr + type: str + TwoBitFile: + val: ~/2bit/hg38.2bit + type: str + MpdBinary: + val: ~/mpd-c/bin/mpd + type: str + MpdIdx: + val: ~/mpd-dat/hg38.d14.sdx + type: str + dbSnpIdx: + val: ~/mpd-dat/ds_flat.sdx + type: str + +User: + Basic: + CoverageThreshold: + val: 0.8 + type: int + PrimerSizeMin: + val: 17 + type: int + PrimerSizeMax: + val: 27 + type: int + PadSize: + val: 60 + type: int + PoolMax: + val: 10 + type: int + PoolMin: + val: 5 + type: int + AmpSizeMax: + val: 260 + type: int + AmpSizeMin: + val: 230 + type: int + TmMax: + val: 62 + type: float + TmMin: + val: 57 + type: float + GcMax: + val: 0.7 + type: float + GcMin: + val: 0.3 + type: float + Iter: + val: 2 + type: int + IncrTm: + val: 1 + type: int + IncrTmStep: + val: 1 + type: int + IncrAmpSize: + val: 10 + type: int + + Advanced: + FwdAdapter: + val: ACACTGACGACATGGTTCTACA + type: str + RevAdapter: + val: TACGGTAGCAGAGACTTGGTCT + type: str + Offset: + val: 0 + type: bool + Randomize: + val: 1 + type: bool diff --git a/config/queue.yaml b/config/queue.yaml new file mode 100644 index 0000000..5de817a --- /dev/null +++ b/config/queue.yaml @@ -0,0 +1,7 @@ +beanstalkd: + host: 172.31.61.62 + port: 11300 + tubes: + annotation: + submission: mpd + events: mpd_events diff --git a/config/web/hg38.yml b/config/web/hg38.yml new file mode 100644 index 0000000..261139f --- /dev/null +++ b/config/web/hg38.yml @@ -0,0 +1,118 @@ +Core: + Act: 1 + isPcrBinary: /home/ec2-user/bin/x86_64/isPcr + TwoBitFile: /mnt/mpd-dat/2bit/hg38.2bit + MpdBinary: /home/ec2-user/bin/mpd + MpdIdx: hg38.d14.sdx + dbSnpIdx: ds_flat.sdx + RunIsPcr: 0 +User: + Basic: + - + name: CoverageThreshold + val: 0.8 + type: int + desc: "Required target coverage percentage" + - + name: AmpSizeMax + val: 260 + type: int + max: 1000 + desc: "Maximum amplicon size for each PCR reaction (max value: 1000)." + - + name: AmpSizeMin + val: 230 + type: int + min: 100 + desc: "Minimum amplicon size for each PCR reaction (min value: 100)." + - + name: PoolMax + val: 10 + type: int + desc: "Maximum number of primers in a pool (max value: 10)." + max: 10 + - + name: PoolMin + val: 5 + type: int + desc: "Minimum number of primers in a pool (min value: 3)." + + Advanced: + - + name: PadSize + val: 60 + type: int + desc: "Size of the flanking region that is used to design the primer." + - + name: PrimerSizeMin + val: 17 + type: int + desc: "Minimum primer size (in base pairs)." + - + name: PrimerSizeMax + val: 27 + type: int + desc: "Maximum primer size (in base pairs)." + - + name: TmMax + val: 62 + type: float + desc: "Maximum primer melting temperature (Tm)." + - + name: TmMin + val: 57 + type: float + desc: "Maximum primer melting temperature (Tm)." + - + name: GcMax + val: 0.7 + type: float + max: 1 + min: 0 + desc: "Maximum primer percent GC content." + - + name: GcMin + val: 0.3 + type: float + max: 1 + min: 0 + desc: "Minimum percent primer GC content." + - + name: IterMax + val: 2 + type: int + desc: "Maximum number of iterations used to find the best primers." + - + name: IncrTm + val: 1 + type: int + desc: "How many times to increment melting temperature." + - + name: IncrTmStep + val: 1 + type: int + desc: "By how much to increment melting temperature." + - + name: IncrAmpSize + val: 10 + type: int + desc: "If a primer isn't found for the AmpSize, iterate by this length." + + - min: 3 + name: FwdAdapter + val: ACACTGACGACATGGTTCTACA + type: str + desc: "Forward adapter sequence" + - + name: RevAdapter + val: TACGGTAGCAGAGACTTGGTCT + type: str + desc: "Reverse adapter sequence" + # - name: Offset + # val: 0 + # type: bool + - + name: Randomize + val: true + type: bool + desc: "To minimize batch effects, plate primer pools in random order" \ No newline at end of file diff --git a/cpanfile b/cpanfile new file mode 100644 index 0000000..3ef800c --- /dev/null +++ b/cpanfile @@ -0,0 +1,12 @@ +requires 'Beanstalk::Client'; +requires 'Parallel::ForkManager'; +requires 'Cpanel::JSON::XS'; +requires 'DDP'; +requires 'Getopt::Long'; +requires 'File::Basename'; +requires 'Log::Any::Adapter'; +requires 'Log::Fast'; +requires 'Path::Tiny'; +requires 'Try::Tiny'; +requires 'Hash::Merge::Simple'; +requires 'YAML::XS'; \ No newline at end of file diff --git a/ex/config.yaml b/ex/config.yaml index 727a440..4340076 100644 --- a/ex/config.yaml +++ b/ex/config.yaml @@ -1,8 +1,8 @@ --- BedFile: ex/markers.txt.bed -isPcrBinary: isPcr -TwoBitFile: hg38.2bit -MpdBinary: ../mpd-c/build/mpd +isPcrBinary: /home/ec2-user/bin/x86_64/isPcr +TwoBitFile: /mnt/annnotator/2bit/hg38.2bit +MpdBinary: /home/ec2-user/bin/mpd MpdIdx: hg38.d14.sdx dbSnpIdx: ds_flat.sdx diff --git a/ex/design.pl b/ex/design.pl index 340c2f7..be49108 100755 --- a/ex/design.pl +++ b/ex/design.pl @@ -6,11 +6,15 @@ # # Description: +use lib '/Users/twingo/software/mpd-perl/lib/'; use 5.10.0; use warnings; use strict; use Getopt::Long; use Path::Tiny; + +use lib '../lib'; + use MPD; # variables diff --git a/ex/primerToUniqBed.pl b/ex/primerToUniqBed.pl index 4de088c..eae5f5b 100755 --- a/ex/primerToUniqBed.pl +++ b/ex/primerToUniqBed.pl @@ -6,7 +6,7 @@ # # Description: -use lib '/home/twingo/software/mpd-perl/lib'; +use lib '../lib'; use 5.10.0; use warnings; use strict; diff --git a/lib/MPD.pm b/lib/MPD.pm index 6f805b7..770c478 100644 --- a/lib/MPD.pm +++ b/lib/MPD.pm @@ -8,16 +8,15 @@ use Moose 2; use MooseX::Types::Path::Tiny qw/ AbsPath AbsFile File /; use namespace::autoclean; -use Carp qw/ croak /; use Excel::Writer::XLSX; -use JSON; +use Cpanel::JSON::XS; use Path::Tiny; use Scalar::Util qw/ blessed reftype /; use Type::Params qw/ compile /; use Types::Standard qw/ :types /; use Time::localtime; use Try::Tiny; - +use DDP output => 'stdout'; use Data::Dump qw/ dump /; # for debugging use MPD::isPcr; @@ -27,8 +26,9 @@ use MPD::PrimerDesign; our $VERSION = '0.001'; my $time_now = ctime(); +use Scalar::Util qw/looks_like_number/; -with 'MPD::Role::ConfigFromFile'; +with 'MPD::Role::ConfigFromFile', 'MPD::Role::Message', 'MPD::Role::IO'; # attr for necessary data files has BedFile => ( is => 'ro', isa => AbsFile, coerce => 1, required => 1, ); @@ -41,12 +41,12 @@ has dbSnpIdx => ( is => 'ro', isa => File, coerce => 1, required => 1, ); has OutExt => ( is => 'ro', isa => 'Str', required => 1, ); has OutDir => ( is => 'ro', isa => AbsPath, coerce => 1, required => 1, ); has Debug => ( is => 'ro', isa => 'Bool', default => 0 ); -has RunIsPcr => ( is => 'ro', isa => 'Bool', default => 1 ); +has RunIsPcr => ( is => 'ro', isa => 'Bool', default => 0 ); has Act => ( is => 'ro', isa => 'Bool', default => 0 ); # attr for parameter optimization has CoverageThreshold => ( is => 'ro', isa => 'Num', default => 0.5, required => 1 ); -has IncrAmpSize => ( is => 'ro', isa => 'Int', default => 10, required => 1 ); +has IncrAmpSize => ( is => 'ro', isa => 'Int', default => 10, required => 1 ); has IncrTm => ( is => 'ro', isa => 'Num', default => 0.5, required => 1 ); has IncrTmStep => ( is => 'ro', isa => 'Num', default => 0.5, required => 1 ); has IterMax => ( is => 'ro', isa => 'Int', default => 10, required => 1 ); @@ -65,6 +65,37 @@ has PoolMin => ( is => 'ro', isa => 'Int', default => 1, required => 1 ) has TmStep => ( is => 'rw', isa => 'Num', default => 0.5, required => 1 ); has PadSize => ( is => 'ro', isa => 'Int', default => 60, required => 1 ); +# max and min allowed parameter values +my %ParmsMax = ( + PrimerSizeMin => 30, + PrimerSizeMax => 30, + AmpSizeMin => 1000, + AmpSizeMax => 1000, + GcMin => 0.8, + GcMax => 0.8, + TmMin => 75, + TmMax => 75, + PoolMax => 10, + PoolMin => 10, + TmStep => 4, + PadSize => 200, +); + +my %ParmsMin = ( + PrimerSizeMin => 17, + PrimerSizeMax => 17, + AmpSizeMin => 100, + AmpSizeMax => 100, + GcMin => 0.3, + GcMax => 0.3, + TmMin => 50, + TmMax => 50, + PoolMax => 1, + PoolMin => 1, + TmStep => 0.5, + PadSize => 60, +); + # regions that are uncovered _after_ initial trial has UnCovered => ( is => 'rw', isa => 'Maybe[MPD::Bed]', default => sub { } ); @@ -125,64 +156,224 @@ has KeepPrimers => ( default => sub { [] }, ); +has verbose => ( is => 'ro', default => 1 ); + +has publisher => ( is => 'ro' ); + +has compress => (is => 'ro', default => 0); + +sub BUILDARGS { + my ($class, $data) = @_; + + for my $d (keys %$data) { + if(!looks_like_number($data->{$d}) && $data->{$d} eq '') { + delete $data->{$d}; + } + } + + return $data +} + +sub BUILD { + my $self = shift; + + if ( $self->publisher ) { + $self->setPublisher( $self->publisher ); + } + + $self->setLogPath( + path( $self->OutDir )->child( $self->OutExt . ".log" )->stringify ); + + if ( $self->Debug ) { + $self->setLogLevel('DEBUG'); + } + + if ( $self->verbose ) { + $self->setVerbosity(1); + } +} + sub RunAll { my $self = shift; - $self->FindBestCoverage(1); - return $self->PrintPrimerData( $self->OutExt ); + my $ok = $self->FindBestCoverage( $self->Act ); + if ( !$ok ) { + $self->log( 'warn', + sprintf( "Return from primer design before %d iteration", $self->IterMax ) ); + } + + # Returns json string + my $json = $self->PrintPrimerData( $self->OutExt, 1 ); + + my $compressPath; + if($self->compress) { + $compressPath = $self->compressPath( $self->OutDir->child($self->OutExt) ); + } + + say "compress path is " . $self->OutDir->child($self->OutExt)->stringify; + p $compressPath; + + return ($compressPath, $json); } sub PrintPrimerData { - state $check = compile( Object, Str ); - my ( $self, $OutExt ) = $check->(@_); + state $check = compile( Object, Str, Bool ); + my ( $self, $OutExt, $printJson ) = $check->(@_); - if ( !$self->no_primer ) { + if ( $self->no_primer ) { + $self->log( 'warn', 'No Primers written. This might be a dry run.' ); + return; + } - if ( $self->Debug ) { - say "Writing final primer design."; - } + if ( $self->Debug ) { + say "Writing final primer design."; + } - my $p = MPD::Primer->new( $self->KeepPrimers ); - my $dupAref = $p->DuplicatePrimers(); - $p = $p->RemovePrimers($dupAref); + my $p = MPD::Primer->new( $self->KeepPrimers ); + my $dupAref = $p->DuplicatePrimers(); + $p = $p->RemovePrimers($dupAref); - # order file goes first so that we upate the primers with the - # names of the regions in the bedfile, if there are any. - my $forOrderPt = $self->OutDir->child( sprintf( "%s.forOrder.xlsx", $OutExt ) ); - $p->WriteOrderFile( $forOrderPt->stringify, $self->_prnOpt ); + # order file goes first so that we upate the primers with the + # names of the regions in the bedfile, if there are any. + my $forOrderPt = $self->OutDir->child( sprintf( "%s.forOrder.xlsx", $OutExt ) ); + $p->WriteOrderFile( $forOrderPt->stringify, $self->_prnOpt ); - my $coveredPt = $self->OutDir->child( sprintf( "%s.covered.bed", $OutExt ) ); - $p->WriteCoveredFile( $coveredPt->stringify, $self->Bed ); + my $coveredPt = $self->OutDir->child( sprintf( "%s.covered.bed", $OutExt ) ); + $p->WriteCoveredFile( $coveredPt->stringify, $self->Bed ); - my $uncoveredPt = $self->OutDir->child( sprintf( "%s.uncovered.bed", $OutExt ) ); - $p->WriteUncoveredFile( $uncoveredPt->stringify, $self->Bed ); + my $uncoveredPt = $self->OutDir->child( sprintf( "%s.uncovered.bed", $OutExt ) ); + $p->WriteUncoveredFile( $uncoveredPt->stringify, $self->Bed ); - my $primerPt = $self->OutDir->child( sprintf( "%s.primer.txt", $OutExt ) ); - $p->WritePrimerFile( $primerPt->stringify ); + my $primerPt = $self->OutDir->child( sprintf( "%s.primer.txt", $OutExt ) ); + $p->WritePrimerFile( $primerPt->stringify ); - my $isPcrPt = $self->OutDir->child( sprintf( "%s.isPcr.txt", $OutExt ) ); - $p->WriteIsPcrFile( $isPcrPt->stringify ); - } - else { - say "No Primers written. This might be a dry run."; - } + my $isPcrPt = $self->OutDir->child( sprintf( "%s.isPcr.txt", $OutExt ) ); + $p->WriteIsPcrFile( $isPcrPt->stringify ); + +# my $compressPath; +# if($self->compress) { +# $compressPath = $self->compressPath( $self->OutDir->child($OutExt) ); +# } + +# say "compress path is " . $self->OutDir->child($OutExt)->stringify; +# p $compressPath; + + if($printJson) { + return $p->MakeCoveredJsonString( $self->Bed ); + } + + return; } -# FindBestCoverage - for testing purposes + +# FindBestCoverage performs the primer design for a number of specified +# iterations. Before each primer design attempt the objects PCR parameters +# are vaildated. If the function exits before IterMax then it returns undef +# otherwise it returns 1. sub FindBestCoverage { my ( $self, $act ) = @_; + my $iterTotal = $self->IterMax + 1; + while ( $self->_Iter < $self->IterMax ) { + my ( $ok, $msg ) = $self->_validatePcrParams; + if ( !$ok ) { + $self->log( 'warn', + sprintf( "Stopping at iteration %d because %s", $self->_Iter, $msg ) ); + return; + } + $self->_runPrimerDesign( $self->PoolMin ); + $self->_incrAmpSize; + ( $ok, $msg ) = $self->_validatePcrParams; + if ( !$ok ) { + $self->log( 'warn', + sprintf( "Stopping at iteration %d because %s", $self->_Iter, $msg ) ); + return; + } + $self->_runPrimerDesign( $self->PoolMin ); + $self->_incrTm; + ( $ok, $msg ) = $self->_validatePcrParams; + if ( !$ok ) { + $self->log( 'warn', + sprintf( "Stopping at iteration %d because %s", $self->_Iter, $msg ) ); + return; + } + $self->_runPrimerDesign( $self->PoolMin ); + $self->_incrTmStep; + ( $ok, $msg ) = $self->_validatePcrParams; + if ( !$ok ) { + $self->log( 'warn', + sprintf( "Stopping at iteration %d because %s", $self->_Iter, $msg ) ); + return; + } + $self->_runPrimerDesign( $self->PoolMin ); $self->_incrIter; + + $self->publishProgress( $self->_Iter ); + } + return 1; +} + +# _validatePcrParams() validates the object's PCR parameters and returns an +# array with the first value as the success code and the second as the string +# of error messages, if any. +sub _validatePcrParams { + my $self = shift; + + my @fail; + + for my $attr ( sort keys %ParmsMin ) { + if ( $self->$attr < $ParmsMin{$attr} ) { + push @fail, + sprintf( "%s (%d) < minimum (%d)", $attr, $self->$attr, $ParmsMin{$attr} ); + } + elsif ( $self->$attr > $ParmsMax{$attr} ) { + push @fail, + sprintf( "%s (%d) > maximum (%d)", $attr, $self->$attr, $ParmsMax{$attr} ); + } + elsif ( $attr eq "PrimerSizeMin" ) { + if ( $self->$attr > $self->PrimerSizeMax ) { + push @fail, + sprintf( "%s (%d) < PrimerSizeMax (%d)", + $attr, $self->$attr, $self->PrimerSizeMax ); + } + } + elsif ( $attr eq "GcMin" ) { + if ( $self->$attr > $self->GcMax ) { + push @fail, sprintf( "%s (%d) > GcMax (%d)", $attr, $self->$attr, $self->GcMax ); + } + } + elsif ( $attr eq "TmMin" ) { + if ( $self->$attr > $self->TmMax ) { + push @fail, sprintf( "%s (%d) > TmMax (%d)", $attr, $self->$attr, $self->TmMax ); + } + } + elsif ( $attr eq "PoolMax" ) { + if ( $self->$attr < $self->PoolMin ) { + push @fail, sprintf( "%s (%d) < PoolMin (%d)", $attr, $self->$attr, $self->PoolMin ); + } + } + elsif ( $attr eq "PadSize" ) { + if ( $self->$attr < $self->PrimerSizeMin ) { + push @fail, + sprintf( "%s (%d) < PrimerSizeMin (%d)", + $attr, $self->$attr, $self->PrimerSizeMin ); + } + } + } + if ( scalar @fail > 0 ) { + # output message + return ( undef, join "\n", @fail ); + } + else { + return ( 1, "" ); } - $self->_runPrimerDesign(1); - return $self->PrintPrimerData( $self->OutExt ); } sub _build_Bed { @@ -206,11 +397,11 @@ sub _pcrParams { } if ( $self->UnCovered() ) { - say "PCR Params: using uncovered bed data"; + $self->log( 'info', "PCR Params: using uncovered bed data" ); $attrs{Bed} = $self->UnCovered(); } else { - say "PCR Params: using original bed data"; + $self->log( 'info', "PCR Params: using original bed data" ); $attrs{Bed} = $self->Bed(); } say "======================" if $self->Debug; @@ -253,7 +444,7 @@ sub _incrTm { sub _incrTmStep { my $self = shift; my $tmIncr = $self->TmStep; - $tmIncr += $self->TmStep; + $tmIncr += $self->IncrTmStep; $self->TmStep($tmIncr); } @@ -323,9 +514,7 @@ sub _keepPoolPrimers { my $self = shift; if ( $self->no_pool ) { - my $msg = "no pooled primers"; - say $msg; - return; + return $self->log( 'info', "no pooled primers" ); } for my $aref ( $self->all_pools ) { @@ -352,7 +541,7 @@ sub _updateUncovered { my $uncoveredBedObj = $primerObj->BedUncovered( $primerDesignHref->{Bed} ); $self->_printPrimerSummary( $primerObj, '_uncovered()' ) if $self->Debug; $self->UnCovered($uncoveredBedObj); - $self->PrintPrimerData( $self->_Iter ); + $self->PrintPrimerData( $self->_Iter, 0 ); } # for debugging @@ -374,28 +563,28 @@ sub _saveJsonData { sub _printPrimerSummary { my ( $self, $primer, $labelStr ) = @_; - say $labelStr; + $self->log( 'info', $labelStr ); if ( !defined $primer ) { - say ">> No Primers <<"; + $self->log( 'info', ">> No Primers <<" ); } elsif ( reftype $primer eq 'ARRAY' ) { my $count = 1; for my $primerObj (@$primer) { - say "--- Primer Group $count ---"; - say $primerObj->Summarize_as_str(); + $self->log( 'info', "--- Primer Group $count ---" ); + $self->log( 'info', $primerObj->Summarize_as_str() ); $count++; } } elsif ( blessed $primer eq 'MPD::Primer' ) { - say $primer->Summarize_as_str(); + $self->log( 'info', $primer->Summarize_as_str() ); } else { - my $msg = "unrecognized thing to print"; - croak $msg; + $self->log( 'fatal', "unrecognized thing to print" ); } } __PACKAGE__->meta->make_immutable; 1; + diff --git a/lib/MPD/Bed.pm b/lib/MPD/Bed.pm index 9e83a51..55f8b0d 100644 --- a/lib/MPD/Bed.pm +++ b/lib/MPD/Bed.pm @@ -8,17 +8,17 @@ use Moose 2; use MooseX::Types::Path::Tiny qw/ AbsPath AbsFile File /; use namespace::autoclean; -use Carp qw/ croak /; use Type::Params qw/ compile /; use Types::Standard qw/ :types /; use Scalar::Util qw/ reftype /; use Path::Tiny; use Try::Tiny; - use Data::Dump qw/ dump /; # for debugging use MPD::Bed::Raw; +with 'MPD::Role::Message'; + our $VERSION = '0.001'; has BedFile => ( is => 'ro', isa => AbsPath, coerce => 1 ); @@ -133,13 +133,31 @@ sub SiteNames { # _processBedFile returns a matrix of the bedfile coordinates sub _processBedFile { state $check = compile( Str, Str ); - my ( $class, $bedFile ) = $check->(@_); + my ( $self, $bedFile ) = $check->(@_); my @array; my @lines = path($bedFile)->lines( { chomp => 1 } ); + + if(@lines > 400000) { + $self->log('fatal', "Sorry! Currently we support a maximum of 400,000 primer pairs/targets"); + } + + my $id = 0; + my $row = 0; for my $line (@lines) { my @fields = split /\t/, $line; + + if(@fields == 1) { + # allow header to be present + # many, many files that fail, fail for this reason + if($row == 0) { + $row++; + next; + } + $self->log( 'fatal', "Bedfile must be tab delimited"); + } + my ( $chr, $start, $stop, $name ) = @fields; if ( defined $chr && defined $start && defined $stop ) { @@ -159,6 +177,13 @@ sub _processBedFile { $chr = 25; } + if(length($name) > 18) { + $name = substr($name, 0, 17) . "_$id"; + } + + $id++; + + # TODO: This is the mechanism for catching fatal errors from MPD:Bed:Raw try { my $b = MPD::Bed::Raw->new( { @@ -171,22 +196,21 @@ sub _processBedFile { push @array, $b; } catch { - my $msg = "In bedfile, '$bedFile', ignoring line: $line"; - say $msg; + # $self->log( 'info', "ignoring line: $line" ); }; } else { - my $msg = sprintf( "Error Bedfile missing chr, start, or stop: %s", $line ); + $self->log( 'fatal', sprintf( "Bedfile missing chr, start, or stop: %s", $line ) ); } } - return $class->_processBedObjs( \@array ); + return $self->_processBedObjs( \@array ); } # _processBedObjs returns a matrix of the bedfile coordinates sub _processBedObjs { state $check = compile( Str, ArrayRef ); - my ( $class, $bedObjAref ) = $check->(@_); + my ( $self, $bedObjAref ) = $check->(@_); my %sites; @@ -196,13 +220,13 @@ sub _processBedObjs { $sites{$chr}{$i} = $b->Name; } } - return $class->_bedSites( \%sites ); + return $self->_bedSites( \%sites ); } # _bedSites takes a hash of sites and creates a unique bedfile as an arrayref sub _bedSites { state $check = compile( Str, HashRef ); - my ( $class, $sitesHref ) = $check->(@_); + my ( $self, $sitesHref ) = $check->(@_); my ( %coveredSite, %coveredChr, @bed ); my @chrs = ( 1 .. 26, 'M', 'X', 'Y' ); @@ -279,13 +303,13 @@ sub BUILDARGS { return $class->SUPER::BUILDARGS( $_[0] ); } else { - my $msg = "Error: Construct MPD::Bed object with either a hashref or bed file"; - croak($msg); + return $class->log( 'fatal', + "Construct MPD::Bed object with either a hashref or bed file" ); } } else { - my $msg = "Error: Construct MPD::Bed object with either a hashref or bed file"; - croak($msg); + return $class->log( 'fatal', + "Construct MPD::Bed object with either a hashref or bed file" ); } } diff --git a/lib/MPD/Bed/Raw.pm b/lib/MPD/Bed/Raw.pm index 19398d0..f3a7e1a 100644 --- a/lib/MPD/Bed/Raw.pm +++ b/lib/MPD/Bed/Raw.pm @@ -8,10 +8,10 @@ use 5.10.0; use Moose 2; use namespace::autoclean; -use Carp qw/ croak /; - our $VERSION = '0.001'; +with "MPD::Role::Message"; + has Chr => ( is => 'ro', isa => 'Int', required => 1, ); has Start => ( is => 'ro', isa => 'Int', required => 1, ); has End => ( is => 'ro', isa => 'Int', required => 1, ); @@ -58,12 +58,17 @@ sub BUILD { if ( $self->Start > $self->End ) { my $msg = sprintf( "Error: Bed entry, start > stop: %s:%s-%s", $self->Chr, $self->Start, $self->End ); - croak $msg; + return $self->log( 'fatal', $msg ); + } + if ( $self->Size > 2000 ) { + my $msg = sprintf( "Error: Bed entry, target is >2000bp: %s:%s-%s", + $self->Chr, $self->Start, $self->End ); + return $self->log( 'fatal', $msg ); } if ( $self->Size == 0 ) { my $msg = sprintf( "Warn: Bed entry, start == stop: %s:%s-%s", $self->Chr, $self->Start, $self->End ); - say STDERR $msg; + $self->log( 'warn', $msg ); } } diff --git a/lib/MPD/Primer.pm b/lib/MPD/Primer.pm index cde9d64..c5ac37e 100644 --- a/lib/MPD/Primer.pm +++ b/lib/MPD/Primer.pm @@ -7,9 +7,8 @@ use 5.10.0; use Moose 2; use namespace::autoclean; -use Carp qw/ croak /; use Excel::Writer::XLSX; -use JSON; +use Cpanel::JSON::XS; use Path::Tiny; use Type::Params qw/ compile /; use Types::Standard qw/ :types /; @@ -18,7 +17,6 @@ use List::Util qw/ shuffle /; use Time::localtime; use Data::Dump qw/ dump /; # for debugging - use MPD::Bed; use MPD::Bed::Covered; use MPD::Covered; @@ -30,6 +28,8 @@ my @plates = ( 1 .. 48 ); my @cols = ( 1 .. 12 ); my @rows = qw(A B C D E F G H); +with 'MPD::Role::Message'; + has Primers => ( traits => ['Array'], is => 'ro', @@ -99,9 +99,11 @@ sub WriteOrderFile { my ( $self, $file, $optHref ) = $check->(@_); if ( $self->no_primers ) { - my $msg = "Error - no primers to write to order file: $file"; - say $msg; - return; + return $self->( 'warn', "No primers to write to order file: $file" ); + } + + if ( eval("require 'Excel::Writer::XLSX'") ) { + die "Cannot find 'Excel::Writer::XLSX'"; } my @header = ( "WellPosition", "Name", "Sequence", "Notes" ); @@ -110,6 +112,7 @@ sub WriteOrderFile { my $primerCount = 0; my $workbook = Excel::Writer::XLSX->new($file); + $workbook->set_properties( title => "Multiplex Primers", author => 'The MPD package', @@ -161,9 +164,7 @@ sub OrderAsHref { my ( $self, $optHref ) = $check->(@_); if ( $self->no_primers ) { - my $msg = "no primers to order"; - say $msg; - return; + return $self->log( 'info', 'No primers to order' ); } # Determine number of pools for the primer set @@ -209,8 +210,7 @@ sub OrderAsHref { $offset = 0; } if ( $offset < 0 ) { - my $msg = "Printing Offset (PrnOffset) expected to be >=0."; - croak($msg); + return $self->log( 'fatal', "Printing Offset (PrnOffset) expected to be >=0." ); } # organize the data we need @@ -232,9 +232,7 @@ sub OrderAsHref { # are we beyond the max number of plates if ( !exists $poolStartsAref->[ $pairCount + $offset ] ) { - my $msg = "Asked to plate across >48 plates"; - warn $msg; - last; + last $self->log( 'warn', "Asked to plate across >48 plates" ); } # did we reach the maximum number of plates specified @@ -245,7 +243,8 @@ sub OrderAsHref { $plateMax + 1, $pairCount, $primerCount ); - say STDERR $msg; + $self->log( 'warn', $msg ); + return \%prnHash; } @@ -342,8 +341,7 @@ sub PrimerList { # TODO: use reftype here if ( scalar @$attrsAref == 0 ) { - my $msg = "Attributes should be a list"; - croak $msg; + return $self->log( 'fatal', "Attributes should be a list" ); } my @array; @@ -607,9 +605,7 @@ sub WriteCoveredFile { my ( $self, $fileName, $bedObj ) = $check->(@_); if ( $self->no_primers ) { - my $msg = "Error - no primers to write to coverage file: $fileName"; - say $msg; - return; + return $self->log( 'warn', "No primers to write to coverage file: $fileName" ); } my $fh = path($fileName)->filehandle(">"); @@ -617,14 +613,25 @@ sub WriteCoveredFile { say {$fh} $coveredObj->Entries_as_str(); } +sub MakeCoveredJsonString { + state $check = compile( Object, Object ); + my ( $self, $bedObj ) = $check->(@_); + + if ( $self->no_primers ) { + return $self->log( 'warn', "No primers to make covered JSON string from" ); + } + + my $coveredObj = $self->BedCoverage($bedObj); + + return encode_json( $coveredObj->Entries_as_aref() ); +} + sub WriteUncoveredFile { state $check = compile( Object, Str, Object ); my ( $self, $fileName, $bedObj ) = $check->(@_); if ( $self->no_primers ) { - my $msg = "Error - no primers to write to uncovered file: $fileName"; - say $msg; - return; + return $self->log( 'warn', "No primers to write to uncovered file: $fileName" ); } my $fh = path($fileName)->filehandle(">"); @@ -643,9 +650,7 @@ sub WritePrimerFile { } if ( $self->no_primers ) { - my $msg = "Error - no primers to write to primer file: $fileName"; - say $msg; - return; + return $self->log( 'warn', "No primers to write to primer file: $fileName" ); } my $fh = path($fileName)->filehandle(">"); @@ -676,9 +681,7 @@ sub WriteIsPcrFile { } if ( $self->no_primers ) { - my $msg = "Error - no primers to write to isPcr file: $fileName"; - say $msg; - return; + return $self->log( 'warn', "No primers to write to isPcr file: $fileName" ); } my $fh = path($fileName)->filehandle(">"); @@ -699,9 +702,7 @@ sub Sumarize_as_aref { my @array; if ( $self->no_primers ) { - my $msg = "no primers to summarize"; - say $msg; - return; + return $self->log( 'warn', "No primers to summarize" ); } # header @@ -748,20 +749,20 @@ sub BUILDARGS { return $class->SUPER::BUILDARGS( $_[0] ); } else { - my $msg = - "Error: Construct MPD::Primer object with either a hashref, arrayref of hashrefs, or primer file"; - croak($msg); + return $class->log( 'fatal', + "Error: Construct MPD::Primer object with either a hashref," + . " arrayref of hashrefs, or primer file" ); } } else { - my $msg = - "Error: Construct MPD::Primer object with either a hashref, arrayref of hashrefs, or primer file"; - croak($msg); + return $class->log( 'fatal', + 'Error: Construct MPD::Primer object with either' + . ' a hashref, arrayref of hashrefs, or primer file' ); } } sub _ReadPrimerFile { - my ( $class, $file ) = @_; + my ( $self, $file ) = @_; my @primers; @@ -789,7 +790,7 @@ sub _ReadPrimerFile { # legacy files don't have a header but start with the Primer_number if ( $fields[0] =~ m/\A\d+/ ) { %header = map { $expHeader[$_] => $_ } ( 0 .. $#expHeader ); - say dump( \%header ); + $self->log( 'info', dump( \%header ) ); } # newer format has a header so skip to the next line after grabbing the header elsif ( !@NotFoundFields ) { @@ -799,7 +800,7 @@ sub _ReadPrimerFile { else { my $msg = "Cannot find fields: "; $msg .= "'" . join( "', '", @NotFoundFields ) . "'"; - croak $msg; + return $self->log( 'fatal', $msg ); } } my %data = map { $_ => $fields[ $header{$_} ] } ( keys %header ); @@ -808,7 +809,7 @@ sub _ReadPrimerFile { my $msg = sprintf( "Error: no value for expected header Primer_number at line: %d\n\n==> %s", ( $lineCount + 1 ), $line ); - croak $msg; + return $self->log( 'fatal', $msg ); } if ( $primerNumber == 0 ) { diff --git a/lib/MPD/PrimerDesign.pm b/lib/MPD/PrimerDesign.pm index e95fe63..84dd2c2 100644 --- a/lib/MPD/PrimerDesign.pm +++ b/lib/MPD/PrimerDesign.pm @@ -8,7 +8,6 @@ use Moose 2; use MooseX::Types::Path::Tiny qw/ AbsPath AbsFile File /; use namespace::autoclean; -use Carp qw/ croak /; use Excel::Writer::XLSX; use Path::Tiny; use Type::Params qw/ compile /; @@ -22,17 +21,19 @@ use MPD::isPcr; use MPD::Primer; use MPD::Psl; +with "MPD::Role::Message"; + our $VERSION = '0.001'; my $time_now = ctime(); has Bed => ( is => 'ro', isa => 'MPD::Bed', required => 1 ); # optionally run isPcr on design -has RunIsPcr => ( is => 'ro', isa => 'Bool', default => 1 ); +has RunIsPcr => ( is => 'ro', isa => 'Bool', default => 0 ); # required files -has isPcrBinary => ( is => 'ro', isa => AbsFile, coerce => 1, required => 1, ); -has TwoBitFile => ( is => 'ro', isa => AbsFile, coerce => 1, required => 1, ); +has isPcrBinary => ( is => 'ro', isa => AbsFile, coerce => 1, required => 0, ); +has TwoBitFile => ( is => 'ro', isa => AbsFile, coerce => 1, required => 0, ); has MpdBinary => ( is => 'ro', isa => AbsFile, coerce => 1, required => 1, ); has MpdIdx => ( is => 'ro', isa => File, coerce => 1, required => 1, ); has dbSnpIdx => ( is => 'ro', isa => File, coerce => 1, required => 1, ); @@ -49,14 +50,21 @@ has TmMin => ( is => 'ro', isa => 'Num', default => 57, required => 1 ) has TmMax => ( is => 'ro', isa => 'Num', default => 62, required => 1 ); has PoolMax => ( is => 'ro', isa => 'Int', default => 10, required => 1 ); has PadSize => ( is => 'ro', isa => 'Int', default => 60, required => 1 ); -has TmStep => ( is => 'ro', isa => 'Num', default => 0.5, required => 1 ); +has TmStep => ( is => 'ro', isa => 'Num', default => 1, required => 1 ); # Temporary Files -my $bedPt = Path::Tiny->tempfile(); -my $tmpCmdPt = Path::Tiny->tempfile(); -my $primerPt = Path::Tiny->tempfile(); -my $isPcrPt = Path::Tiny->tempfile(); -my $mpdOut = Path::Tiny->tempfile(); +#my $bedPt = Path::Tiny->tempfile(); +#my $tmpCmdPt = Path::Tiny->tempfile(); +#my $primerPt = Path::Tiny->tempfile(); +#my $isPcrPt = Path::Tiny->tempfile(); +#my $mpdOut = Path::Tiny->tempfile(); + +#PID is not safe to use here if multiple processes are interacting with a shared NFS +my $bedPt = path("$$.bed"); +my $tmpCmdPt = path("$$.cmd"); +my $primerPt = path("$$.primer"); +my $isPcrPt = path("$$.isPcr"); +my $mpdOut = path("$$.mpdOut"); sub SayMppCmd { state $check = compile( Object, Str ); @@ -85,10 +93,8 @@ sub RunMpp { my $cmd = sprintf( "%s < %s > %s\n", $self->MpdBinary, $tmpCmdPt->stringify, $mpdOut->stringify ); if ( system($cmd ) != 0 ) { - my $logFile = path("./mpd_error.log"); - $mpdOut->copy( $logFile->stringify ); - say sprintf( "Error executing mpd command; check log '%s'", $logFile->stringify ); - exit(1); + $self->log( 'fatal', "MPD C choked. We're on it!" ); + return; } if ( $o->is_file ) { @@ -106,8 +112,8 @@ sub UniqPrimers { my $ok = $self->RunMpp( $primerPt->stringify ); if ( !$ok ) { - my $msg = "Error running mpd binary"; - croak $msg; + $self->log( 'fatal', "Error running mpd binary" ); + return; } my $primer = MPD::Primer->new( $primerPt->stringify ); diff --git a/lib/MPD/Psl.pm b/lib/MPD/Psl.pm index c0903a7..6e2c8b4 100644 --- a/lib/MPD/Psl.pm +++ b/lib/MPD/Psl.pm @@ -7,7 +7,6 @@ use 5.10.0; use Moose 2; use namespace::autoclean; -use Carp qw/ croak /; use Path::Tiny; use Type::Params qw/ compile /; use Types::Standard qw/ :types /; @@ -17,6 +16,8 @@ use Data::Dump qw/ dump /; # for debugging use MPD::Psl::Raw; +with 'MPD::Role::Message'; + our $VERSION = '0.001'; has Matches => ( @@ -37,9 +38,7 @@ sub DegenerateMatches { my ( @degenPairs, %hash ); if ( $self->no_matches ) { - my $msg = "Error - no matches to process for DegenerateMatches()"; - say STDERR $msg; - return; + return $self->log( 'warn', "No matches to process for DegenerateMatches()" ); } for my $m ( $self->all_matches ) { @@ -55,7 +54,7 @@ sub DegenerateMatches { else { my $msg = sprintf( "Warning: unrecognized chromosome '%s' for match: %s", $m->tName, $m->qName ); - say STDERR $msg; + $self->log( 'warn', $msg ); } } } @@ -96,15 +95,15 @@ sub BUILDARGS { return $class->SUPER::BUILDARGS( $_[0] ); } else { - my $msg = - "Error: Construct MPD::Primer object with either a hashref, arrayref of hashrefs, or primer file"; - croak($msg); + return $class->log( 'fatal', + 'Error: Construct MPD::Primer object with either' + . ' a hashref, arrayref of hashrefs, or primer file' ); } } else { - my $msg = - "Error: Construct MPD::Primer object with either a hashref, arrayref of hashrefs, or primer file"; - croak($msg); + return $class->log( 'fatal', + 'Error: Construct MPD::Primer object with either' + . ' a hashref, arrayref of hashrefs, or primer file' ); } } diff --git a/lib/MPD/Role/IO.pm b/lib/MPD/Role/IO.pm new file mode 100644 index 0000000..64c9c19 --- /dev/null +++ b/lib/MPD/Role/IO.pm @@ -0,0 +1,97 @@ +use 5.10.0; +use strict; +use warnings; +# A class to compress stuff and make temporary directories +package MPD::Role::IO; + +our $VERSION = '0.001'; + +# ABSTRACT: A moose role for all of our file handle needs +# VERSION + +use Moose::Role; + +use File::Which qw/which/; + +use Path::Tiny; +with 'MPD::Role::Message'; + +state $tar = which('tar'); +state $gzip = which('pigz') || which('gzip'); +# state $gzip = which('gzip'); +$tar = "$tar --use-compress-program=$gzip"; + +has gzipPath => (is => 'ro', isa => 'Str', init_arg => undef, lazy => 1, + default => sub {$gzip}); + +#if we compress the output, the extension we store it with +has compressExtension => ( + is => 'ro', + lazy => 1, + default => '.tar.gz', + init_arg => undef, +); + +sub compressPath { + my $self = shift; + #expect a Path::Tiny object or a valid file path + my $fileObjectOrPath = shift; + + if(!$tar) { $self->log( 'fatal', 'No tar program found'); } + + if(!ref $fileObjectOrPath) { + $fileObjectOrPath = path($fileObjectOrPath); + } + + my $filePath = $fileObjectOrPath->stringify; + + $self->log( 'info', 'Compressing all output files' ); + + my $basename = $fileObjectOrPath->basename; + my $parentDir = $fileObjectOrPath->parent->stringify; + + my $compressName = substr($basename, 0, rindex($basename, ".") ) . $self->compressExtension; + + my $outcome = + system(sprintf("cd %s; $tar --exclude '.*' --exclude %s -cf %s %s --remove-files", + $parentDir, + $compressName, + $compressName, #and don't include our new compressed file in our tarball + "$basename*", #the name of the directory we want to compress + ) ); + + if($outcome) { + return $self->log( 'warn', "Zipping failed with $?" ); + } + + return $compressName; +} + +#http://www.perlmonks.org/?node_id=233023 +sub makeRandomTempDir { + my ($self, $parentDir) = @_; + + srand( time() ^ ($$ + ($$ << 15)) ); + my @v = qw ( a e i o u y ); + my @c = qw ( b c d f g h j k l m n p q r s t v w x z ); + + my ($flip, $childDir) = (0,''); + $childDir .= ($flip++ % 2) ? $v[rand(6)] : $c[rand(20)] for 1 .. 9; + $childDir =~ s/(....)/$1 . int rand(10)/e; + $childDir = ucfirst $childDir if rand() > 0.5; + + my $newDir = $parentDir->child($childDir); + + # it shouldn't exist + if($newDir->is_dir) { + goto &_makeRandomTempDir; + } + + $newDir->mkpath; + + return $newDir; +} + +no Moose::Role; + +1; diff --git a/lib/MPD/Role/Message.pm b/lib/MPD/Role/Message.pm new file mode 100644 index 0000000..1eff880 --- /dev/null +++ b/lib/MPD/Role/Message.pm @@ -0,0 +1,204 @@ +package MPD::Role::Message; +use 5.10.0; +use strict; +use warnings; + +our $VERSION = '0.001'; + +# ABSTRACT: A class for communicating to log and to some plugged in messaging service +# VERSION +use Moose::Role 2; + +#doesn't work with Parallel::ForkManager; +#for more on AnyEvent::Log +#http://search.cpan.org/~mlehmann/AnyEvent-7.12/lib/AnyEvent/Log.pm +# use AnyEvent; +# use AnyEvent::Log; +use Carp qw/croak confess/; +use Log::Fast; +use namespace::autoclean; +#with 'MooX::Role::Logger'; +use Beanstalk::Client; +use Cpanel::JSON::XS; +use Path::Tiny; + +$MPD::Role::Message::LOG = Log::Fast->global(); +$MPD::Role::Message::LOG = Log::Fast->new( + { + level => 'WARN', + prefix => '%D %T ', + type => 'fh', + fh => \*STDOUT, + } +); + +$MPD::Role::Message::mapLevels = { + info => 'INFO', #\&{$LOG->INFO} + INFO => 'INFO', + ERR => 'ERR', + error => 'ERR', + fatal => 'ERR', + warn => 'WARN', + WARN => 'WARN', + debug => 'DEBUG', + DEBUG => 'DEBUG', + NOTICE => 'NOTICE', +}; + +state $debug = 0; + +sub setLogPath { + my ( $self, $path ) = @_; + #open($Seq::Role::Message::Fh, '<', $path); + our $LOG; + #$AnyEvent::Log::LOG->log_to_file ($path); + $LOG->config( { fh => path($path)->filehandle(">"), } ); +} + +sub setLogLevel { + my ( $self, $level ) = @_; + + our $mapLevels; + our $LOG; + + if ( $level =~ /debug/i ) { + $debug = 1; + } + + $LOG->level( $mapLevels->{$level} ); +} + +state $verbosity = 0; + +sub setVerbosity { + my ( $self, $level ) = @_; + + $verbosity = $level; +} + +my $publisher; +my $messageBase; +has hasPublisher => ( + is => 'ro', + init_arg => undef, + writer => '_setPublisher', + isa => 'Bool', + lazy => 1, + default => sub { !!$publisher } +); + +sub setPublisher { + my ( $self, $publisherConfig ) = @_; + + if ( !ref $publisherConfig eq 'Hash' ) { + return $self->log->( 'fatal', 'setPublisherAndAddress requires hash' ); + } + + if ( + !( + defined $publisherConfig->{server} + && defined $publisherConfig->{queue} + && defined $publisherConfig->{messageBase} + ) + ) + { + return $self->log( 'fatal', 'setPublisher server, queue, messageBase properties' ); + } + + $publisher = Beanstalk::Client->new( + { + server => $publisherConfig->{server}, + default_tube => $publisherConfig->{queue}, + connect_timeout => 1, + } + ); + + $self->_setPublisher( !!$publisher ); + + $messageBase = $publisherConfig->{messageBase}; +} + +# note, accessing hash directly because traits don't work with Maybe types +sub publishMessage { + # my ( $self, $msg ) = @_; + # to save on perf, $_[0] == $self, $_[1] == $msg; + + # because predicates don't trigger builders, need to check hasPublisherAddress + return unless $publisher; + + $messageBase->{data} = $_[1]; + + $publisher->put( + { + priority => 0, + data => encode_json($messageBase), + } + ); +} + +sub publishProgress { + # my ( $self, $msg ) = @_; + # to save on perf, $_[0] == $self, $_[1] == $msg; + + # because predicates don't trigger builders, need to check hasPublisherAddress + return unless $publisher; + + $messageBase->{data} = { progress => $_[1] }; + + $publisher->put( + { + priority => 0, + data => encode_json($messageBase), + } + ); +} + +sub log { + #my ( $self, $log_method, $msg ) = @_; + #$_[0] == $self, $_[1] == $log_method, $_[2] == $msg; + + # TODO: auto dump refs + # if(ref $_[2] ) { + # $_[2] = dump $_[2]; + # } + + if ( $_[1] eq 'info' ) { + $MPD::Role::Message::LOG->INFO("[INFO] $_[2]"); + + $_[0]->publishMessage("[INFO] $_[2]"); + + if ($verbosity) { + say STDOUT "[INFO] $_[2]"; + } + } + elsif ( $_[1] eq 'debug' && $debug ) { + $MPD::Role::Message::LOG->DEBUG("[DEBUG] $_[2]"); + # $_[0]->publishMessage("[DEBUG] $_[2]"); + + if ($verbosity) { + say STDOUT "[DEBUG] $_[2]"; + } + + } + elsif ( $_[1] eq 'warn' ) { + $MPD::Role::Message::LOG->WARN("[WARN] $_[2]"); + + $_[0]->publishMessage("[WARN] $_[2]"); + + if ($verbosity) { + say STDERR "[WARN] $_[2]"; + } + + } + elsif ( $_[1] eq 'fatal' ) { + $MPD::Role::Message::LOG->ERR("[FATAL] $_[2]"); + $_[0]->publishMessage("[FATAL] $_[2]"); + + confess "[FATAL] $_[2]"; + } + + return; +} + +no Moose::Role; +1; diff --git a/lib/MPD/isPcr.pm b/lib/MPD/isPcr.pm index 8feffc1..e7b503d 100644 --- a/lib/MPD/isPcr.pm +++ b/lib/MPD/isPcr.pm @@ -9,7 +9,6 @@ use Moose::Util::TypeConstraints; use MooseX::Types::Path::Tiny qw/ AbsPath AbsFile /; use namespace::autoclean; -use Carp qw/ croak /; use Path::Tiny; use Type::Params qw/ compile /; use Types::Standard qw/ :types /; @@ -19,6 +18,8 @@ use Data::Dump qw/ dump /; # for debugging use MPD::Primer; use MPD::Psl; +with 'MPD::Role::Message'; + our $VERSION = '0.001'; enum PrimerFileFormat => [ 'isPcr', 'mpp' ]; @@ -55,7 +56,7 @@ sub Run { else { my $msg = sprintf( "Error: Failed to write isPcr Primer File: %s", $tempIsPcrPrimerFile ); - croak $msg; + $self->log( 'fatal', $msg ); } } my $runLog = qx/$cmd/; @@ -64,8 +65,8 @@ sub Run { return 1; } else { - say STDERR "Error running isPcr"; - say STDERR $runLog; + $self->log( 'warn', "Error running isPcr" ); + $self->log( 'warn', $runLog ); return; } } diff --git a/t/01-Bed.t b/t/01-Bed.t index 8080dda..9e03dbb 100644 --- a/t/01-Bed.t +++ b/t/01-Bed.t @@ -9,29 +9,42 @@ use Path::Tiny; use Data::Dump qw/ dump /; -plan tests => 6; +plan tests => 7; my $package = 'MPD::Bed'; +#Test 1 use_ok($package) || print "Bail out!\n"; my $bed = $package->new("t/01-mpd.bed"); { + #Test 2 ok( $bed, "create $package from bed file" ); } { my $bedRawObjAref = $bed->Entries; my $newBedObj = MPD::Bed->new($bedRawObjAref); + #Test 3 ok( $newBedObj, 'create MPD::Bed with Aref of MPD::Bed::Raw' ); } +{ + #Count number of lines for now + #This should test for an error in the future + my $badBed = $package->new("t/01-mpd-bad.bed"); + my $badBedEntrys = $badBed->Entries; + #Test 4 + is( 27, scalar @$badBedEntrys, "MPD::Bed bad bedfile" ); +} + { my $file = "t/bedEntries.json"; my $expEntriesAref = $bed->Entries_as_aref; #SaveJsonData( $file, $expEntriesAref ); my $obsEntriesAref = LoadJsonData($file); + #Test 5 is_deeply( $expEntriesAref, $obsEntriesAref, 'Entries_as_aref()' ); } @@ -40,6 +53,7 @@ my $bed = $package->new("t/01-mpd.bed"); my $expSiteHref = $bed->CoveredSite; #SaveJsonData( $file, $expSiteHref ); my $obsSiteHref = LoadJsonData($file); + #Test 6 is_deeply( $expSiteHref, $obsSiteHref, 'Site()' ); } @@ -48,6 +62,7 @@ my $bed = $package->new("t/01-mpd.bed"); my $expChrHref = $bed->CoveredChr; #SaveJsonData( $file, $expChrHref ); my $obsChrHref = LoadJsonData($file); + #Test 7 is_deeply( $expChrHref, $obsChrHref, 'Chr()' ); } diff --git a/t/01-mpd-bad.bed b/t/01-mpd-bad.bed new file mode 100644 index 0000000..ca4de21 --- /dev/null +++ b/t/01-mpd-bad.bed @@ -0,0 +1,28 @@ +chr1 10197108 101971090 rs6691645 +chr1 10702374 10702375 rs7514751 +chr1 11662630 11662631 rs3125815 +chr1 242185299 242185300 rs316835 +chr1 242648291 242648292 rs2184185 +chr1 244156037 244156038 rs10803181 +chr1 245125190 245125191 rs6672147 +chr1 245654196 245654197 rs4658792 +chr1 247387028 247387029 rs7542425 +chr1 247618266 247618267 rs1144815 +chr1 247619297 247619298 rs11587369 +chr2 782576 782577 rs10183412 +chr2 2232508 2232509 rs4853946 +chr2 2233026 2233027 rs17247253 +chr2 64036395 64036396 rs329489 +chr2 64142201 64142202 rs10496107 +chr2 240470038 240470039 rs3811624 +chr2 240835648 240835649 rs11900363 +chr3 381334 381335 rs11706690 +chr3 1026551 1026552 rs17032419 +chr3 1133890 1133891 rs4481145 +chr3 1210983 1210984 rs1391916 +chr3 3059102 3059103 rs163577 +chr3 3116800 3116801 rs1153459 +chr3 38088621 38088622 rs2236630 +chr3 38482871 38482872 rs503327 +chr3 42363857 42363858 rs26352 +chr3 43173185 43173186 rs938922 \ No newline at end of file diff --git a/t/beanstalk_queue_server_test.pl b/t/beanstalk_queue_server_test.pl new file mode 100644 index 0000000..619d83e --- /dev/null +++ b/t/beanstalk_queue_server_test.pl @@ -0,0 +1,223 @@ + +#!/usr/bin/env perl +# Name: snpfile_annotate_mongo_redis_queue.pl +# Description: +# Date Created: Wed Dec 24 +# By: Alex Kotlar +# Requires: Snpfile::AnnotatorBase + +#Todo: Handle job expiration (what happens when job:id expired; make sure no other job operations happen, let Node know via sess:?) +#There may be much more performant ways of handling this without loss of reliability; loook at just storing entire message in perl, and relying on decode_json +#Todo: (Probably in Node.js): add failed jobs, and those stuck in processingJobs list for too long, back into job queue, for N attempts (stored in jobs:jobID) + +# Same as beanstalk_queue_server.pl, except doesn't communicate back to beanstalk server, so +# safe to check that jobs are working as expected before daemonizing beanstalk_queue_server.pl +use 5.10.0; +use strict; +use warnings; + +use Beanstalk::Client; +use Parallel::ForkManager; +use Cpanel::JSON::XS; +use DDP output => 'stdout'; +use Getopt::Long; +use File::Basename; +use Log::Any::Adapter; +use Path::Tiny; +use Try::Tiny; +use Hash::Merge::Simple qw/merge/; +use YAML::XS qw/LoadFile/; + +use lib './lib'; + +use MPD; + +my $DEBUG = 0; +my $conf = LoadFile($ARGV[0] || './config/queue.yaml'); + +# Beanstalk servers will be sharded +my $beanstalkHost = $conf->{beanstalk_host_1}; +my $beanstalkPort = $conf->{beanstalk_port_1}; + +my $configPathBaseDir = "./config/web/"; + +my $verbose = 1; + +my $beanstalk = Beanstalk::Client->new( + { + server => $conf->{beanstalkd}{host} . ':' . $conf->{beanstalkd}{port}, + default_tube => $conf->{beanstalkd}{tubes}{annotation}{submission}, + connect_timeout => 1, + encoder => sub { encode_json( \@_ ) }, + decoder => sub { @{ decode_json(shift) } }, + } +); + +my $beanstalkEvents = Beanstalk::Client->new( + { + server => $conf->{beanstalkd}{host} . ':' . $conf->{beanstalkd}{port}, + default_tube => $conf->{beanstalkd}{tubes}{annotation}{events}, + connect_timeout => 1, + encoder => sub { encode_json( \@_ ) }, + decoder => sub { @{ decode_json(shift) } }, + } +); + +while ( my $job = $beanstalk->reserve ) { + + # Parallel ForkManager used only to throttle number of jobs run in parallel + # cannot use run_on_finish with blocking reserves, use try catch instead + # Also using forks helps clean up leaked memory from LMDB_File + # Unfortunately, parallel fork manager doesn't play nicely with try tiny + # prevents anything within the try from executing + my $jobDataHref = decode_json( $job->data ); + say "Trying job: " . $job->id; + p $jobDataHref; + + my ($err, $result); + + try { + $result = handleJob( $jobDataHref, $job->id ); + + say "completed job with queue id " . $job->id; + } catch { + my $indexOfConstructor = index( $_, "MPD::" ); + + if ( ~$indexOfConstructor ) { + $err = substr( $_, 0, $indexOfConstructor ); + } + else { + $err = $_; + } + + say "job " . $job->id . " failed with $err"; + }; + + say "Finished"; + exit(0); +} + +sub handleJob { + my $submittedJob = shift; + my $queueId = shift; + + my $failed; + + my $inputHref = coerceInputs( $submittedJob, $queueId ); + + say "inputHref is"; + p $inputHref; + + my $dir = path( $inputHref->{OutDir} ); + + if ( !$dir->is_dir ) { $dir->mkpath(); } + + my $m = MPD->new_with_config($inputHref); + + say "MPD is "; + p $m; + + my $result = $m->RunAll(); + + return $result; +} + +#Here we may wish to read a json or yaml file containing argument mappings +sub coerceInputs { + my $jobDetailsHref = shift; + my $queueId = shift; + + my $inputFilePath = $jobDetailsHref->{inputFilePath}; + my $outputDir = $jobDetailsHref->{dirs}{out}; + my $outputExt = $jobDetailsHref->{name}; + + my $configFilePath = getConfigFilePath( $jobDetailsHref->{assembly} ); + + my $config = LoadFile($configFilePath); + + my $coreHref = $config->{Core}; + + ########## Gather basic and advanced options ################### + my $basic = $config->{User}{Basic}; + my $advanced = $config->{User}{Advanced}; + + my %basicOptions = map { $_->{name} => $_->{val} } @$basic; + my %advancedOptions = map { $_->{name} => $_->{val} } @$advanced; + + my $userBasic = $jobDetailsHref->{options}{Basic}; + my $userAdvanced = $jobDetailsHref->{options}{Advanced}; + + my %userBasicOptions = map { $_->{name} => $_->{val} } @$userBasic; + my %userAdvancedOptions = map { $_->{name} => $_->{val} } @$userAdvanced; + + # right hand precedence; + + my $mergedConfig = + merge( $coreHref, \%basicOptions, \%advancedOptions, \%userBasicOptions, + \%userAdvancedOptions ); + + # JSON::PP::Boolean will not pass moose constraint for Bool + foreach my $val ( values %$mergedConfig ) { + if ( ref $val eq 'JSON::PP::Boolean' ) { + $val = !!$val; + } + } + + $mergedConfig->{publisher} = { + server => $conf->{beanstalkd}{host} . ':' . $conf->{beanstalkd}{port}, + queue => $conf->{beanstalkd}{tubes}{annotation}{events}, + messageBase => { + event => 'progress', + queueId => $queueId, + data => undef, + }, + }; + + $mergedConfig->{configfile} = $configFilePath; + $mergedConfig->{BedFile} = $jobDetailsHref->{inputFilePath}; + $mergedConfig->{OutExt} = $jobDetailsHref->{name}; + $mergedConfig->{OutDir} = $jobDetailsHref->{dirs}{out}; + $mergedConfig->{ProjectName} = $jobDetailsHref->{name}; + + # need to compress so web can get a single file to download + $mergedConfig->{compress} = 1; + + return $mergedConfig; +} + +# { +# configfile => $config_file, +# BedFile => $bed_file, +# OutExt => $out_ext, +# OutDir => $dir, +# InitTmMin => 58, +# InitTmMax => 61, +# PoolMin => $poolMin, +# Debug => $verbose, +# IterMax => 2, +# RunIsPcr => 0, +# Act => $act, +# ProjectName => $out_ext, +# FwdAdapter => 'ACACTGACGACATGGTTCTACA', +# RevAdapter => 'TACGGTAGCAGAGACTTGGTCT', +# Offset => 0, +# Randomize => 1, +# a => 1 +# } + +sub getConfigFilePath { + my $assembly = shift; + + my @maybePath = glob( path($configPathBaseDir)->child($assembly . ".y*ml")->stringify ); + + if ( scalar @maybePath ) { + if ( scalar @maybePath > 1 ) { + #should log + say "\n\nMore than 1 config path found, choosing first"; + } + + return $maybePath[0]; + } + + die "\n\nNo config path found for the assembly $assembly. Exiting\n\n"; +}