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

Diff of /FigKernelPackages/RAST_submission.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.6, Wed Oct 21 21:45:03 2009 UTC revision 1.7, Thu Oct 22 21:15:13 2009 UTC
# Line 9  Line 9 
9  use FIG;  use FIG;
10  use FIG_Config;  use FIG_Config;
11  use gjoseqlib;  use gjoseqlib;
12    use XML::LibXML;
13    
14  use LWP::UserAgent;  use LWP::UserAgent;
15  use Bio::DB::RefSeq;  use Bio::DB::RefSeq;
# Line 112  Line 113 
113    
114          close(F);          close(F);
115    
116            if ($ent->{taxonomy_id})
117            {
118                #
119                # Pull the taxonomy database entry from NCBI.
120                #
121    
122                my $tdata = $self->get_taxonomy_data($ent->{taxonomy_id});
123                if ($tdata)
124                {
125                    $ent->{domain} = $tdata->{domain};
126                    $ent->{taxonomy} = $tdata->{taxonomy};
127                    $ent->{genetic_code} = $tdata->{genetic_code};
128                }
129            }
130    
131          push(@ret, $ent);          push(@ret, $ent);
132      }      }
133    
134    
135      return \@ret;      return \@ret;
136  }  }
137    
138    sub get_taxonomy_data
139    {
140        my($self, $tax_id) = @_;
141    
142        my $res = $self->ua->get("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=taxonomy&id=$tax_id&report=sgml&mode=text");
143        if ($res->is_success)
144        {
145            my $ent = {};
146            my $doc = XML::LibXML->new->parse_string($res->content);
147    
148            my $lin = $doc->findvalue('//Taxon/Lineage');
149            $lin =~ s/^cellular organisms;\s+//;
150            my $domain = $lin;
151            $domain =~ s/;.*$//;
152            my $code = $doc->findvalue('//Taxon/GeneticCode/GCId');
153    
154            $ent->{domain} = $domain;
155            $ent->{taxonomy} = $lin;
156            $ent->{genetic_code} = $code;
157            return $ent;
158        }
159        return undef;
160    }
161    
162  sub determine_project_of_contig  sub determine_project_of_contig
163  {  {
164      my($self, $contig_id) = @_;      my($self, $contig_id) = @_;
# Line 296  Line 337 
337      }      }
338  }  }
339    
340    =head3 submit_RAST_job
341    
342    Handle the actual job submission.
343    
344    Use JobUpload.pm to create a clean input file (fixing line endings,
345    etc) and to pull stats for the job.
346    
347    Use Job48::create_new_job to then create the job from the
348    data we brought in.
349    
350    =cut
351    
352  sub submit_RAST_job  sub submit_RAST_job
353  {  {
354      my($self, $params) = @_;      my($self, $params) = @_;
355    
356      my $res=  { val => [ "params were", $params, $self->user_obj->firstname, $self->user_obj->lastname] } ;      my $filetype = lc($params->{-filetype});
357      print STDERR Dumper($res);      my $tax_id = $params->{-taxonomyID};
358        my $domain = lc($params->{-domain});
359        my $organism = $params->{-organismName};
360        my $file = $params->{-file};
361        my $keep = $params->{-keepGeneCalls};
362        my $genetic_code = $params->{-geneticCode};
363        my $gene_caller = lc($params->{-geneCaller});
364    
365        my $work_dir = "$FIG_Config::temp/rast_submit_tmp.$$";
366        &FIG::verify_dir($work_dir);
367    
368        my $upload_job = new JobUpload($work_dir);
369        my $errs = [];
370    
371        my $fh;
372        if (!open($fh, "<", \$file))
373        {
374            my $er = $!;
375            my $len = length($file);
376            system("rm", "-r", $work_dir);
377            return { status => 'error', error_msg => "error creating filehandle from file data of length $len: $er" };
378        }
379    
380        if (!$upload_job->create_from_filehandle($fh, "rast_submission_file", $errs))
381        {
382            system("rm", "-r", $work_dir);
383            return { status => 'error', error_msg => join("\n", @$errs) };
384        }
385    
386        my $meta_obj = $upload_job->meta();
387    
388        #
389        # Pull the metadata into a hash, where it's easier to use
390        # and so that we can just return it to our caller if everything
391        # is good to go.
392        #
393    
394        my %meta = map { $_ => $meta_obj->get_metadata($_) } $meta_obj->get_metadata_keys();
395    
396        my $res = { upload_metadata => \%meta };
397    
398        #
399        # We have parsed the file. Let's do some error checking.
400        #
401    
402        if ($meta{upload_type} ne $filetype)
403        {
404            $res->{status} = 'error';
405            $res->{error_msg} = "Parsed filetype $meta{upload_type} not the expected $filetype";
406            system("rm", "-r", $work_dir);
407            return $res;
408        }
409    
410        #
411        # Do an NCBI lookup to pull the taxonomy string for the given tax id (if provided)
412        #
413    
414        my $taxonomy;
415        if ($tax_id)
416        {
417            my $tdata = $self->get_taxonomy_data($tax_id);
418            if ($tdata)
419            {
420                $domain = $tdata->{domain} unless defined($domain);
421                $genetic_code = $tdata->{genetic_code} unless defined($genetic_code);
422                $taxonomy = $tdata->{taxonomy};
423            }
424        }
425        else
426        {
427            $tax_id = '666666';
428            $taxonomy = $domain;
429        }
430    
431        #
432        # That's all for now; we might add  more later.
433        # Use Job48 to create the job. We create another slightly
434        # different parameter hash for this.
435        #
436    
437        #
438        # Find the file we're using.
439        #
440        my($clean_file, $clean_fh);
441        if ($meta{upload_type} eq 'genbank')
442        {
443            $clean_file = $meta{clean_genbank};
444        }
445        elsif ($meta{upload_type} eq 'fasta')
446        {
447            $clean_file = $meta{clean_fasta};
448        }
449        $clean_fh = new FileHandle($clean_file, "<");
450    
451        my $j48_data = {
452            genome       => $organism,
453            project      => $self->user_obj->login."_".$tax_id,
454            user         => $self->user_obj->login,
455            taxonomy     => $taxonomy ."; $organism",
456            taxonomy_id  => $tax_id,
457            genetic_code => $genetic_code,
458            sequence_file => $clean_fh,
459            meta => {
460                source_file    => $clean_file,
461                'genome.genetic_code' => $genetic_code,
462                'genome.sequencing_method' => 'unknown',
463                'genome.coverage' => 'unknown',
464                'genome.contigs' => 'unknown',
465                'genome.average_read_length' => 'unknown',
466                'genome.gc_content' => $meta{stats_contigs}->{gc},
467                'genome.bp_count' => $meta{stats_contigs}->{chars},
468                'genome.contig_count' => $meta{stats_contigs}->{seqs},
469                'genome.ambig_count' => 0,
470                'import.candidate' => 0,
471                'keep_genecalls' => $keep ? 1 : 0,
472                'use_glimmer' => $gene_caller eq 'glimmer3' ? 1 : 0,
473                'correction.automatic' => 1,
474                'correction.frameshifts' => 0,
475                'correction.backfill_gaps' => 1,
476                'env.debug' => 0,
477                'env.verbose' => 0,
478                upload_metadata => \%meta,
479            },
480        };
481    
482        my($job_id, $job_msg) = Job48->create_new_job($j48_data);
483        if ($job_id)
484        {
485            $res->{status} = 'ok';
486            $res->{job_id} = $job_id;
487    
488    
489            # sync job so it'll appear in the job listings on the website
490            my $sync;
491            eval { $sync = $self->rast_dbmaster->Job->init({ id => $job_id }); };
492        }
493        else
494        {
495            $res->{status} = 'error';
496            $res->{error_msg} = $job_msg;
497        }
498        close($clean_fh);
499        system("rm", "-r", $work_dir);
500      return $res;      return $res;
501  }  }
502    
# Line 373  Line 567 
567              }              }
568          }          }
569    
570          $res->{$job_num} = { status => $status{'status.export'}, verbose_status => $status_list };          #
571            # If any stage is not in not_started, then the job is running.
572            #
573            my $exp_status = $status{'status.export'};
574            if ($exp_status ne 'complete')
575            {
576                if (grep { $status{$_} ne 'not_started' } keys %status)
577                {
578                    $exp_status = 'running';
579                }
580            }
581    
582            $res->{$job_num} = { status => $exp_status, verbose_status => $status_list };
583        }
584        return $res;
585    }
586    
587    =head3 kill_RAST_job
588    
589    Mark the job as inactive, and qdel any stages that might be running.
590    
591    =cut
592    sub kill_RAST_job
593    {
594        my($self, $params) = @_;
595    
596        my @job_nums;
597        my $job_num_param = $params->{-job};
598        if (ref($job_num_param) eq 'ARRAY')
599        {
600            @job_nums = @$job_num_param;
601        }
602        else
603        {
604            @job_nums = ($job_num_param);
605        }
606    
607        my $res = {};
608        for my $job_num (@job_nums)
609        {
610            my $job = $self->rast_dbmaster->Job->init({ id => $job_num });
611            if (!ref($job))
612            {
613                $res->{$job_num} = { status => 'error', error_msg => 'Job not found'};
614                next;
615            }
616    
617            if (!$self->user_may_access_job($job))
618            {
619                $res->{$job_num} = { status => 'error', error_msg => 'Access denied' };
620                next;
621            }
622    
623            my $messages = [];
624            my @ids;
625            for my $k ($job->metaxml->get_metadata_keys())
626            {
627                if ($k =~ /sge[^.]*id/)
628                {
629                    my $id = $job->metaxml->get_metadata($k);
630                    if (ref($id))
631                    {
632                        push(@ids, @$id);
633                    }
634                    else
635                    {
636                        push(@ids, $id);
637                    }
638                }
639            }
640    
641            #
642            # sanity check.
643            #
644            @ids = grep { /^\d+$/ } @ids;
645    
646            if (@ids)
647            {
648                my $cmd = ". /vol/sge/default/common/settings.sh; qdel @ids";
649                if (open(my $p, "$cmd 2>&1 |"))
650                {
651                    while (<$p>)
652                    {
653                        chomp;
654                        push(@$messages, $_);
655                    }
656    
657                    my $rc = close($p);
658                    if (!$rc)
659                    {
660                        push(@$messages, "'$cmd' returns status=$! $?");
661                    }
662                    else
663                    {
664                        push(@$messages, "'$cmd' returns status=0");
665                    }
666                }
667                else
668                {
669                    push(@$messages, "Cannot open pipe to $cmd: $!");
670                }
671            }
672            else
673            {
674                push(@$messages, "No sge tasks to kill");
675            }
676    
677            my $active = $job->dir . "/ACTIVE";
678            if (-f $active)
679            {
680                if (unlink($active))
681                {
682                    push(@$messages, "unlinked $active");
683                }
684                else
685                {
686                    push(@$messages, "error unlinking $active: $!");
687                }
688            }
689            else
690            {
691                push(@$messages, "no active file $active");
692            }
693            $res->{$job_num} = { status => 'ok', messages => $messages };
694        }
695        return $res;
696    }
697    
698    =head3 delete_RAST_job
699    
700    Delete the given RAST jobs.  This is a real delete, not a mark-the-flag delete.
701    
702    =cut
703    sub delete_RAST_job
704    {
705        my($self, $params) = @_;
706    
707        my @job_nums;
708        my $job_num_param = $params->{-job};
709        if (ref($job_num_param) eq 'ARRAY')
710        {
711            @job_nums = @$job_num_param;
712        }
713        else
714        {
715            @job_nums = ($job_num_param);
716        }
717    
718        my $res = {};
719        for my $job_num (@job_nums)
720        {
721            my $job = $self->rast_dbmaster->Job->init({ id => $job_num });
722            if (!ref($job))
723            {
724                $res->{$job_num} = { status => 'error', error_msg => 'Job not found'};
725                next;
726            }
727    
728            if (!$self->user_may_access_job($job))
729            {
730                $res->{$job_num} = { status => 'error', error_msg => 'Access denied' };
731                next;
732            }
733    
734            my $dir = $job->dir;
735    
736            #
737            # Just make sure the dir ends in the job number, so an error
738            # doesn't wreak TOO much havoc.
739            #
740            if ($dir =~ /$job_num$/)
741            {
742                my $rc = system("rm", "-r", $dir);
743                if ($rc == 0)
744                {
745                    $res->{$job_num} = { status => 'ok' }
746      }      }
747                else
748                {
749                    $res->{$job_num} = { status => 'error', error_msg => "Remove of $dir died with status $rc" }
750                }
751            }
752            #
753            # Delete from the database too.
754            #
755            $job->delete();
756        }
757    
758      return $res;      return $res;
759  }  }
760    

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3