Mercurial > repos > dereeper > roary_plots
comparison Roary/lib/Bio/Roary/Output/DifferenceBetweenSets.pm @ 0:c47a5f61bc9f draft
Uploaded
author | dereeper |
---|---|
date | Fri, 14 May 2021 20:27:06 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c47a5f61bc9f |
---|---|
1 package Bio::Roary::Output::DifferenceBetweenSets; | |
2 | |
3 # ABSTRACT: Given two sets of isolates and a group file, output whats unique in each and whats in common | |
4 | |
5 =head1 SYNOPSIS | |
6 | |
7 Given two sets of isolates and a group file, output whats unique in each and whats in common | |
8 use Bio::Roary::Output::DifferenceBetweenSets; | |
9 | |
10 my $obj = Bio::Roary::Output::DifferenceBetweenSets->new( | |
11 analyse_groups => $analyse_groups, | |
12 input_filenames_sets => | |
13 [ | |
14 ['aaa.faa','bbb.faa'], | |
15 ['ccc.faa','ddd.faa'] | |
16 ], | |
17 ); | |
18 $obj->groups_set_one_unique(); | |
19 $obj->groups_set_two_unique(); | |
20 $obj->groups_in_common(); | |
21 | |
22 =cut | |
23 | |
24 use Moose; | |
25 use Bio::SeqIO; | |
26 use Bio::Roary::Exceptions; | |
27 use Bio::Roary::AnalyseGroups; | |
28 use Bio::Roary::Output::QueryGroups; | |
29 | |
30 has 'analyse_groups' => ( is => 'ro', isa => 'Bio::Roary::AnalyseGroups', required => 1 ); | |
31 has 'input_filenames_sets' => ( is => 'ro', isa => 'ArrayRef[ArrayRef]', required => 1 ); | |
32 has 'output_filename_base' => ( is => 'ro', isa => 'Str', default => 'set_difference' ); | |
33 | |
34 has '_query_groups_objs' => ( is => 'ro', isa => 'ArrayRef', lazy => 1, builder => '_build__query_groups_objs' ); | |
35 | |
36 # TODO: update to handle more than 2 input sets | |
37 | |
38 sub _build__query_groups_objs { | |
39 my ($self) = @_; | |
40 my @query_groups_objs; | |
41 for my $file_name_set ( @{ $self->input_filenames_sets } ) { | |
42 push( | |
43 @query_groups_objs, | |
44 Bio::Roary::Output::QueryGroups->new( | |
45 analyse_groups => $self->analyse_groups, | |
46 input_filenames => $file_name_set | |
47 ) | |
48 ); | |
49 } | |
50 | |
51 my @all_input_files = (@{ $self->input_filenames_sets->[0] },@{ $self->input_filenames_sets->[1] }); | |
52 push( | |
53 @query_groups_objs, | |
54 Bio::Roary::Output::QueryGroups->new( | |
55 analyse_groups => $self->analyse_groups, | |
56 input_filenames => \@all_input_files | |
57 ) | |
58 ); | |
59 | |
60 | |
61 return \@query_groups_objs; | |
62 } | |
63 | |
64 sub _subtract_arrays { | |
65 my ( $self, $array_1, $array_2 ) = @_; | |
66 my %array_1 = map { $_ => 1 } @{$array_1}; | |
67 my @difference = grep { not $array_1{$_} } @{$array_2}; | |
68 return \@difference; | |
69 } | |
70 | |
71 sub _groups_unique { | |
72 my ( $self, $output_filename, $query_group1, $query_group2 ) = @_; | |
73 my $unique_groups = $self->_subtract_arrays( $query_group2->_groups, $query_group1->_groups ); | |
74 $query_group1->groups_with_external_inputs( $output_filename, $unique_groups ); | |
75 } | |
76 | |
77 sub groups_set_one_unique_filename | |
78 { | |
79 my ($self) = @_; | |
80 return $self->output_filename_base . '_unique_set_one'; | |
81 } | |
82 | |
83 sub groups_set_two_unique_filename | |
84 { | |
85 my ($self) = @_; | |
86 return $self->output_filename_base . '_unique_set_two'; | |
87 } | |
88 | |
89 sub groups_in_common_filename | |
90 { | |
91 my ($self) = @_; | |
92 return $self->output_filename_base . '_common_set'; | |
93 } | |
94 | |
95 | |
96 sub groups_set_one_unique { | |
97 my ($self) = @_; | |
98 $self->_groups_unique( | |
99 $self->groups_set_one_unique_filename, | |
100 $self->_query_groups_objs->[0], | |
101 $self->_query_groups_objs->[1] | |
102 ); | |
103 } | |
104 | |
105 sub groups_set_two_unique { | |
106 my ($self) = @_; | |
107 $self->_groups_unique( | |
108 $self->groups_set_two_unique_filename, | |
109 $self->_query_groups_objs->[1], | |
110 $self->_query_groups_objs->[0] | |
111 ); | |
112 } | |
113 | |
114 sub groups_in_common { | |
115 my ($self) = @_; | |
116 my $unique_group_1 = $self->_subtract_arrays( $self->_query_groups_objs->[0]->_groups, $self->_query_groups_objs->[1]->_groups ); | |
117 my $unique_group_2 = $self->_subtract_arrays( $self->_query_groups_objs->[1]->_groups, $self->_query_groups_objs->[0]->_groups ); | |
118 my $common_groups_1 = $self->_subtract_arrays( $unique_group_1,$self->_query_groups_objs->[2]->_groups); | |
119 my $common_groups_2 = $self->_subtract_arrays( $unique_group_2,$common_groups_1); | |
120 $self->_query_groups_objs->[2]->groups_with_external_inputs( $self->groups_in_common_filename, $common_groups_2 ); | |
121 } | |
122 | |
123 no Moose; | |
124 __PACKAGE__->meta->make_immutable; | |
125 | |
126 1; |