[Bio] / FigKernelPackages / Observation.pm Repository:
ViewVC logotype

Annotation of /FigKernelPackages/Observation.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (view) (download) (as text)

1 : mkubal 1.1 package Observation;
2 :    
3 :     require Exporter;
4 :     @EXPORT_OK = qw(get_objects);
5 :    
6 :     use strict;
7 :     use warnings;
8 : arodri7 1.9 use HTML;
9 : mkubal 1.1
10 :     1;
11 :    
12 : arodri7 1.10 # $Id: Observation.pm,v 1.9 2007/06/20 16:43:13 arodri7 Exp $
13 : mkubal 1.1
14 :     =head1 NAME
15 :    
16 :     Observation -- A presentation layer for observations in SEED.
17 :    
18 :     =head1 DESCRIPTION
19 :    
20 :     The SEED environment contains various sources of information for sequence features. The purpose of this library is to provide a
21 :     single interface to this data.
22 :    
23 :     The data can be used to display information for a given sequence feature (protein or other, but primarily information is computed for proteins).
24 :    
25 :     Example:
26 :    
27 : arodri7 1.9
28 : mkubal 1.1 use FIG;
29 :     use Observation;
30 :    
31 : paczian 1.2 my $fig = new FIG;
32 :     my $fid = "fig|83333.1.peg.3";
33 :    
34 :     my $observations = Observation::get_objects($fid);
35 :     foreach my $observation (@$observations) {
36 :     print "ID: " . $fid . "\n";
37 :     print "Start: " . $observation->start() . "\n";
38 :     ...
39 :     }
40 : mkubal 1.1
41 :     B<return an array of objects>
42 :    
43 :    
44 :     print "$Observation->acc\n" prints the Accession number if present for the Observation
45 :    
46 :     =cut
47 :    
48 :     =head1 BACKGROUND
49 :    
50 :     =head2 Data incorporated in the Observations
51 :    
52 :     As the goal of this library is to provide an integrated view, we combine diverse sources of evidence.
53 :    
54 :     =head3 SEED core evidence
55 :    
56 :     The core SEED data structures provided by FIG.pm. These are Similarities, BBHs and PCHs.
57 :    
58 :     =head3 Attribute based Evidence
59 :    
60 :     We use the SEED attribute infrastructure to store information computed by a variety of computational procedures.
61 :    
62 :     These are e.g. InterPro hits via InterProScan (ipr), NCBI Conserved Domain Database Hits via PSSM(cdd),
63 :     PFAM hits via HMM(pfam), SignalP results(signalp), and various others.
64 :    
65 :     =head1 METHODS
66 :    
67 :     The public methods this package provides are listed below:
68 :    
69 :     =head3 acc()
70 :    
71 :     A valid accession or remote ID (in the style of a db_xref) or a valid local ID (FID) in case this is supported.
72 :    
73 :     =cut
74 :    
75 :     sub acc {
76 :     my ($self) = @_;
77 :    
78 :     return $self->{acc};
79 :     }
80 :    
81 :     =head3 description()
82 :    
83 :     The description of the hit. Taken from the data or from the our Ontology database for some cases e.g. IPR or PFAM.
84 :    
85 :     B<Please note:>
86 :     Either remoteid or description is required.
87 :    
88 :     =cut
89 :    
90 :     sub description {
91 :     my ($self) = @_;
92 :    
93 : arodri7 1.5 return $self->{description};
94 : mkubal 1.1 }
95 :    
96 :     =head3 class()
97 :    
98 :     The class of evidence (required). This is usually simply the name of the tool or the name of the SEED data structure.
99 :     B<Please note> the connection of class and display_method and URL.
100 : mkubal 1.7
101 : mkubal 1.1 Current valid classes are:
102 :    
103 :     =over 9
104 :    
105 : arodri7 1.9 =item IDENTICAL (seq)
106 :    
107 : mkubal 1.3 =item SIM (seq)
108 : mkubal 1.1
109 : mkubal 1.3 =item BBH (seq)
110 : mkubal 1.1
111 : mkubal 1.3 =item PCH (fc)
112 : mkubal 1.1
113 : mkubal 1.3 =item FIGFAM (seq)
114 : mkubal 1.1
115 : mkubal 1.3 =item IPR (dom)
116 : mkubal 1.1
117 : mkubal 1.3 =item CDD (dom)
118 : mkubal 1.1
119 : mkubal 1.3 =item PFAM (dom)
120 : mkubal 1.1
121 : mkubal 1.3 =item SIGNALP (dom)
122 : mkubal 1.1
123 : mkubal 1.3 =item CELLO(loc)
124 : mkubal 1.1
125 : mkubal 1.3 =item TMHMM (loc)
126 : mkubal 1.1
127 : mkubal 1.3 =item HMMTOP (loc)
128 : mkubal 1.1
129 :     =back
130 :    
131 :     =cut
132 :    
133 :     sub class {
134 :     my ($self) = @_;
135 :    
136 :     return $self->{class};
137 :     }
138 :    
139 :     =head3 type()
140 :    
141 :     The type of evidence (required).
142 :    
143 :     Where type is one of the following:
144 :    
145 :     =over 8
146 :    
147 :     =item seq=Sequence similarity
148 :    
149 :     =item dom=domain based match
150 :    
151 :     =item loc=Localization of the feature
152 :    
153 :     =item fc=Functional coupling.
154 :    
155 :     =back
156 :    
157 :     =cut
158 :    
159 :     sub type {
160 :     my ($self) = @_;
161 :    
162 :     return $self->{acc};
163 :     }
164 :    
165 :     =head3 start()
166 :    
167 :     Start of hit in query sequence.
168 :    
169 :     =cut
170 :    
171 :     sub start {
172 :     my ($self) = @_;
173 :    
174 :     return $self->{start};
175 :     }
176 :    
177 :     =head3 end()
178 :    
179 :     End of the hit in query sequence.
180 :    
181 :     =cut
182 :    
183 :     sub stop {
184 :     my ($self) = @_;
185 :    
186 :     return $self->{stop};
187 :     }
188 :    
189 :     =head3 evalue()
190 :    
191 :     E-value or P-Value if present.
192 :    
193 :     =cut
194 :    
195 :     sub evalue {
196 :     my ($self) = @_;
197 :    
198 :     return $self->{evalue};
199 :     }
200 :    
201 :     =head3 score()
202 :    
203 :     Score if present.
204 :    
205 :     B<Please note: >
206 :     Either score or eval are required.
207 :    
208 :     =cut
209 :    
210 :     sub score {
211 :     my ($self) = @_;
212 :     return $self->{score};
213 :     }
214 :    
215 :    
216 :     =head3 display_method()
217 :    
218 :     If available use the function specified here to display the "raw" observation.
219 :     In the case of a BLAST alignment of fid1 and fid2 a cgi script
220 :     will be called to display the results of running the command "bl2seq fid1 fid2".
221 :    
222 :     B<Please note> that URL linked to in display_method() is an external component and needs to added to the code for every class of evidence.
223 :    
224 :     =cut
225 :    
226 : mkubal 1.7 sub display {
227 : mkubal 1.1
228 : mkubal 1.7 die "Abstract Method Called\n";
229 : mkubal 1.1
230 :     }
231 :    
232 : mkubal 1.7
233 : mkubal 1.1 =head3 rank()
234 :    
235 :     Returns an integer from 1 - 10 indicating the importance of this observations.
236 :    
237 :     Currently always returns 1.
238 :    
239 :     =cut
240 :    
241 :     sub rank {
242 :     my ($self) = @_;
243 :    
244 :     # return $self->{rank};
245 :    
246 :     return 1;
247 :     }
248 :    
249 :     =head3 supports_annotation()
250 :    
251 :     Does a this observation support the annotation of its feature?
252 :    
253 :     Returns
254 :    
255 :     =over 3
256 :    
257 :     =item 10, if feature annotation is identical to $self->description
258 :    
259 :     =item 1, Feature annotation is similar to $self->annotation; this is computed using FIG::SameFunc()
260 :    
261 :     =item undef
262 :    
263 :     =back
264 :    
265 :     =cut
266 :    
267 :     sub supports_annotation {
268 :     my ($self) = @_;
269 :    
270 :     # no code here so far
271 :    
272 :     return $self->{supports_annotation};
273 :     }
274 :    
275 :     =head3 url()
276 :    
277 :     URL describing the subject. In case of a BLAST hit against a sequence, this URL will lead to a page displaying the sequence record for the sequence. In case of an HMM hit, the URL will be to the URL description.
278 :    
279 :     =cut
280 :    
281 :     sub url {
282 :     my ($self) = @_;
283 :    
284 :     my $url = get_url($self->type, $self->acc);
285 :    
286 :     return $url;
287 :     }
288 :    
289 :     =head3 get_objects()
290 :    
291 :     This is the B<REAL WORKHORSE> method of this Package.
292 :    
293 :     It will probably have to:
294 :    
295 :     - get all sims for the feature
296 :     - get all bbhs for the feature
297 :     - copy information from sim to bbh (bbh have no match location etc)
298 :     - get pchs (difficult)
299 :     - get attributes (there is code for this that in get_attribute_based_observations
300 :     - get_attributes_based_observations returns an array of arrays of hashes like this"
301 :    
302 : mkubal 1.7 my $dataset
303 : mkubal 1.1 [
304 :     [ { name => 'acc', value => '1234' },
305 :     { name => 'from', value => '4' },
306 :     { name => 'to', value => '400' },
307 :     ....
308 :     ],
309 :     [ { name => 'acc', value => '456' },
310 :     { name => 'from', value => '1' },
311 :     { name => 'to', value => '100' },
312 :     ....
313 :     ],
314 :     ...
315 :     ];
316 :     return $datasets;
317 :     }
318 :    
319 :     It will invoke the required calls to the SEED API to retrieve the information required.
320 :    
321 :     =cut
322 :    
323 :     sub get_objects {
324 : mkubal 1.7 my ($self,$fid,$classes) = @_;
325 :    
326 :    
327 :     my $objects = [];
328 :     my @matched_datasets=();
329 : mkubal 1.1
330 : mkubal 1.7 # call function that fetches attribute based observations
331 :     # returns an array of arrays of hashes
332 :    
333 :     if(scalar(@$classes) < 1){
334 :     get_attribute_based_observations($fid,\@matched_datasets);
335 :     get_sims_observations($fid,\@matched_datasets);
336 :     get_identical_proteins($fid,\@matched_datasets);
337 :     get_functional_coupling($fid,\@matched_datasets);
338 :     }
339 :     else{
340 :     #IPR,CDD,CELLO,PFAM,SIGNALP - attribute based
341 :     my %domain_classes;
342 : arodri7 1.9 my $identical_flag=0;
343 :     my $pch_flag=0;
344 : arodri7 1.10 my $sims_flag=0;
345 : mkubal 1.7 foreach my $class (@$classes){
346 : arodri7 1.9 if($class =~ /(IPR|CDD|PFAM)/){
347 : mkubal 1.7 $domain_classes{$class} = 1;
348 : arodri7 1.9 }
349 :     elsif ($class eq "IDENTICAL")
350 :     {
351 :     $identical_flag = 1;
352 :     }
353 :     elsif ($class eq "PCH")
354 :     {
355 :     $pch_flag = 1;
356 : mkubal 1.7 }
357 : arodri7 1.10 elsif ($class eq "SIM")
358 :     {
359 :     $sims_flag = 1;
360 :     }
361 : mkubal 1.7 }
362 : arodri7 1.9
363 :     if ($identical_flag ==1)
364 :     {
365 :     get_identical_proteins($fid,\@matched_datasets);
366 :     }
367 :     if ( (defined($domain_classes{IPR})) || (defined($domain_classes{CDD})) || (defined($domain_classes{PFAM})) ) {
368 :     get_attribute_based_domain_observations($fid,\%domain_classes,\@matched_datasets);
369 :     }
370 :     if ($pch_flag == 1)
371 :     {
372 :     get_functional_coupling($fid,\@matched_datasets);
373 :     }
374 : arodri7 1.10 if ($sims_flag == 1)
375 :     {
376 :     get_sims_observations($fid,\@matched_datasets);
377 :     }
378 : arodri7 1.5
379 : mkubal 1.7 #add CELLO and SignalP later
380 : mkubal 1.1 }
381 : mkubal 1.7
382 :     foreach my $dataset (@matched_datasets) {
383 :     my $object;
384 :     if($dataset->{'type'} eq "dom"){
385 :     $object = Observation::Domain->new($dataset);
386 :     }
387 : arodri7 1.9 if($dataset->{'class'} eq "PCH"){
388 :     $object = Observation::FC->new($dataset);
389 :     }
390 :     if ($dataset->{'class'} eq "IDENTICAL"){
391 :     $object = Observation::Identical->new($dataset);
392 :     }
393 : arodri7 1.10 if ($dataset->{'class'} eq "SIM"){
394 :     $object = Observation::Sims->new($dataset);
395 :     }
396 : mkubal 1.7 push (@$objects, $object);
397 : mkubal 1.1 }
398 : mkubal 1.7
399 :     return $objects;
400 : mkubal 1.1
401 :     }
402 :    
403 :     =head1 Internal Methods
404 :    
405 :     These methods are not meant to be used outside of this package.
406 :    
407 :     B<Please do not use them outside of this package!>
408 :    
409 :     =cut
410 :    
411 :    
412 :     =head3 get_url (internal)
413 :    
414 :     get_url() return a valid URL or undef for any observation.
415 :    
416 :     URLs are constructed by looking at the Accession acc() and name()
417 :    
418 :     Info from both attributes is combined with a table of base URLs stored in this function.
419 :    
420 :     =cut
421 :    
422 :     sub get_url {
423 :    
424 :     my ($self) = @_;
425 :     my $url='';
426 :    
427 :     # a hash with a URL for each observation; identified by name()
428 :     #my $URL => { 'PFAM' => "http://www.sanger.ac.uk/cgi-bin/Pfam/getacc?" ,\
429 :     # 'IPR' => "http://www.ebi.ac.uk/interpro/DisplayIproEntry?ac=" ,\
430 :     # 'CDD' => "http://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid=",\
431 :     # 'PIR' => "http://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid=",\
432 :     # 'FIGFAM' => '',\
433 :     # 'sim'=> "http://www.theseed.org/linkin.cgi?id=",\
434 :     # 'bbh'=> "http://www.theseed.org/linkin.cgi?id="
435 :     #};
436 :    
437 :     # if (defined $URL{$self->name}) {
438 :     # $url = $URL{$self->name}.$self->acc;
439 :     # return $url;
440 :     # }
441 :     # else
442 :     return undef;
443 :     }
444 :    
445 :     =head3 get_display_method (internal)
446 :    
447 :     get_display_method() return a valid URL or undef for any observation.
448 :    
449 :     URLs are constructed by looking at the Accession acc() and name()
450 :     and Info from both attributes is combined with a table of base URLs stored in this function.
451 :    
452 :     =cut
453 :    
454 :     sub get_display_method {
455 :    
456 :     my ($self) = @_;
457 :    
458 :     # a hash with a URL for each observation; identified by name()
459 :     #my $URL => { 'sim'=> "http://www.theseed.org/featalign.cgi?id1=",\
460 :     # 'bbh'=> "http://www.theseed.org/featalign.cgi?id1="
461 :     # };
462 :    
463 :     #if (defined $URL{$self->name}) {
464 :     # $url = $URL{$self->name}.$self->feature_id."&id2=".$self->acc;
465 :     # return $url;
466 :     # }
467 :     # else
468 :     return undef;
469 :     }
470 :    
471 : mkubal 1.7
472 :     sub get_attribute_based_domain_observations{
473 :    
474 :     # we read a FIG ID and a reference to an array (of arrays of hashes, see above)
475 :     my ($fid,$domain_classes,$datasets_ref) = (@_);
476 :    
477 :     my $fig = new FIG;
478 :    
479 :     foreach my $attr_ref ($fig->get_attributes($fid)) {
480 :     my $key = @$attr_ref[1];
481 :     my @parts = split("::",$key);
482 :     my $class = $parts[0];
483 :    
484 :     if($domain_classes->{$parts[0]}){
485 :     my $val = @$attr_ref[2];
486 : mkubal 1.8 if($val =~/^(\d+\.\d+|0\.0);(\d+)-(\d+)/){
487 : mkubal 1.7 my $raw_evalue = $1;
488 : mkubal 1.8 my $from = $2;
489 :     my $to = $3;
490 : mkubal 1.7 my $evalue;
491 :     if($raw_evalue =~/(\d+)\.(\d+)/){
492 :     my $part2 = 1000 - $1;
493 :     my $part1 = $2/100;
494 :     $evalue = $part1."e-".$part2;
495 :     }
496 :     else{
497 : mkubal 1.8 $evalue = "0.0";
498 : mkubal 1.7 }
499 :    
500 :     my $dataset = {'class' => $class,
501 :     'acc' => $key,
502 :     'type' => "dom" ,
503 :     'evalue' => $evalue,
504 :     'start' => $from,
505 :     'stop' => $to
506 :     };
507 :    
508 :     push (@{$datasets_ref} ,$dataset);
509 :     }
510 :     }
511 :     }
512 :     }
513 :    
514 : mkubal 1.1 =head3 get_attribute_based_evidence (internal)
515 :    
516 :     This method retrieves evidence from the attribute server
517 :    
518 :     =cut
519 :    
520 :     sub get_attribute_based_observations{
521 :    
522 :     # we read a FIG ID and a reference to an array (of arrays of hashes, see above)
523 :     my ($fid,$datasets_ref) = (@_);
524 :    
525 :     my $_myfig = new FIG;
526 :    
527 :     foreach my $attr_ref ($_myfig->get_attributes($fid)) {
528 :    
529 :     # convert the ref into a string for easier handling
530 :     my ($string) = "@$attr_ref";
531 :    
532 :     # print "S:$string\n";
533 :     my ($key,$val) = ( $string =~ /\S+\s(\S+)\s(\S+)/);
534 :    
535 :     # THIS SHOULD BE DONE ANOTHER WAY FM->TD
536 :     # we need to do the right thing for each type, ie no evalue for CELLO and no coordinates, but a score, etc
537 :     # as fas as possible this should be configured so that the type of observation and the regexp are
538 :     # stored somewhere for easy expansion
539 :     #
540 :    
541 :     if (($key =~ /PFAM::/) || ( $key =~ /IPR::/) || ( $key =~ /CDD::/) ) {
542 :    
543 :     # some keys are composite CDD::1233244 or PFAM:PF1233
544 :    
545 :     if ( $key =~ /::/ ) {
546 :     my ($firstkey,$restkey) = ( $key =~ /([a-zA-Z0-9]+)::(.*)/);
547 :     $val=$restkey.";".$val;
548 :     $key=$firstkey;
549 :     }
550 :    
551 :     my ($acc,$raw_evalue, $from,$to) = ($val =~ /(\S+);(\S+);(\d+)-(\d+)/ );
552 :    
553 :     my $evalue= 255;
554 :     if (defined $raw_evalue) { # some of the tool do not give us an evalue
555 :    
556 :     my ($k,$expo) = ( $raw_evalue =~ /(\d+).(\d+)/);
557 :     my ($new_k, $new_exp);
558 :    
559 :     #
560 :     # THIS DOES NOT WORK PROPERLY
561 :     #
562 :     if($raw_evalue =~/(\d+).(\d+)/){
563 :    
564 :     # $new_exp = (1000+$expo);
565 :     # $new_k = $k / 100;
566 :    
567 :     }
568 :     $evalue = "0.01"#new_k."e-".$new_exp;
569 :     }
570 :    
571 :     # unroll it all into an array of hashes
572 :     # this needs to be done differently for different types of observations
573 :     my $dataset = [ { name => 'class', value => $key },
574 :     { name => 'acc' , value => $acc},
575 :     { name => 'type', value => "dom"} , # this clearly needs to be done properly FM->TD
576 :     { name => 'evalue', value => $evalue },
577 :     { name => 'start', value => $from},
578 :     { name => 'stop' , value => $to}
579 :     ];
580 :    
581 :     push (@{$datasets_ref} ,$dataset);
582 :     }
583 :     }
584 :     }
585 :    
586 : mkubal 1.3 =head3 get_sims_observations() (internal)
587 :    
588 :     This methods retrieves sims fills the internal data structures.
589 :    
590 :     =cut
591 :    
592 :     sub get_sims_observations{
593 :    
594 :     my ($fid,$datasets_ref) = (@_);
595 : mkubal 1.4 my $fig = new FIG;
596 :     my @sims= $fig->nsims($fid,100,1e-20,"fig");
597 :     my ($dataset);
598 : mkubal 1.3 foreach my $sim (@sims){
599 : mkubal 1.4 my $hit = $sim->[1];
600 :     my $evalue = $sim->[10];
601 :     my $from = $sim->[8];
602 :     my $to = $sim->[9];
603 : arodri7 1.10 $dataset = {'class' => 'SIM',
604 :     'acc' => $hit,
605 :     'type' => 'seq',
606 :     'evalue' => $evalue,
607 :     'start' => $from,
608 :     'stop' => $to
609 :     };
610 :    
611 :     push (@{$datasets_ref} ,$dataset);
612 : mkubal 1.3 }
613 :     }
614 :    
615 : arodri7 1.5 =head3 get_identical_proteins() (internal)
616 :    
617 :     This methods retrieves sims fills the internal data structures.
618 :    
619 :     =cut
620 :    
621 :     sub get_identical_proteins{
622 :    
623 :     my ($fid,$datasets_ref) = (@_);
624 :     my $fig = new FIG;
625 :     my @funcs = ();
626 :    
627 :     my @maps_to = grep { $_ ne $fid and $_ !~ /^xxx/ } map { $_->[0] } $fig->mapped_prot_ids($fid);
628 :    
629 :     foreach my $id (@maps_to) {
630 :     my ($tmp, $who);
631 : arodri7 1.6 if (($id ne $fid) && ($tmp = $fig->function_of($id))) {
632 : arodri7 1.5 if ($id =~ /^fig\|/) { $who = "FIG" }
633 :     elsif ($id =~ /^gi\|/) { $who = "NCBI" }
634 :     elsif ($id =~ /^^[NXYZA]P_/) { $who = "RefSeq" }
635 :     elsif ($id =~ /^sp\|/) { $who = "SwissProt" }
636 :     elsif ($id =~ /^uni\|/) { $who = "UniProt" }
637 :     elsif ($id =~ /^tigr\|/) { $who = "TIGR" }
638 :     elsif ($id =~ /^pir\|/) { $who = "PIR" }
639 :     elsif ($id =~ /^kegg\|/) { $who = "KEGG" }
640 :     elsif ($id =~ /^tr\|/) { $who = "TrEMBL" }
641 :     elsif ($id =~ /^eric\|/) { $who = "ASAP" }
642 :    
643 :     push(@funcs, [$id,$who,$tmp]);
644 :     }
645 :     }
646 :    
647 :     my ($dataset);
648 :     foreach my $row (@funcs){
649 :     my $id = $row->[0];
650 :     my $organism = $fig->org_of($fid);
651 :     my $who = $row->[1];
652 :     my $assignment = $row->[2];
653 : arodri7 1.9
654 :     my $dataset = {'class' => 'IDENTICAL',
655 :     'id' => $id,
656 :     'organism' => $organism,
657 :     'type' => 'seq',
658 :     'database' => $who,
659 :     'function' => $assignment
660 :     };
661 :    
662 : arodri7 1.5 push (@{$datasets_ref} ,$dataset);
663 :     }
664 :    
665 :     }
666 :    
667 : arodri7 1.6 =head3 get_functional_coupling() (internal)
668 :    
669 :     This methods retrieves the functional coupling of a protein given a peg ID
670 :    
671 :     =cut
672 :    
673 :     sub get_functional_coupling{
674 :    
675 :     my ($fid,$datasets_ref) = (@_);
676 :     my $fig = new FIG;
677 :     my @funcs = ();
678 :    
679 :     # initialize some variables
680 :     my($sc,$neigh);
681 :    
682 :     # set default parameters for coupling and evidence
683 :     my ($bound,$sim_cutoff,$coupling_cutoff) = (5000, 1.0e-10, 4);
684 :    
685 :     # get the fc data
686 :     my @fc_data = $fig->coupling_and_evidence($fid,$bound,$sim_cutoff,$coupling_cutoff,1);
687 :    
688 :     # retrieve data
689 :     my @rows = map { ($sc,$neigh) = @$_;
690 :     [$sc,$neigh,scalar $fig->function_of($neigh)]
691 :     } @fc_data;
692 :    
693 :     my ($dataset);
694 :     foreach my $row (@rows){
695 :     my $id = $row->[1];
696 :     my $score = $row->[0];
697 :     my $description = $row->[2];
698 : arodri7 1.9 my $dataset = {'class' => 'PCH',
699 :     'score' => $score,
700 :     'id' => $id,
701 :     'type' => 'fc',
702 :     'function' => $description
703 :     };
704 :    
705 : arodri7 1.6 push (@{$datasets_ref} ,$dataset);
706 :     }
707 :     }
708 : arodri7 1.5
709 : mkubal 1.1 =head3 get_sims_and_bbhs() (internal)
710 :    
711 :     This methods retrieves sims and also BBHs and fills the internal data structures.
712 :    
713 :     =cut
714 :    
715 :     # sub get_sims_and_bbhs{
716 :    
717 :     # # blast m8 output format
718 :     # # id1, id2, %ident, align len, mismatches, gaps, q.start, q.stop, s. start, s.stop, eval, bit
719 :    
720 :     # my $Sims=();
721 :     # @sims_src = $fig->sims($fid,80,500,"fig",0);
722 :     # print "found $#sims_src SIMs\n";
723 :     # foreach $sims (@sims_src) {
724 :     # my ($sims_string) = "@$sims";
725 :     # # print "$sims_string\n";
726 :     # my ($rfid,$start,$stop,$eval) = ( $sims_string =~ /\S+\s+(\S+)\s+\S+\s\S+\s+(\S+)\s+(\S+)\s+
727 :     # \S+\s+\S+\s+\S+\s+\S+\s+(\S+)+.*/);
728 :     # # print "ID: $rfid, E:$eval, Start:$start stop:$stop\n";
729 :     # $Sims{$rfid}{'eval'}=$eval;
730 :     # $Sims{$rfid}{'start'}=$start;
731 :     # $Sims{$rfid}{'stop'}=$stop;
732 :     # print "$rfid $Sims{$rfid}{'eval'}\n";
733 :     # }
734 :    
735 :     # # BBHs
736 :     # my $BBHs=();
737 :    
738 :     # @bbhs_src = $fig->bbhs($fid,1.0e-10);
739 :     # print "found $#bbhs_src BBHs\n";
740 :     # foreach $bbh (@bbhs_src) {
741 :     # #print "@$bbh\n";
742 :     # my ($bbh_string) = "@$bbh";
743 :     # my ($rfid,$eval,$score) = ( $bbh_string =~ /(\S+)\s(\S+)\s(\S+)/);
744 :     # #print "ID: $rfid, E:$eval, S:$score\n";
745 :     # $BBHs{$rfid}{'eval'}=$eval;
746 :     # $BBHs{$rfid}{'score'}=$score;
747 :     # #print "$rfid $BBHs{$rfid}{'eval'}\n";
748 :     # }
749 :    
750 :     # }
751 :    
752 :    
753 :    
754 :     =head3 new (internal)
755 :    
756 :     Instantiate a new object.
757 :    
758 :     =cut
759 :    
760 :     sub new {
761 : mkubal 1.7 my ($class,$dataset) = @_;
762 :    
763 : mkubal 1.1
764 : mkubal 1.7 #$self = { acc => '',
765 :     # description => '',
766 :     # class => '',
767 :     # type => '',
768 :     # start => '',
769 :     # stop => '',
770 :     # evalue => '',
771 :     # score => '',
772 :     # display_method => '',
773 :     # feature_id => '',
774 :     # rank => '',
775 :     # supports_annotation => '',
776 :     # id => '',
777 :     # organism => '',
778 :     # who => ''
779 :     # };
780 : mkubal 1.1
781 : mkubal 1.7 my $self = { class => $dataset->{'class'},
782 :     type => $dataset->{'type'}
783 : arodri7 1.10 };
784 : mkubal 1.7
785 :     bless($self,$class);
786 : mkubal 1.1
787 :     return $self;
788 :     }
789 :    
790 :     =head3 feature_id (internal)
791 :    
792 :    
793 :     =cut
794 :    
795 :     sub feature_id {
796 :     my ($self) = @_;
797 :    
798 :     return $self->{feature_id};
799 :     }
800 : arodri7 1.5
801 :     =head3 id (internal)
802 :    
803 :     Returns the ID of the identical sequence
804 :    
805 :     =cut
806 :    
807 :     sub id {
808 :     my ($self) = @_;
809 :    
810 :     return $self->{id};
811 :     }
812 :    
813 :     =head3 organism (internal)
814 :    
815 :     Returns the organism of the identical sequence
816 :    
817 :     =cut
818 :    
819 :     sub organism {
820 :     my ($self) = @_;
821 :    
822 :     return $self->{organism};
823 :     }
824 :    
825 : arodri7 1.9 =head3 function (internal)
826 :    
827 :     Returns the function of the identical sequence
828 :    
829 :     =cut
830 :    
831 :     sub function {
832 :     my ($self) = @_;
833 :    
834 :     return $self->{function};
835 :     }
836 :    
837 : arodri7 1.5 =head3 database (internal)
838 :    
839 :     Returns the database of the identical sequence
840 :    
841 :     =cut
842 :    
843 :     sub database {
844 :     my ($self) = @_;
845 :    
846 :     return $self->{database};
847 :     }
848 :    
849 : arodri7 1.6
850 : arodri7 1.9 ############################################################
851 :     ############################################################
852 :     package Observation::Identical;
853 :    
854 :     use base qw(Observation);
855 :    
856 :     sub new {
857 :    
858 :     my ($class,$dataset) = @_;
859 :     my $self = $class->SUPER::new($dataset);
860 :     $self->{id} = $dataset->{'id'};
861 :     $self->{organism} = $dataset->{'organism'};
862 :     $self->{function} = $dataset->{'function'};
863 :     $self->{database} = $dataset->{'database'};
864 :    
865 :     bless($self,$class);
866 :     return $self;
867 :     }
868 :    
869 :     =head3 display()
870 : arodri7 1.6
871 :     If available use the function specified here to display the "raw" observation.
872 :     This code will display a table for the identical protein
873 :    
874 :    
875 : arodri7 1.9 B<Please note> that URL linked to in display_method() is an external component and needs to added to the code for every class of evi
876 :     dence.
877 : arodri7 1.6
878 :     =cut
879 :    
880 : arodri7 1.9 sub display{
881 :     my ($self, $cgi, $dataset) = @_;
882 : arodri7 1.6
883 :     my $all_domains = [];
884 :     my $count_identical = 0;
885 : arodri7 1.9 my $content;
886 :     foreach my $thing (@$dataset) {
887 : arodri7 1.6 next if ($thing->class ne "IDENTICAL");
888 : arodri7 1.9 my $single_domain = [];
889 :     push(@$single_domain,$thing->database);
890 :     my $id = $thing->id;
891 :     $count_identical++;
892 :     push(@$single_domain,&HTML::set_prot_links($cgi,$id));
893 :     push(@$single_domain,$thing->organism);
894 :     #push(@$single_domain,$thing->type);
895 :     push(@$single_domain,$thing->function);
896 :     push(@$all_domains,$single_domain);
897 : arodri7 1.6 }
898 :    
899 :     if ($count_identical >0){
900 : arodri7 1.9 $content = $all_domains;
901 : arodri7 1.6 }
902 :     else{
903 : arodri7 1.9 $content = "<p>This PEG does not have any essentially identical proteins</p>";
904 : arodri7 1.6 }
905 :     return ($content);
906 :     }
907 : mkubal 1.7
908 : arodri7 1.9 1;
909 :    
910 :    
911 :     #########################################
912 :     #########################################
913 :     package Observation::FC;
914 :     1;
915 :    
916 :     use base qw(Observation);
917 :    
918 :     sub new {
919 :    
920 :     my ($class,$dataset) = @_;
921 :     my $self = $class->SUPER::new($dataset);
922 :     $self->{score} = $dataset->{'score'};
923 :     $self->{id} = $dataset->{'id'};
924 :     $self->{function} = $dataset->{'function'};
925 :    
926 :     bless($self,$class);
927 :     return $self;
928 :     }
929 :    
930 :     =head3 display()
931 :    
932 :     If available use the function specified here to display the "raw" observation.
933 :     This code will display a table for the identical protein
934 :    
935 :    
936 :     B<Please note> that URL linked to in display_method() is an external component and needs to added to the code for every class of evi
937 :     dence.
938 :    
939 :     =cut
940 :    
941 :     sub display {
942 :     my ($self,$cgi,$dataset, $fid) = @_;
943 :    
944 :     my $functional_data = [];
945 :     my $count = 0;
946 :     my $content;
947 :    
948 :     foreach my $thing (@$dataset) {
949 :     my $single_domain = [];
950 :     next if ($thing->class ne "PCH");
951 :     $count++;
952 :    
953 :     # construct the score link
954 :     my $score = $thing->score;
955 :     my $toid = $thing->id;
956 :     my $link = $cgi->url(-relative => 1) . "?user=master&request=show_coupling_evidence&prot=$fid&to=$toid&SPROUT=";
957 :     my $sc_link = "<a href=$link>$score</a>";
958 :    
959 :     push(@$single_domain,$sc_link);
960 :     push(@$single_domain,$thing->id);
961 :     push(@$single_domain,$thing->function);
962 :     push(@$functional_data,$single_domain);
963 :     }
964 :    
965 :     if ($count >0){
966 :     $content = $functional_data;
967 :     }
968 :     else
969 :     {
970 :     $content = "<p>This PEG does not have any functional coupling</p>";
971 :     }
972 :     return ($content);
973 :     }
974 :    
975 :    
976 :     #########################################
977 :     #########################################
978 : mkubal 1.7 package Observation::Domain;
979 :    
980 :     use base qw(Observation);
981 :    
982 :     sub new {
983 :    
984 :     my ($class,$dataset) = @_;
985 :     my $self = $class->SUPER::new($dataset);
986 :     $self->{evalue} = $dataset->{'evalue'};
987 :     $self->{acc} = $dataset->{'acc'};
988 :     $self->{start} = $dataset->{'start'};
989 :     $self->{stop} = $dataset->{'stop'};
990 :    
991 :     bless($self,$class);
992 :     return $self;
993 :     }
994 :    
995 :     sub display {
996 :     my ($thing,$gd) = @_;
997 :     my $lines = [];
998 :     my $line_config = { 'title' => $thing->acc,
999 :     'short_title' => $thing->type,
1000 :     'basepair_offset' => '1' };
1001 :     my $color = "4";
1002 :    
1003 :     my $line_data = [];
1004 :     my $links_list = [];
1005 :     my $descriptions = [];
1006 :    
1007 :     my $description_function;
1008 :     $description_function = {"title" => $thing->class,
1009 :     "value" => $thing->acc};
1010 :    
1011 :     push(@$descriptions,$description_function);
1012 :    
1013 :     my $score;
1014 :     $score = {"title" => "score",
1015 :     "value" => $thing->evalue};
1016 :     push(@$descriptions,$score);
1017 :    
1018 :     my $link_id;
1019 :     if ($thing->acc =~/CDD::(\d+)/){
1020 :     $link_id = $1;
1021 :     }
1022 :    
1023 :     my $link;
1024 :     $link = {"link_title" => $thing->acc,
1025 :     "link" => "http://0-www.ncbi.nlm.nih.gov.library.vu.edu.au:80/Structure/cdd/cddsrv.cgi?uid=$link_id"};
1026 :     push(@$links_list,$link);
1027 :    
1028 :     my $element_hash = {
1029 :     "title" => $thing->type,
1030 :     "start" => $thing->start,
1031 :     "end" => $thing->stop,
1032 :     "color"=> $color,
1033 :     "zlayer" => '2',
1034 :     "links_list" => $links_list,
1035 :     "description" => $descriptions};
1036 :    
1037 :     push(@$line_data,$element_hash);
1038 :     $gd->add_line($line_data, $line_config);
1039 :    
1040 :     return $gd;
1041 :    
1042 :     }
1043 :    
1044 : arodri7 1.10 #########################################
1045 :     #########################################
1046 :     package Observation::Sims;
1047 :    
1048 :     use base qw(Observation);
1049 :    
1050 :     sub new {
1051 :    
1052 :     my ($class,$dataset) = @_;
1053 :     my $self = $class->SUPER::new($dataset);
1054 :     $self->{acc} = $dataset->{'acc'};
1055 :     $self->{evalue} = $dataset->{'evalue'};
1056 :     $self->{start} = $dataset->{'start'};
1057 :     $self->{stop} = $dataset->{'stop'};
1058 :    
1059 :     bless($self,$class);
1060 :     return $self;
1061 :     }
1062 :    
1063 :     =head3 display()
1064 :    
1065 :     If available use the function specified here to display the "raw" observation.
1066 :     This code will display a table for the similarities protein
1067 :    
1068 :     B<Please note> that URL linked to in display_method() is an external component and needs to added to the code for every class of evidence.
1069 :    
1070 :     =cut
1071 :    
1072 :     sub display {
1073 :     my ($self,$cgi,$dataset) = @_;
1074 :    
1075 :     my $data = [];
1076 :     my $count = 0;
1077 :     my $content;
1078 :    
1079 :     foreach my $thing (@$dataset) {
1080 :     my $single_domain = [];
1081 :     next if ($thing->class ne "SIM");
1082 :     $count++;
1083 :    
1084 :     push(@$single_domain,&HTML::set_prot_links($cgi,$thing->acc));
1085 :     push(@$single_domain,$thing->start);
1086 :     push(@$single_domain,$thing->stop);
1087 :     push(@$single_domain,$thing->evalue);
1088 :     push(@$data,$single_domain);
1089 :     }
1090 :    
1091 :     if ($count >0){
1092 :     $content = $data;
1093 :     }
1094 :     else
1095 :     {
1096 :     $content = "<p>This PEG does not have any similarities</p>";
1097 :     }
1098 :     return ($content);
1099 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3