0
|
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;
|