#!/usr/bin/perl # Copyright 2013 O. Sotolongo use strict; use warnings; use File::Slurp qw(read_file); use Data::Dump qw(dump); my $db = shift; my $assoc = shift; die "Must supply database\n" unless $db; my $odb = $db; $odb =~ s/(.*)\.(.*)/$1_bflipped\.$2/; print "I will try to write results to $odb\n"; #first I will load .bim print "Reading data from $db ...\n"; my %genmap; my %data_line = reverse map {/^(.*\s+(rs\d+)\s+.*)$/} grep {/^(.*\s+(rs\d+)\s+.*)$/} read_file $db; print "Data stored, lets try to understand it\n"; foreach my $marker (sort keys %data_line){ (@{$genmap{$marker}} {qw/chr gposition fposition allele1 allele2/}) = $data_line{$marker} =~ /^(\d+)\s+rs\d+\s+(.*)\s+(\d+)\s+([A,T,C,G])\s+([A,T,C,G])\s*$/; } #now I will read target markers from the assoc file print "OK, let see what markers I have to change, reading $assoc ...\n"; my @targets = map {/^.*\s+(rs\d+)\s+.*$/} grep {/^(.*\s+(rs\d+)\s+.*)$/} read_file $assoc; # and then flip the allele information of targets in db info print "I'm going to flips those markers now\n"; foreach my $marker (@targets){ my $tallele = $genmap{$marker}{allele1}; $genmap{$marker}{allele1} = $genmap{$marker}{allele2}; $genmap{$marker}{allele2} = $tallele; } # go and write .bim now print "Writing to $odb\n"; open ODF, ">$odb" || die "Could not open output file"; foreach my $marker (sort {($genmap{$a}->{chr} <=> $genmap{$b}->{chr}) or ($genmap{$a}->{fposition} <=> $genmap{$b}->{fposition})} keys %genmap){ print ODF "$genmap{$marker}{chr}\t$marker\t$genmap{$marker}{gposition}\t$genmap{$marker}{fposition}\t$genmap{$marker}{allele1}\t$genmap{$marker}{allele2}\n"; } close ODF;