Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/Funcgen/Parsers/BaseExternalParser.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/EnsEMBL/Funcgen/Parsers/BaseExternalParser.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,269 @@ +=head1 LICENSE + + Copyright (c) 1999-2011 The European Bioinformatics Institute and + Genome Research Limited. All rights reserved. + + This software is distributed under a modified Apache license. + For license details, please see + + http://www.ensembl.org/info/about/code_licence.html + +=head1 CONTACT + + Please email comments or questions to the public Ensembl + developers list at <ensembl-dev@ebi.ac.uk>. + + Questions may also be sent to the Ensembl help desk at + <helpdesk@ensembl.org>. + +=cut + +package Bio::EnsEMBL::Funcgen::Parsers::BaseExternalParser; + +use strict; + +use Bio::EnsEMBL::DBSQL::DBAdaptor; +use Bio::EnsEMBL::Utils::Argument qw( rearrange ); +use Bio::EnsEMBL::Utils::Exception qw( throw ); +use Bio::EnsEMBL::Funcgen::FeatureSet; +use Bio::EnsEMBL::Funcgen::FeatureType; +use Bio::EnsEMBL::Analysis; +#use Bio::EnsEMBL::Funcgen::Parsers::BaseImporter; +#use vars qw(@ISA) +#@ISA = ('Bio::EnsEMBL::Funcgen::Utils::Helper'); + +use base qw(Bio::EnsEMBL::Funcgen::Parsers::BaseImporter); #@ISA change to parent with perl 5.10 + + + +# Base functionality for external_feature parsers + +#Make this inherit from Helper? +#Then change all the prints to logs + +sub new { + my $caller = shift; + my $class = ref($caller) || $caller; + my $self = $class->SUPER::new(@_); + + #validate and set type, analysis and feature_set here + my ($type, $db, $archive, $import_fsets) = rearrange(['TYPE', 'DB', 'ARCHIVE', 'IMPORT_SETS'], @_); + + #What is ExternalParser specific here? + #archive? + #type? is this even used? + + + #throw('You must define a type of external_feature to import') if(! defined $type); + + if (! ($db && ref($db) && + $db->isa('Bio::EnsEMBL::Funcgen::DBSQL::DBAdaptor'))){ + throw('You must provide a valid Bio::EnsEMBL::Funcgen::DBSQL::DBAdaptor'); + } + + throw('You can only specify either -clobber|rollback or -archive, but not both') if($self->rollback && $archive); + + $self->{display_name_cache} = {}; + $self->{'db'} = $db; + #$self->{type} = $type; + $self->{archive} = $archive if defined $archive; + + + #This is not fully implemented yet and need to be validated against the config feature_set + #pass something like set1,set2 and split and validate each. + #Or do this in the calling script? + + throw('-import_sets not fully implemented yet') if defined $import_fsets; + $self->{'import_sets'} = (defined $import_fsets) ? @{$import_fsets} : undef; + + $self->log("Parsing and loading $type ExternalFeatures"); + + return $self; + +} + + +=head2 import_sets + + Args : None + Example : foreach my $import_set_name(@{$self->import_sets}){ ... do the import ... } + Description: Getter for the list of import feature set names, defaults to all in parser config. + Returntype : Arrayref of import feature_set names + Exceptions : None + Caller : General + Status : Medium Risk + +=cut + +sub import_sets{ + my $self = shift; + + return $self->{'import_sets'} || [keys %{$self->{static_config}{feature_sets}}]; +} + + +=head2 set_feature_sets + + Args : None + Example : $self->set_feature_sets; + Description: Imports feature sets defined by import_sets. + Returntype : None + Exceptions : Throws if feature set already present and rollback or archive not set + Caller : General + Status : Medium Risk + +=cut + +#This is done after validate and store feature_types +#Updating this will require making all external parsers use 'static_config' + +sub set_feature_sets{ + my $self = shift; + + throw('Must provide a set feature_set config hash') if ! defined $self->{static_config}{feature_sets}; + + + my $fset_adaptor = $self->db->get_FeatureSetAdaptor; + my $analysis_adaptor = $self->db->get_AnalysisAdaptor; + + foreach my $fset_name(@{$self->import_sets}){ + + $self->log("Defining FeatureSet:\t$fset_name"); + my $fset = $fset_adaptor->fetch_by_name($fset_name); + + #we don't need data sets for external_feature sets! + #Compare against config after we have merged with defined_anld_validate etc + + if(defined $fset){ + $self->log("Found previous FeatureSet $fset_name"); + + if($self->rollback){ + + $self->rollback_FeatureSet($fset);#Need to pass \@slices here? + } + elsif($self->{'archive'}){ + my $archive_fset = $fset_adaptor->fetch_by_name($fset_name."_v".$self->{'archive'}); + + if(defined $archive_fset){ + throw("You are trying to create an archive external feature_set which already exists:\t${fset_name}_v".$self->{archive}); + } + + my $sql = "UPDATE feature_set set name='$fset_name}_v".$self->{archive}."' where name='$fset_name'"; + $self->db->dbc->do($sql); + undef $fset; + }else{ + throw("You are trying to create an external feature_set which already exists:\t$fset_name\nMaybe to want to rollback or archive?"); + } + } + + #Assume using static config for now + #Will need to resolve this when it become generic + #Maybe we set outside of config! + #simply as analyses, feature_sets and feature_types? + my $fset_config = $self->{static_config}{feature_sets}{$fset_name}{feature_set}; + + + if(! defined $fset){ + my ($name, $analysis, $ftype, $display_label, $desc); + my $fset_analysis_key = (exists ${$fset_config}{-analysis}) ? '-analysis' : '-ANALYSIS'; + my $fset_name_key = (exists ${$fset_config}{-name}) ? '-name' : '-NAME'; + my $fset_ftype_key = (exists ${$fset_config}{-feature_type}) ? '-feature_type' : '-FEATURE_TYPE'; + my $fset_dlabel_key = (exists ${$fset_config}{-display_label}) ? '-display_label' : '-DISPLAY_LABEL'; + my $fset_desc_key = (exists ${$fset_config}{-description}) ? '-description' : '-DESCRIPTION'; + my $display_name = (exists ${$fset_config}{$fset_dlabel_key}) ? $fset_config->{$fset_dlabel_key} : $fset_name; + #fset config name be different from key name + my $fs_name = (exists ${$fset_config}{$fset_name_key}) ? $fset_config->{$fset_name_key} : $fset_name; + #warn if they are different? + + + #Can't just deref config hash here as we need to deref the nested feature_type and analysis attrs + + $fset = Bio::EnsEMBL::Funcgen::FeatureSet->new( + -name => $fs_name, + -feature_class=> 'external', + -analysis => ${$fset_config->{$fset_analysis_key}}, + -feature_type => ${$fset_config->{$fset_ftype_key}}, + -display_label => $display_name, + -description => $fset_config->{$fset_desc_key} + ); + + ($fset) = @{$self->db->get_FeatureSetAdaptor->store($fset)}; + } + + #Now replace config hash with object + #Will this reset in hash or just locally? + #$fset_config = $fset; + $self->{static_config}{feature_sets}{$fset_name}{feature_set} = $fset; + } + + return; +} + +#Can't use this anymore as we have to use static_config for all parsers which use set_feature_sets + +# +#=head2 validate_and_store_feature_types +# +# Args : None +# Example : $self->validate_and_store_feature_types; +# Description: Imports feature types defined by import_sets. +# Returntype : None +# Exceptions : None +# Caller : General +# Status : High Risk - Now using BaseImporter::validate_and_store_config for vista +# +#=cut +# +##Change all external parsers to use BaseImporter::validate_and_store_config +# +#sub validate_and_store_feature_types{ +# my $self = shift; +# +# #This currently only stores ftype associated with the feature_sets +# #Havent't we done this already in the InputSet parser +# #Need to write BaseImporter and inherit from there. +# +# #InputSet does all loading, but depends on 'user_config' +# #Where as we are using hardcoded config here +# #Which are import_sets currently defaults to feature_sets keys +# +# #we could simply call this static_config and let user_config over-write static config with warnings? +# #on an key by key basis? (top level only?) +# +# +# my $ftype_adaptor = $self->db->get_FeatureTypeAdaptor; +# +# foreach my $import_set(@{$self->import_sets}){ +# +# my $ftype_config = ${$self->{static_config}{feature_sets}{$import_set}{feature_type}}; +# my $ftype = $ftype_adaptor->fetch_by_name($ftype_config->{'name'}); +# +# $self->log("Validating $import_set FeatureType:\t".$ftype_config->{'name'}); +# +# if(! defined $ftype){ +# $self->log("FeatureType '".$ftype_config->{'name'}."' for external feature_set ".$self->{'type'}." not present"); +# $self->log("Storing using type hash definitions"); +# +# $ftype = Bio::EnsEMBL::Funcgen::FeatureType->new( +# -name => $ftype_config->{'name'}, +# -class => $ftype_config->{'class'}, +# -description => $ftype_config->{'description'}, +# ); +# ($ftype) = @{$ftype_adaptor->store($ftype)}; +# } +# +# #Replace hash config with object +# $self->{static_config}{feature_types}{$ftype_config->{'name'}} = $ftype; +# } +# +# return; +#} +# + + + + + + + +1;