File Coverage

Bio/Variation/VariantI.pm
Criterion Covered Total %
statement 140 171 81.8
branch 81 108 75.0
condition 17 27 62.9
subroutine 21 25 84.0
pod 21 21 100.0
total 280 352 79.5


line stmt bran cond sub pod time code
1             #
2             # BioPerl module for Bio::Variation::VariantI
3             #
4             # Please direct questions and support issues to
5             #
6             # Cared for by Heikki Lehvaslaiho
7             #
8             # Copyright Heikki Lehvaslaiho
9             #
10             # You may distribute this module under the same terms as perl itself
11              
12             # POD documentation - main docs before the code
13              
14             =head1 NAME
15              
16             Bio::Variation::VariantI - Sequence Change SeqFeature abstract class
17              
18             =head1 SYNOPSIS
19              
20             #get Bio::Variant::VariantI somehow
21             print $var->restriction_changes, "\n";
22             foreach $allele ($var->each_Allele) {
23             #work on Bio::Variation::Allele objects
24             }
25              
26             =head1 DESCRIPTION
27              
28             This superclass defines common methods to basic sequence changes. The
29             instantiable classes Bio::Variation::DNAMutation,
30             Bio::Variation::RNAChange and Bio::Variation::AAChange use them.
31             See L, L,
32             and L for more information.
33              
34             These classes store information, heavy computation to determine allele
35             sequences is done elsewhere.
36              
37             The database cross-references are implemented as
38             Bio::Annotation::DBLink objects. The methods to access them are
39             defined in Bio::DBLinkContainerI. See L
40             and L for details.
41              
42             Bio::Variation::VariantI redifines and extends
43             Bio::SeqFeature::Generic for sequence variations. This class
44             describes specific sequence change events. These events are always
45             from a specific reference sequence to something different. See
46             L for more information.
47              
48             IMPORTANT: The notion of reference sequence permeates all
49             Bio::Variation classes. This is especially important to remember when
50             dealing with Alleles. In a polymorphic site, there can be a large
51             number of alleles. One of then has to be selected to be the reference
52             allele (allele_ori). ALL the rest has to be passed to the Variant
53             using the method add_Allele, including the mutated allele in a
54             canonical mutation. The IO modules and generated attributes depend on
55             it. They ignore the allele linked to using allele_mut and circulate
56             each Allele returned by each_Allele into allele_mut and calculate
57             the changes between that and allele_ori.
58              
59              
60             =head1 FEEDBACK
61              
62             =head2 Mailing Lists
63              
64             User feedback is an integral part of the evolution of this and other
65             Bioperl modules. Send your comments and suggestions preferably to the
66             Bioperl mailing lists Your participation is much appreciated.
67              
68             bioperl-l@bioperl.org - General discussion
69             http://bioperl.org/wiki/Mailing_lists - About the mailing lists
70              
71             =head2 Support
72              
73             Please direct usage questions or support issues to the mailing list:
74              
75             I
76              
77             rather than to the module maintainer directly. Many experienced and
78             reponsive experts will be able look at the problem and quickly
79             address it. Please include a thorough description of the problem
80             with code and data examples if at all possible.
81              
82             =head2 Reporting Bugs
83              
84             Report bugs to the Bioperl bug tracking system to help us keep track
85             the bugs and their resolution. Bug reports can be submitted via the
86             web:
87              
88             https://github.com/bioperl/bioperl-live/issues
89              
90             =head1 AUTHOR - Heikki Lehvaslaiho
91              
92             Email: heikki-at-bioperl-dot-org
93              
94             =head1 APPENDIX
95              
96             The rest of the documentation details each of the object
97             methods. Internal methods are usually preceded with a _
98              
99             =cut
100              
101              
102             # Let the code begin...
103              
104              
105             package Bio::Variation::VariantI;
106 11     11   76 use strict;
  11         22  
  11         348  
107             # Object preamble - inheritance
108              
109 11     11   59 use base qw(Bio::Root::Root Bio::SeqFeature::Generic Bio::DBLinkContainerI);
  11         17  
  11         3701  
