-
Notifications
You must be signed in to change notification settings - Fork 0
/
AlleleRequest.pm
143 lines (112 loc) · 3.74 KB
/
AlleleRequest.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package LIMS2::AlleleRequest;
use strict;
use warnings FATAL => 'all';
use Moose;
use MooseX::ClassAttribute;
use List::MoreUtils qw( any );
use LIMS2::CassetteFunction qw( satisfies_cassette_function );
use namespace::autoclean;
class_has handled_targeting_types => (
is => 'ro',
isa => 'ArrayRef[Str]',
default => sub { [] }
);
sub handles {
my ( $class, $targeting_type ) = @_;
return any { $_ eq $targeting_type } @{ $class->handled_targeting_types };
}
has model => (
is => 'ro',
isa => 'LIMS2::Model',
required => 1
);
has [ qw( species gene_id ) ] => (
is => 'ro',
isa => 'Str',
required => 1
);
sub _build_designs {
my ( $self, $mutation_type ) = @_;
# Uses WebAppCommon::Plugin::Design
return $self->model->c_list_assigned_designs_for_gene(
{
species => $self->species,
gene_id => $self->gene_id,
type => $self->design_types_for( $mutation_type )
}
);
}
## no critic(RequireFinalReturn)
sub design_types_for {
my ( $self, $mutation_type ) = @_;
if ( $mutation_type eq 'ko_first' ) {
return [ 'conditional', 'artificial-intron', 'intron-replacement' ];
}
if ( $mutation_type eq 'deletion' or $mutation_type eq 'insertion' ){
return $mutation_type;
}
if ( $mutation_type eq 'cre_knock_in'){
return [ 'conditional', 'artificial-intron', 'intron-replacement', 'deletion', 'insertion', 'cre-bac' ];
}
$self->model->throw( Implementation => "Unrecognized mutation type: $mutation_type" );
}
## use critic
#TODO will not return design wells for a short arm merged design
sub design_wells {
my ( $self, $design ) = @_;
return map { $_->output_wells } $design->process_designs_rs->search_related( process => { type_id => 'create_di' } );
}
# TODO won't work properly with merged designs
# the short arm design does not have a design well
# the original design will return FINAL wells with both the new / merged design ( may not be bad thing )
sub final_vector_wells {
my ( $self, $design_wells, $cassette_function ) = @_;
my @final_vector_wells;
for my $design_well ( @{$design_wells} ) {
my $it = $design_well->descendants->depth_first_traversal($design_well, 'out');
while ( my $well = $it->next ) {
push @final_vector_wells, $well
if $well->plate_type eq 'FINAL' && satisfies_cassette_function( $cassette_function, $well );
}
}
return @final_vector_wells;
}
sub dna_wells {
my ( $self, $vector_wells ) = @_;
my @dna_wells;
for my $vector_well ( @{$vector_wells} ) {
my $it = $vector_well->descendants->depth_first_traversal($vector_well, 'out');
while ( my $well = $it->next ) {
push @dna_wells, $well
if $well->plate_type eq 'DNA';
}
}
return @dna_wells;
}
sub electroporation_wells {
my ( $self, $vector_wells, $plate_type ) = @_;
my @electroporation_wells;
for my $vector_well( @{$vector_wells} ) {
my $it = $vector_well->descendants->depth_first_traversal($vector_well, 'out');
while ( my $well = $it->next ) {
push @electroporation_wells, $well
if $well->plate_type eq $plate_type;
}
}
return @electroporation_wells;
}
sub pick_wells {
my ( $self, $electroporation_wells, $plate_type ) = @_;
my @pick_wells;
for my $ep_well ( @{$electroporation_wells} ) {
my $it = $ep_well->descendants->depth_first_traversal($ep_well, 'out');
while ( my $well = $it->next ) {
push @pick_wells, $well
if $well->plate_type eq $plate_type;
}
}
return @pick_wells;
}
__PACKAGE__->meta->make_immutable;
1;
__END__