#!/usr/bin/perl # Copyright 2013 O. Sotolongo # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # use strict; use warnings; use File::Slurp qw(read_file); use Data::Dump qw(dump); my $flip = 0; while (@ARGV and $ARGV[0] =~ /^-/) { $_ = shift; last if /^--$/; if (/^-flip/) { $flip = 1;} } my $db; my $odb; unless ($flip) { $db = shift; die "Must supply database\n" unless $db; $odb = $db; $odb =~ s/(.*)\.(.*)/$1_bcomp_flipped\.$2/; }else{ $odb = 'just_flip_these.txt'; } my $assoc_previous = shift; my $assoc_last = shift; print "I will try to write results to $odb\n"; my %genmap_previous; my %genmap_last; my %genmap; my %data_line; #first I store the files unless($flip){ %data_line = reverse map {/^(.*\s+(rs\d+)\s+.*)$/} grep {/^(.*\s+(rs\d+)\s+.*)$/} read_file $db; 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 files print "OK, let see what markers I have to change, reading $assoc_previous and $assoc_last ...\n"; %data_line = reverse map {/^(.*\s+(rs\d+)\s+.*)$/} grep {/^(.*\s+(rs\d+)\s+.*)$/} read_file $assoc_previous; foreach my $marker (sort keys %data_line){ (@{$genmap_previous{$marker}} {qw/chr position allele1 freq1 freq2 allele2 chi2 pvalue oddratio/}) = $data_line{$marker} =~ /^\s*(\d+)\s+rs\d+\s+(\d+)\s+([A,T,C,G]+)\s+(\d+\.*\d*e*-*\d*)\s+(\d+\.*\d*e*-*\d*)\s+([A,T,C,G]+)\s+(\d+\.*\d*e*-*\d*)\s+(\d+\.*\d*e*-*\d*)\s+(\d+\.*\d*e*-*\d*|NA)\s*$/; } %data_line = reverse map {/^(.*\s+(rs\d+)\s+.*)$/} grep {/^(.*\s+(rs\d+)\s+.*)$/} read_file $assoc_last; foreach my $marker (sort keys %data_line){ (@{$genmap_last{$marker}} {qw/chr position allele1 freq1 freq2 allele2 chi2 pvalue oddratio/}) = $data_line{$marker} =~ /^\s*(\d+)\s+rs\d+\s+(\d+)\s+([A,T,C,G]+)\s+(\d+\.*\d*e*-*\d*)\s+(\d+\.*\d*e*-*\d*)\s+([A,T,C,G]+)\s+(\d+\.*\d*e*-*\d*)\s+(\d+\.*\d*e*-*\d*)\s+(\d+\.*\d*e*-*\d*|NA)\s*$/; } #dump %genmap_last; exit; my @outmarkers; # and then flip the allele information of targets in db info if($flip){ foreach my $marker (keys %genmap_previous){ if(exists($genmap_previous{$marker}) && exists($genmap_last{$marker})){ if($genmap_previous{$marker}{chi2} < $genmap_last{$marker}{chi2}){ push @outmarkers, $marker; } } } }else{ print "I'm going to flips those markers now\n"; foreach my $marker (keys %genmap_previous){ if(exists($genmap_previous{$marker}) && exists($genmap_last{$marker})){ if($genmap_previous{$marker}{chi2} < $genmap_last{$marker}{chi2}){ my $tallele = $genmap{$marker}{allele1}; $genmap{$marker}{allele1} = $genmap{$marker}{allele2}; $genmap{$marker}{allele2} = $tallele; } } } } # go and write .bim or markers list now print "Writing to $odb\n"; open ODF, ">$odb" || die "Could not open output file"; if($flip){ foreach my $marker (@outmarkers){ print ODF "$marker\n"; } }else{ 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;