110              
111             =head2 id
112              
113             Title : id
114             Usage : $obj->id
115             Function:
116              
117             Read only method. Returns the id of the variation object.
118             The id is the id of the first DBLink object attached to this object.
119              
120             Example :
121             Returns : scalar
122             Args : none
123              
124             =cut
125              
126             sub id {
127 0     0 1 0 my ($self) = @_;
128 0         0 my @ids = $self->each_DBLink;
129 0 0       0 my $id = $ids[0] if scalar @ids > 0;
130 0 0       0 return $id->database. "::". $id->primary_id if $id;
131             }
132              
133              
134             =head2 add_Allele
135              
136             Title : add_Allele
137             Usage : $self->add_Allele($allele)
138             Function:
139              
140             Adds one Bio::Variation::Allele into the list of alleles.
141             Note that the method forces the convention that nucleotide
142             sequence is in lower case and amino acds are in upper
143             case.
144              
145             Example :
146             Returns : 1 when succeeds, 0 for failure.
147             Args : Allele object
148              
149             =cut
150              
151              
152             sub add_Allele {
153 70     70 1 121 my ($self,$value) = @_;
154 70 50       119 if (defined $value) {
155 70 50       208 if( ! $value->isa('Bio::Variation::Allele') ) {
156 0         0 my $com = ref $value;
157 0         0 $self->throw("Is not a Allele object but a [$com]");
158 0         0 return 0;
159             } else {
160 70 100       210 if ( $self->isa('Bio::Variation::AAChange') ) {
161 19 100       41 $value->seq( uc $value->seq) if $value->seq;
162             } else {
163 51 100       93 $value->seq( lc $value->seq) if $value->seq;
164             }
165 70         109 push(@{$self->{'alleles'}},$value);
  70         167  
166 70         181 $self->allele_mut($value); #????
167 70         107 return 1;
168             }
169             } else {
170 0         0 return 0;
171             }
172             }
173              
174              
175             =head2 each_Allele
176              
177             Title : alleles
178             Usage : $obj->each_Allele();
179             Function:
180              
181             Returns a list of Bio::Variation::Allele objects
182              
183             Example :
184             Returns : list of Alleles
185             Args : none
186              
187             =cut
188              
189             sub each_Allele{
190 84     84 1 125 my ($self,@args) = @_;
191 84         79 return @{$self->{'alleles'}};
  84         214  
192             }
193              
194              
195             =head2 isMutation
196              
197             Title : isMutation
198             Usage : print join('/', $obj->each_Allele) if not $obj->isMutation;
199             Function:
200              
201             Returns or sets the boolean value indicating that the
202             variant described is a canonical mutation with two alleles
203             assinged to be the original (wild type) allele and mutated
204             allele, respectively. If this value is not set, it is
205             assumed that the Variant describes polymorphisms.
206              
207             Returns : a boolean
208              
209             =cut
210              
211             sub isMutation {
212 154     154 1 223 my ($self,$value) = @_;
213 154 100       279 if (defined $value) {
214 66 50       110 if ($value ) {
215 66         115 $self->{'isMutation'} = 1;
216             } else {
217 0         0 $self->{'isMutation'} = 0;
218             }
219             }
220 154         288 return $self->{'isMutation'};
221             }
222              
223              
224             =head2 allele_ori
225              
226             Title : allele_ori
227             Usage : $obj->allele_ori();
228             Function:
229              
230             Links to and returns the Bio::Variation::Allele object.
231             If value is not set, returns false. All other Alleles are
232             compared to this.
233              
234             Amino acid sequences are stored in upper case characters,
235             others in lower case.
236              
237             Example :
238             Returns : string
239             Args : string
240              
241             See L for more.
242              
243             =cut
244              
245             sub allele_ori {
246 1048     1048 1 1299 my ($self,$value) = @_;
247 1048 100       1267 if( defined $value) {
248 73 50 33     393 if ( ! ref $value || ! $value->isa('Bio::Variation::Allele')) {
249 0         0 $self->throw("Value is not Bio::Variation::Allele but [$value]");
250             } else {
251 73 100       302 if ( $self->isa('Bio::Variation::AAChange') ) {
252 19 50       41 $value->seq( uc $value->seq) if $value->seq;
253             } else {
254 54 100       104 $value->seq( lc $value->seq) if $value->seq;
255             }
256 73         166 $self->{'allele_ori'} = $value;
257             }
258             }
259 1048         2196 return $self->{'allele_ori'};
260             }
261              
262              
263             =head2 allele_mut
264              
265             Title : allele_mut
266             Usage : $obj->allele_mut();
267             Function:
268              
269             Links to and returns the Bio::Variation::Allele
270             object. Sets and returns the mutated allele sequence.
271             If value is not set, returns false.
272              
273             Amino acid sequences are stored in upper case characters,
274             others in lower case.
275              
276             Example :
277             Returns : string
278             Args : string
279              
280             See L for more.
281              
282             =cut
283              
284              
285             sub allele_mut {
286 1285     1285 1 1552 my ($self,$value) = @_;
287 1285 100       1551 if( defined $value) {
288 236 50 33     950 if ( ! ref $value || ! $value->isa('Bio::Variation::Allele')) {
289 0         0 $self->throw("Value is not Bio::Variation::Allele but [$value]");
290             } else {
291 236 100       621 if ( $self->isa('Bio::Variation::AAChange') ) {
292 69 100       125 $value->seq( uc $value->seq) if $value->seq;
293             } else {
294 167 100       341 $value->seq( lc $value->seq) if $value->seq;
295             }
296 236         405 $self->{'allele_mut'} = $value;
297             }
298             }
299 1285         2140 return $self->{'allele_mut'};
300             }
301              
302             =head2 length
303              
304             Title : length
305             Usage : $obj->length();
306             Function:
307              
308             Sets and returns the length of the affected original
309             allele sequence. If value is not set, returns false == 0.
310              
311             Value 0 means that the variant position is before the
312             start=end sequence position. (Value 1 would denote a point
313             mutation). This follows the convension to report an
314             insertion (2insT) in equivalent way to a corresponding
315             deletion (2delT) (Think about indel polymorpism ATC <=> AC
316             where the origianal state is not known ).
317              
318             Example :
319             Returns : string
320             Args : string
321              
322             =cut
323              
324              
325             sub length {
326 205     205 1 1996 my ($self,$value) = @_;
327 205 100       334 if ( defined $value) {
328 74         165 $self->{'length'} = $value;
329             }
330 205 100       348 if ( ! exists $self->{'length'} ) {
331 12         26 return 0;
332             }
333 193         401 return $self->{'length'};
334             }
335              
336             =head2 upStreamSeq
337              
338             Title : upStreamSeq
339             Usage : $obj->upStreamSeq();
340             Function:
341              
342             Sets and returns upstream flanking sequence string. If
343             value is not set, returns false. The sequence should be
344             >=25 characters long, if possible.
345              
346             Example :
347             Returns : string or false
348             Args : string
349              
350             =cut
351              
352              
353             sub upStreamSeq {
354 362     362 1 443 my ($self,$value) = @_;
355 362 100       471 if( defined $value) {
356 49         101 $self->{'upstreamseq'} = $value;
357             }
358 362         771 return $self->{'upstreamseq'};
359             }
360              
361              
362             =head2 dnStreamSeq
363              
364             Title : dnStreamSeq
365             Usage : $obj->dnStreamSeq();
366             Function:
367              
368             Sets and returns dnstream flanking sequence string. If
369             value is not set, returns false. The sequence should be
370             >=25 characters long, if possible.
371              
372             Example :
373             Returns : string or false
374             Args : string
375              
376             =cut
377              
378              
379             sub dnStreamSeq {
380 383     383 1 469 my ($self,$value) = @_;
381 383 100       560 if( defined $value) {
382 49         86 $self->{'dnstreamseq'} = $value;
383             }
384 383         760 return $self->{'dnstreamseq'};
385            
386             }
387              
388              
389             =head2 label
390              
391             Title : label
392             Usage : $obj->label();
393             Function:
394              
395             Sets and returns mutation event label(s). If value is not
396             set, or no argument is given returns false. Each
397             instantiable class needs to implement this method. Valid
398             values are listed in 'Mutation event controlled vocabulary' in
399             http://www.ebi.ac.uk/mutations/recommendations/mutevent.html.
400              
401             Example :
402             Returns : string
403             Args : string
404              
405             =cut
406              
407              
408             sub label {
409 0     0 1 0 my ($self,$value) = @_;
410 0         0 $self->throw_not_implemented();
411             }
412              
413              
414              
415             =head2 status
416              
417             Title : status
418             Usage : $obj->status()
419             Function:
420              
421             Returns the status of the sequence change object.
422             Valid values are: 'suspected' and 'proven'
423              
424             Example : $obj->status('proven');
425             Returns : scalar
426             Args : valid string (optional, for setting)
427              
428              
429             =cut
430              
431              
432             sub status {
433 6     6 1 12 my ($self,$value) = @_;
434 6         16 my %status = (suspected => 1,
435             proven => 1
436             );
437              
438 6 100       14 if( defined $value) {
439 3         7 $value = lc $value;
440 3 50       9 if ($status{$value}) {
441 3         7 $self->{'status'} = $value;
442             }
443             else {
444 0         0 $self->throw("$value is not valid status value!");
445             }
446             }
447 6 50       16 if( ! exists $self->{'status'} ) {
448 0         0 return "$self";
449             }
450 6         25 return $self->{'status'};
451             }
452              
453              
454             =head2 proof
455              
456             Title : proof
457             Usage : $obj->proof()
458             Function:
459              
460             Returns the proof of the sequence change object.
461             Valid values are: 'computed' and 'experimental'.
462              
463             Example : $obj->proof('computed');
464             Returns : scalar
465             Args : valid string (optional, for setting)
466              
467              
468             =cut
469              
470              
471             sub proof {
472 167     167 1 218 my ($self,$value) = @_;
473 167         360 my %proof = (computed => 1,
474             experimental => 1
475             );
476              
477 167 100       248 if( defined $value) {
478 63         109 $value = lc $value;
479 63 50       108 if ($proof{$value}) {
480 63         128 $self->{'proof'} = $value;
481             } else {
482 0         0 $self->throw("$value is not valid proof value!");
483             }
484             }
485 167         371 return $self->{'proof'};
486             }
487              
488              
489             =head2 region
490              
491             Title : region
492             Usage : $obj->region();
493             Function:
494              
495             Sets and returns the name of the sequence region type or
496             protein domain at this location. If value is not set,
497             returns false.
498              
499             Example :
500             Returns : string
501             Args : string
502              
503             =cut
504              
505              
506             sub region {
507 48     48 1 90 my ($self,$value) = @_;
508 48 100       91 if( defined $value) {
509 10         22 $self->{'region'} = $value;
510             }
511 48         148 return $self->{'region'};
512             }
513              
514              
515             =head2 region_value
516              
517             Title : region_value
518             Usage : $obj->region_value();
519             Function:
520              
521             Sets and returns the name of the sequence region_value or
522             protein domain at this location. If value is not set,
523             returns false.
524              
525             Example :
526             Returns : string
527             Args : string
528              
529             =cut
530              
531              
532             sub region_value {
533 56     56 1 82 my ($self,$value) = @_;
534 56 100       104 if( defined $value) {
535 8         24 $self->{'region_value'} = $value;
536             }
537 56         139 return $self->{'region_value'};
538             }
539              
540             =head2 region_dist
541              
542             Title : region_dist
543             Usage : $obj->region_dist();
544             Function:
545              
546             Sets and returns the distance tot the closest region
547             (i.e. intro/exon or domain) boundary. If distance is not
548             set, returns false.
549              
550             Example :
551             Returns : integer
552             Args : integer
553              
554             =cut
555              
556              
557             sub region_dist {
558 66     66 1 87 my ($self,$value) = @_;
559 66 100       105 if( defined $value) {
560 11 50       62 if ( not $value =~ /^[+-]?\d+$/ ) {
561 0         0 $self->throw("[$value] for region_dist has to be an integer\n");
562             } else {
563 11         32 $self->{'region_dist'} = $value;
564             }
565             }
566 66         158 return $self->{'region_dist'};
567             }
568              
569              
570             =head2 numbering
571              
572             Title : numbering
573             Usage : $obj->numbering()
574             Function:
575              
576             Returns the numbering chema used locating sequnce features.
577             Valid values are: 'entry' and 'coding'
578              
579             Example : $obj->numbering('coding');
580             Returns : scalar
581             Args : valid string (optional, for setting)
582              
583              
584             =cut
585              
586              
587             sub numbering {
588 6     6 1 13 my ($self,$value) = @_;
589 6         16 my %numbering = (entry => 1,
590             coding => 1
591             );
592              
593 6 100       15 if( defined $value) {
594 3         9 $value = lc $value;
595 3 50       11 if ($numbering{$value}) {
596 3         8 $self->{'numbering'} = $value;
597             }
598             else {
599 0         0 $self->throw("'$value' is not a valid for numbering!");
600             }
601             }
602 6 50       13 if( ! exists $self->{'numbering'} ) {
603 0         0 return "$self";
604             }
605 6         19 return $self->{'numbering'};
606             }
607              
608             =head2 mut_number
609              
610             Title : mut_number
611             Usage : $num = $obj->mut_number;
612             : $num = $obj->mut_number($number);
613             Function:
614              
615             Returns or sets the number identifying the order in which the
616             mutation has been issued. Numbers shouldstart from 1.
617             If the number has never been set, the method will return ''
618              
619             If you want the output from IO modules look nice and, for
620             multivariant/allele variations, make sense you better set
621             this attribute.
622              
623             Returns : an integer
624              
625             =cut
626              
627              
628             sub mut_number {
629 288     288 1 378 my ($self,$value) = @_;
630 288 100       393 if (defined $value) {
631 72         123 $self->{'mut_number'} = $value;
632             }
633 288 50       431 unless (exists $self->{'mut_number'}) {
634 0         0 return ('');
635             } else {
636 288         674 return $self->{'mut_number'};
637             }
638             }
639              
640              
641             =head2 SeqDiff
642              
643             Title : SeqDiff
644             Usage : $mutobj = $obj->SeqDiff;
645             : $mutobj = $obj->SeqDiff($objref);
646             Function:
647              
648             Returns or sets the link-reference to the umbrella
649             Bio::Variation::SeqDiff object. If there is no link,
650             it will return undef
651              
652             Note: Adding a variant into a SeqDiff object will
653             automatically set this value.
654              
655             Returns : an obj_ref or undef
656              
657             See L for more information.
658              
659             =cut
660              
661             sub SeqDiff {
662 208     208 1 263 my ($self,$value) = @_;
663 208 100       288 if (defined $value) {
664 77 50       177 if( ! $value->isa('Bio::Variation::SeqDiff') ) {
665 0         0 $self->throw("Is not a Bio::Variation::SeqDiff object but a [$value]");
666 0         0 return;
667             }
668             else {
669 77         127 $self->{'seqDiff'} = $value;
670             }
671             }
672 208 100       281 unless (exists $self->{'seqDiff'}) {
673 7         11 return;
674             } else {
675 201         395 return $self->{'seqDiff'};
676             }
677             }
678              
679             =head2 add_DBLink
680              
681             Title : add_DBLink
682             Usage : $self->add_DBLink($ref)
683             Function: adds a link object
684             Example :
685             Returns :
686             Args :
687              
688              
689             =cut
690              
691              
692             sub add_DBLink{
693 0     0 1 0 my ($self,$com) = @_;
694 0 0 0     0 if( $com && ! $com->isa('Bio::Annotation::DBLink') ) {
695 0         0 $self->throw("Is not a link object but a [$com]");
696             }
697 0 0       0 $com && push(@{$self->{'link'}},$com);
  0         0  
698             }
699              
700             =head2 each_DBLink
701              
702             Title : each_DBLink
703             Usage : foreach $ref ( $self->each_DBlink() )
704             Function: gets an array of DBlink of objects
705             Example :
706             Returns :
707             Args :
708              
709              
710             =cut
711              
712             sub each_DBLink{
713 0     0 1 0 my ($self) = @_;
714            
715 0         0 return @{$self->{'link'}};
  0         0  
716             }
717              
718             =head2 restriction_changes
719              
720             Title : restriction_changes
721             Usage : $obj->restriction_changes();
722             Function:
723              
724             Returns a string containing a list of restriction
725             enzyme changes of form +EcoRI, separated by
726             commas. Strings need to be valid restriction enzyme names
727             as stored in REBASE. allele_ori and allele_mut need to be assigned.
728              
729             Example :
730             Returns : string
731             Args : string
732              
733             =cut
734              
735             sub restriction_changes {
736 105     105 1 140 my ($self) = @_;
737              
738 105 100       159 if (not $self->{'re_changes'}) {
739 37         79 my %re = &_enzymes;
740            
741             # complain if used on AA data
742 37 50       414 if ($self->isa('Bio::Variation::AAChange')) {
743 0         0 $self->throw('Restriction enzymes do not bite polypeptides!');
744             }
745            
746             #sanity checks
747 37 50       75 $self->warn('Upstream sequence is empty!')
748             if $self->upStreamSeq eq '';
749 37 50       67 $self->warn('Downstream sequence is empty!')
750             if $self->dnStreamSeq eq '';
751             # $self->warn('Original allele sequence is empty!')
752             # if $self->allele_ori eq '';
753             # $self->warn('Mutated allele sequence is empty!')
754             # if $self->allele_mut eq '';
755            
756             #reuse the non empty DNA level list at RNA level if the flanks are identical
757             #Hint: Check DNAMutation object first
758 37 100 100     151 if ($self->isa('Bio::Variation::RNAChange') and $self->DNAMutation and
      66        
      66        
      66        
759             $self->upStreamSeq eq $self->DNAMutation->upStreamSeq and
760             $self->dnStreamSeq eq $self->DNAMutation->dnStreamSeq and
761             $self->DNAMutation->restriction_changes ne '' ) {
762 16         25 $self->{'re_changes'} = $self->DNAMutation->restriction_changes;
763             } else {
764            
765             #maximum length of a type II restriction site in the current REBASE
766 21         35 my ($le_dn) = 15;
767 21         44 my ($le_up) = $le_dn;
768              
769             #reduce the flank lengths if the desired length is not available
770 21 50       37 $le_dn = CORE::length ($self->dnStreamSeq) if $le_dn > CORE::length ($self->dnStreamSeq);
771 21 50       39 $le_up = CORE::length ($self->upStreamSeq) if $le_up > CORE::length ($self->upStreamSeq);
772              
773             #Build sequence strings to compare
774 21         24 my ($oriseq, $mutseq);
775 21         29 $oriseq = $mutseq = substr($self->upStreamSeq, -$le_up, $le_up);
776 21 100       47 $oriseq .= $self->allele_ori->seq if $self->allele_ori->seq;
777 21 100       60 $mutseq .= $self->allele_mut->seq if $self->allele_mut->seq;
778 21         42 $oriseq .= substr($self->dnStreamSeq, 0, $le_dn);
779 21         37 $mutseq .= substr($self->dnStreamSeq, 0, $le_dn);
780            
781             # ... and their reverse complements
782 21         44 my $oriseq_rev = _revcompl ($oriseq);
783 21         31 my $mutseq_rev = _revcompl ($mutseq);
784              
785             # collect results into a string
786 21         30 my $rec = '';
787 21         1506 foreach my $enz (sort keys (%re)) {
788 4746         5557 my $site = $re{$enz};
789 4746         36838 my @ori = ($oriseq=~ /$site/g);
790 4746         35913 my @mut = ($mutseq=~ /$site/g);
791 4746         35205 my @ori_r = ($oriseq_rev =~ /$site/g);
792 4746         35505 my @mut_r = ($mutseq_rev =~ /$site/g);
793            
794 4746 100 100     13779 $rec .= '+'. $enz. ", "
795             if (scalar @ori < scalar @mut) or (scalar @ori_r < scalar @mut_r);
796 4746 100 100     12273 $rec .= '-'. $enz. ", "
797             if (scalar @ori > scalar @mut) or (scalar @ori_r > scalar @mut_r);
798            
799             }
800 21 100       233 $rec = substr($rec, 0, CORE::length($rec) - 2) if $rec ne '';
801 21         575 $self->{'re_changes'} = $rec;
802             }
803             }
804 105         566 return $self->{'re_changes'}
805             }
806              
807              
808             sub _revcompl {
809             # side effect: lower case letters
810 42     42   59 my ($seq) = shift;
811              
812 42         57 $seq = lc $seq;
813 42         51 $seq =~ tr/acgtrymkswhbvdnx/tgcayrkmswdvbhnx/;
814 42         85 return CORE::reverse $seq;
815             }
816              
817              
818             sub _enzymes {
819             #REBASE version 005 type2.005
820 37     37   2641 my %enzymes = (
821             'AarI' => 'cacctgc',
822             'AatII' => 'gacgtc',
823             'AccI' => 'gt[ac][gt]ac',
824             'AceIII' => 'cagctc',
825             'AciI' => 'ccgc',
826             'AclI' => 'aacgtt',
827             'AcyI' => 'g[ag]cg[ct]c',
828             'AflII' => 'cttaag',
829             'AflIII' => 'ac[ag][ct]gt',
830             'AgeI' => 'accggt',
831             'AhaIII' => 'tttaaa',
832             'AloI' => 'gaac[acgt][acgt][acgt][acgt][acgt][acgt]tcc',
833             'AluI' => 'agct',
834             'AlwNI' => 'cag[acgt][acgt][acgt]ctg',
835             'ApaBI' => 'gca[acgt][acgt][acgt][acgt][acgt]tgc',
836             'ApaI' => 'gggccc',
837             'ApaLI' => 'gtgcac',
838             'ApoI' => '[ag]aatt[ct]',
839             'AscI' => 'ggcgcgcc',
840             'AsuI' => 'gg[acgt]cc',
841             'AsuII' => 'ttcgaa',
842             'AvaI' => 'c[ct]cg[ag]g',
843             'AvaII' => 'gg[at]cc',
844             'AvaIII' => 'atgcat',
845             'AvrII' => 'cctagg',
846             'BaeI' => 'ac[acgt][acgt][acgt][acgt]gta[ct]c',
847             'BalI' => 'tggcca',
848             'BamHI' => 'ggatcc',
849             'BbvCI' => 'cctcagc',
850             'BbvI' => 'gcagc',
851             'BbvII' => 'gaagac',
852             'BccI' => 'ccatc',
853             'Bce83I' => 'cttgag',
854             'BcefI' => 'acggc',
855             'BcgI' => 'cga[acgt][acgt][acgt][acgt][acgt][acgt]tgc',
856             'BciVI' => 'gtatcc',
857             'BclI' => 'tgatca',
858             'BetI' => '[at]ccgg[at]',
859             'BfiI' => 'actggg',
860             'BglI' => 'gcc[acgt][acgt][acgt][acgt][acgt]ggc',
861             'BglII' => 'agatct',
862             'BinI' => 'ggatc',
863             'BmgI' => 'g[gt]gccc',
864             'BplI' => 'gag[acgt][acgt][acgt][acgt][acgt]ctc',
865             'Bpu10I' => 'cct[acgt]agc',
866             'BsaAI' => '[ct]acgt[ag]',
867             'BsaBI' => 'gat[acgt][acgt][acgt][acgt]atc',
868             'BsaXI' => 'ac[acgt][acgt][acgt][acgt][acgt]ctcc',
869             'BsbI' => 'caacac',
870             'BscGI' => 'cccgt',
871             'BseMII' => 'ctcag',
872             'BsePI' => 'gcgcgc',
873             'BseRI' => 'gaggag',
874             'BseSI' => 'g[gt]gc[ac]c',
875             'BsgI' => 'gtgcag',
876             'BsiI' => 'cacgag',
877             'BsiYI' => 'cc[acgt][acgt][acgt][acgt][acgt][acgt][acgt]gg',
878             'BsmAI' => 'gtctc',
879             'BsmI' => 'gaatgc',
880             'Bsp1407I' => 'tgtaca',
881             'Bsp24I' => 'gac[acgt][acgt][acgt][acgt][acgt][acgt]tgg',
882             'BspGI' => 'ctggac',
883             'BspHI' => 'tcatga',
884             'BspLU11I' => 'acatgt',
885             'BspMI' => 'acctgc',
886             'BspMII' => 'tccgga',
887             'BsrBI' => 'ccgctc',
888             'BsrDI' => 'gcaatg',
889             'BsrI' => 'actgg',
890             'BstEII' => 'ggt[acgt]acc',
891             'BstXI' => 'cca[acgt][acgt][acgt][acgt][acgt][acgt]tgg',
892             'BtrI' => 'cacgtc',
893             'BtsI' => 'gcagtg',
894             'Cac8I' => 'gc[acgt][acgt]gc',
895             'CauII' => 'cc[cg]gg',
896             'Cfr10I' => '[ag]ccgg[ct]',
897             'CfrI' => '[ct]ggcc[ag]',
898             'CjeI' => 'cca[acgt][acgt][acgt][acgt][acgt][acgt]gt',
899             'CjePI' => 'cca[acgt][acgt][acgt][acgt][acgt][acgt][acgt]tc',
900             'ClaI' => 'atcgat',
901             'CviJI' => '[ag]gc[ct]',
902             'CviRI' => 'tgca',
903             'DdeI' => 'ct[acgt]ag',
904             'DpnI' => 'gatc',
905             'DraII' => '[ag]gg[acgt]cc[ct]',
906             'DraIII' => 'cac[acgt][acgt][acgt]gtg',
907             'DrdI' => 'gac[acgt][acgt][acgt][acgt][acgt][acgt]gtc',
908             'DrdII' => 'gaacca',
909             'DsaI' => 'cc[ag][ct]gg',
910             'Eam1105I' => 'gac[acgt][acgt][acgt][acgt][acgt]gtc',
911             'EciI' => 'ggcgga',
912             'Eco31I' => 'ggtctc',
913             'Eco47III' => 'agcgct',
914             'Eco57I' => 'ctgaag',
915             'EcoNI' => 'cct[acgt][acgt][acgt][acgt][acgt]agg',
916             'EcoRI' => 'gaattc',
917             'EcoRII' => 'cc[at]gg',
918             'EcoRV' => 'gatatc',
919             'Esp3I' => 'cgtctc',
920             'EspI' => 'gct[acgt]agc',
921             'FauI' => 'cccgc',
922             'FinI' => 'gggac',
923             'Fnu4HI' => 'gc[acgt]gc',
924             'FnuDII' => 'cgcg',
925             'FokI' => 'ggatg',
926             'FseI' => 'ggccggcc',
927             'GdiII' => 'cggcc[ag]',
928             'GsuI' => 'ctggag',
929             'HaeI' => '[at]ggcc[at]',
930             'HaeII' => '[ag]gcgc[ct]',
931             'HaeIII' => 'ggcc',
932             'HaeIV' => 'ga[ct][acgt][acgt][acgt][acgt][acgt][ag]tc',
933             'HgaI' => 'gacgc',
934             'HgiAI' => 'g[at]gc[at]c',
935             'HgiCI' => 'gg[ct][ag]cc',
936             'HgiEII' => 'acc[acgt][acgt][acgt][acgt][acgt][acgt]ggt',
937             'HgiJII' => 'g[ag]gc[ct]c',
938             'HhaI' => 'gcgc',
939             'Hin4I' => 'ga[cgt][acgt][acgt][acgt][acgt][acgt][acg]tc',
940             'HindII' => 'gt[ct][ag]ac',
941             'HindIII' => 'aagctt',
942             'HinfI' => 'ga[acgt]tc',
943             'HpaI' => 'gttaac',
944             'HpaII' => 'ccgg',
945             'HphI' => 'ggtga',
946             'Hpy178III' => 'tc[acgt][acgt]ga',
947             'Hpy188I' => 'tc[acgt]ga',
948             'Hpy99I' => 'cg[at]cg',
949             'KpnI' => 'ggtacc',
950             'Ksp632I' => 'ctcttc',
951             'MaeI' => 'ctag',
952             'MaeII' => 'acgt',
953             'MaeIII' => 'gt[acgt]ac',
954             'MboI' => 'gatc',
955             'MboII' => 'gaaga',
956             'McrI' => 'cg[ag][ct]cg',
957             'MfeI' => 'caattg',
958             'MjaIV' => 'gt[acgt][acgt]ac',
959             'MluI' => 'acgcgt',
960             'MmeI' => 'tcc[ag]ac',
961             'MnlI' => 'cctc',
962             'MseI' => 'ttaa',
963             'MslI' => 'ca[ct][acgt][acgt][acgt][acgt][ag]tg',
964             'MstI' => 'tgcgca',
965             'MwoI' => 'gc[acgt][acgt][acgt][acgt][acgt][acgt][acgt]gc',
966             'NaeI' => 'gccggc',
967             'NarI' => 'ggcgcc',
968             'NcoI' => 'ccatgg',
969             'NdeI' => 'catatg',
970             'NheI' => 'gctagc',
971             'NlaIII' => 'catg',
972             'NlaIV' => 'gg[acgt][acgt]cc',
973             'NotI' => 'gcggccgc',
974             'NruI' => 'tcgcga',
975             'NspBII' => 'c[ac]gc[gt]g',
976             'NspI' => '[ag]catg[ct]',
977             'PacI' => 'ttaattaa',
978             'Pfl1108I' => 'tcgtag',
979             'PflMI' => 'cca[acgt][acgt][acgt][acgt][acgt]tgg',
980             'PleI' => 'gagtc',
981             'PmaCI' => 'cacgtg',
982             'PmeI' => 'gtttaaac',
983             'PpiI' => 'gaac[acgt][acgt][acgt][acgt][acgt]ctc',
984             'PpuMI' => '[ag]gg[at]cc[ct]',
985             'PshAI' => 'gac[acgt][acgt][acgt][acgt]gtc',
986             'PsiI' => 'ttataa',
987             'PstI' => 'ctgcag',
988             'PvuI' => 'cgatcg',
989             'PvuII' => 'cagctg',
990             'RleAI' => 'cccaca',
991             'RsaI' => 'gtac',
992             'RsrII' => 'cgg[at]ccg',
993             'SacI' => 'gagctc',
994             'SacII' => 'ccgcgg',
995             'SalI' => 'gtcgac',
996             'SanDI' => 'ggg[at]ccc',
997             'SapI' => 'gctcttc',
998             'SauI' => 'cct[acgt]agg',
999             'ScaI' => 'agtact',
1000             'ScrFI' => 'cc[acgt]gg',
1001             'SduI' => 'g[agt]gc[act]c',
1002             'SecI' => 'cc[acgt][acgt]gg',
1003             'SexAI' => 'acc[at]ggt',
1004             'SfaNI' => 'gcatc',
1005             'SfeI' => 'ct[ag][ct]ag',
1006             'SfiI' => 'ggcc[acgt][acgt][acgt][acgt][acgt]ggcc',
1007             'SgfI' => 'gcgatcgc',
1008             'SgrAI' => 'c[ag]ccgg[ct]g',
1009             'SimI' => 'gggtc',
1010             'SmaI' => 'cccggg',
1011             'SmlI' => 'ct[ct][ag]ag',
1012             'SnaBI' => 'tacgta',
1013             'SnaI' => 'gtatac',
1014             'SpeI' => 'actagt',
1015             'SphI' => 'gcatgc',
1016             'SplI' => 'cgtacg',
1017             'SrfI' => 'gcccgggc',
1018             'Sse232I' => 'cgccggcg',
1019             'Sse8387I' => 'cctgcagg',
1020             'Sse8647I' => 'agg[at]cct',
1021             'SspI' => 'aatatt',
1022             'Sth132I' => 'cccg',
1023             'StuI' => 'aggcct',
1024             'StyI' => 'cc[at][at]gg',
1025             'SwaI' => 'atttaaat',
1026             'TaqI' => 'tcga',
1027             'TaqII' => 'gaccga',
1028             'TatI' => '[at]gtac[at]',
1029             'TauI' => 'gc[cg]gc',
1030             'TfiI' => 'ga[at]tc',
1031             'TseI' => 'gc[at]gc',
1032             'Tsp45I' => 'gt[cg]ac',
1033             'Tsp4CI' => 'ac[acgt]gt',
1034             'TspEI' => 'aatt',
1035             'TspRI' => 'ca[cg]tg[acgt][acgt]',
1036             'Tth111I' => 'gac[acgt][acgt][acgt]gtc',
1037             'Tth111II' => 'caa[ag]ca',
1038             'UbaGI' => 'cac[acgt][acgt][acgt][acgt]gtg',
1039             'UbaPI' => 'cgaacg',
1040             'VspI' => 'attaat',
1041             'XbaI' => 'tctaga',
1042             'XcmI' => 'cca[acgt][acgt][acgt][acgt][acgt][acgt][acgt][acgt][acgt]tgg',
1043             'XhoI' => 'ctcgag',
1044             'XhoII' => '[ag]gatc[ct]',
1045             'XmaIII' => 'cggccg',
1046             'XmnI' => 'gaa[acgt][acgt][acgt][acgt]ttc'
1047             );
1048              
1049 37         2403 return %enzymes;
1050             }
1051              
1052             1;