Mercurial > repos > mahtabm > ensembl
comparison 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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:1f6dce3d34e0 |
|---|---|
| 1 =head1 LICENSE | |
| 2 | |
| 3 Copyright (c) 1999-2011 The European Bioinformatics Institute and | |
| 4 Genome Research Limited. All rights reserved. | |
| 5 | |
| 6 This software is distributed under a modified Apache license. | |
| 7 For license details, please see | |
| 8 | |
| 9 http://www.ensembl.org/info/about/code_licence.html | |
| 10 | |
| 11 =head1 CONTACT | |
| 12 | |
| 13 Please email comments or questions to the public Ensembl | |
| 14 developers list at <ensembl-dev@ebi.ac.uk>. | |
| 15 | |
| 16 Questions may also be sent to the Ensembl help desk at | |
| 17 <helpdesk@ensembl.org>. | |
| 18 | |
| 19 =cut | |
| 20 | |
| 21 package Bio::EnsEMBL::Funcgen::Parsers::BaseExternalParser; | |
| 22 | |
| 23 use strict; | |
| 24 | |
| 25 use Bio::EnsEMBL::DBSQL::DBAdaptor; | |
| 26 use Bio::EnsEMBL::Utils::Argument qw( rearrange ); | |
| 27 use Bio::EnsEMBL::Utils::Exception qw( throw ); | |
| 28 use Bio::EnsEMBL::Funcgen::FeatureSet; | |
| 29 use Bio::EnsEMBL::Funcgen::FeatureType; | |
| 30 use Bio::EnsEMBL::Analysis; | |
| 31 #use Bio::EnsEMBL::Funcgen::Parsers::BaseImporter; | |
| 32 #use vars qw(@ISA) | |
| 33 #@ISA = ('Bio::EnsEMBL::Funcgen::Utils::Helper'); | |
| 34 | |
| 35 use base qw(Bio::EnsEMBL::Funcgen::Parsers::BaseImporter); #@ISA change to parent with perl 5.10 | |
| 36 | |
| 37 | |
| 38 | |
| 39 # Base functionality for external_feature parsers | |
| 40 | |
| 41 #Make this inherit from Helper? | |
| 42 #Then change all the prints to logs | |
| 43 | |
| 44 sub new { | |
| 45 my $caller = shift; | |
| 46 my $class = ref($caller) || $caller; | |
| 47 my $self = $class->SUPER::new(@_); | |
| 48 | |
| 49 #validate and set type, analysis and feature_set here | |
| 50 my ($type, $db, $archive, $import_fsets) = rearrange(['TYPE', 'DB', 'ARCHIVE', 'IMPORT_SETS'], @_); | |
| 51 | |
| 52 #What is ExternalParser specific here? | |
| 53 #archive? | |
| 54 #type? is this even used? | |
| 55 | |
| 56 | |
| 57 #throw('You must define a type of external_feature to import') if(! defined $type); | |
| 58 | |
| 59 if (! ($db && ref($db) && | |
| 60 $db->isa('Bio::EnsEMBL::Funcgen::DBSQL::DBAdaptor'))){ | |
| 61 throw('You must provide a valid Bio::EnsEMBL::Funcgen::DBSQL::DBAdaptor'); | |
| 62 } | |
| 63 | |
| 64 throw('You can only specify either -clobber|rollback or -archive, but not both') if($self->rollback && $archive); | |
| 65 | |
| 66 $self->{display_name_cache} = {}; | |
| 67 $self->{'db'} = $db; | |
| 68 #$self->{type} = $type; | |
| 69 $self->{archive} = $archive if defined $archive; | |
| 70 | |
| 71 | |
| 72 #This is not fully implemented yet and need to be validated against the config feature_set | |
| 73 #pass something like set1,set2 and split and validate each. | |
| 74 #Or do this in the calling script? | |
| 75 | |
| 76 throw('-import_sets not fully implemented yet') if defined $import_fsets; | |
| 77 $self->{'import_sets'} = (defined $import_fsets) ? @{$import_fsets} : undef; | |
| 78 | |
| 79 $self->log("Parsing and loading $type ExternalFeatures"); | |
| 80 | |
| 81 return $self; | |
| 82 | |
| 83 } | |
| 84 | |
| 85 | |
| 86 =head2 import_sets | |
| 87 | |
| 88 Args : None | |
| 89 Example : foreach my $import_set_name(@{$self->import_sets}){ ... do the import ... } | |
| 90 Description: Getter for the list of import feature set names, defaults to all in parser config. | |
| 91 Returntype : Arrayref of import feature_set names | |
| 92 Exceptions : None | |
| 93 Caller : General | |
| 94 Status : Medium Risk | |
| 95 | |
| 96 =cut | |
| 97 | |
| 98 sub import_sets{ | |
| 99 my $self = shift; | |
| 100 | |
| 101 return $self->{'import_sets'} || [keys %{$self->{static_config}{feature_sets}}]; | |
| 102 } | |
| 103 | |
| 104 | |
| 105 =head2 set_feature_sets | |
| 106 | |
| 107 Args : None | |
| 108 Example : $self->set_feature_sets; | |
| 109 Description: Imports feature sets defined by import_sets. | |
| 110 Returntype : None | |
| 111 Exceptions : Throws if feature set already present and rollback or archive not set | |
| 112 Caller : General | |
| 113 Status : Medium Risk | |
| 114 | |
| 115 =cut | |
| 116 | |
| 117 #This is done after validate and store feature_types | |
| 118 #Updating this will require making all external parsers use 'static_config' | |
| 119 | |
| 120 sub set_feature_sets{ | |
| 121 my $self = shift; | |
| 122 | |
| 123 throw('Must provide a set feature_set config hash') if ! defined $self->{static_config}{feature_sets}; | |
| 124 | |
| 125 | |
| 126 my $fset_adaptor = $self->db->get_FeatureSetAdaptor; | |
| 127 my $analysis_adaptor = $self->db->get_AnalysisAdaptor; | |
| 128 | |
| 129 foreach my $fset_name(@{$self->import_sets}){ | |
| 130 | |
| 131 $self->log("Defining FeatureSet:\t$fset_name"); | |
| 132 my $fset = $fset_adaptor->fetch_by_name($fset_name); | |
| 133 | |
| 134 #we don't need data sets for external_feature sets! | |
| 135 #Compare against config after we have merged with defined_anld_validate etc | |
| 136 | |
| 137 if(defined $fset){ | |
| 138 $self->log("Found previous FeatureSet $fset_name"); | |
| 139 | |
| 140 if($self->rollback){ | |
| 141 | |
| 142 $self->rollback_FeatureSet($fset);#Need to pass \@slices here? | |
| 143 } | |
| 144 elsif($self->{'archive'}){ | |
| 145 my $archive_fset = $fset_adaptor->fetch_by_name($fset_name."_v".$self->{'archive'}); | |
| 146 | |
| 147 if(defined $archive_fset){ | |
| 148 throw("You are trying to create an archive external feature_set which already exists:\t${fset_name}_v".$self->{archive}); | |
| 149 } | |
| 150 | |
| 151 my $sql = "UPDATE feature_set set name='$fset_name}_v".$self->{archive}."' where name='$fset_name'"; | |
| 152 $self->db->dbc->do($sql); | |
| 153 undef $fset; | |
| 154 }else{ | |
| 155 throw("You are trying to create an external feature_set which already exists:\t$fset_name\nMaybe to want to rollback or archive?"); | |
| 156 } | |
| 157 } | |
| 158 | |
| 159 #Assume using static config for now | |
| 160 #Will need to resolve this when it become generic | |
| 161 #Maybe we set outside of config! | |
| 162 #simply as analyses, feature_sets and feature_types? | |
| 163 my $fset_config = $self->{static_config}{feature_sets}{$fset_name}{feature_set}; | |
| 164 | |
| 165 | |
| 166 if(! defined $fset){ | |
| 167 my ($name, $analysis, $ftype, $display_label, $desc); | |
| 168 my $fset_analysis_key = (exists ${$fset_config}{-analysis}) ? '-analysis' : '-ANALYSIS'; | |
| 169 my $fset_name_key = (exists ${$fset_config}{-name}) ? '-name' : '-NAME'; | |
| 170 my $fset_ftype_key = (exists ${$fset_config}{-feature_type}) ? '-feature_type' : '-FEATURE_TYPE'; | |
| 171 my $fset_dlabel_key = (exists ${$fset_config}{-display_label}) ? '-display_label' : '-DISPLAY_LABEL'; | |
| 172 my $fset_desc_key = (exists ${$fset_config}{-description}) ? '-description' : '-DESCRIPTION'; | |
| 173 my $display_name = (exists ${$fset_config}{$fset_dlabel_key}) ? $fset_config->{$fset_dlabel_key} : $fset_name; | |
| 174 #fset config name be different from key name | |
| 175 my $fs_name = (exists ${$fset_config}{$fset_name_key}) ? $fset_config->{$fset_name_key} : $fset_name; | |
| 176 #warn if they are different? | |
| 177 | |
| 178 | |
| 179 #Can't just deref config hash here as we need to deref the nested feature_type and analysis attrs | |
| 180 | |
| 181 $fset = Bio::EnsEMBL::Funcgen::FeatureSet->new( | |
| 182 -name => $fs_name, | |
| 183 -feature_class=> 'external', | |
| 184 -analysis => ${$fset_config->{$fset_analysis_key}}, | |
| 185 -feature_type => ${$fset_config->{$fset_ftype_key}}, | |
| 186 -display_label => $display_name, | |
| 187 -description => $fset_config->{$fset_desc_key} | |
| 188 ); | |
| 189 | |
| 190 ($fset) = @{$self->db->get_FeatureSetAdaptor->store($fset)}; | |
| 191 } | |
| 192 | |
| 193 #Now replace config hash with object | |
| 194 #Will this reset in hash or just locally? | |
| 195 #$fset_config = $fset; | |
| 196 $self->{static_config}{feature_sets}{$fset_name}{feature_set} = $fset; | |
| 197 } | |
| 198 | |
| 199 return; | |
| 200 } | |
| 201 | |
| 202 #Can't use this anymore as we have to use static_config for all parsers which use set_feature_sets | |
| 203 | |
| 204 # | |
| 205 #=head2 validate_and_store_feature_types | |
| 206 # | |
| 207 # Args : None | |
| 208 # Example : $self->validate_and_store_feature_types; | |
| 209 # Description: Imports feature types defined by import_sets. | |
| 210 # Returntype : None | |
| 211 # Exceptions : None | |
| 212 # Caller : General | |
| 213 # Status : High Risk - Now using BaseImporter::validate_and_store_config for vista | |
| 214 # | |
| 215 #=cut | |
| 216 # | |
| 217 ##Change all external parsers to use BaseImporter::validate_and_store_config | |
| 218 # | |
| 219 #sub validate_and_store_feature_types{ | |
| 220 # my $self = shift; | |
| 221 # | |
| 222 # #This currently only stores ftype associated with the feature_sets | |
| 223 # #Havent't we done this already in the InputSet parser | |
| 224 # #Need to write BaseImporter and inherit from there. | |
| 225 # | |
| 226 # #InputSet does all loading, but depends on 'user_config' | |
| 227 # #Where as we are using hardcoded config here | |
| 228 # #Which are import_sets currently defaults to feature_sets keys | |
| 229 # | |
| 230 # #we could simply call this static_config and let user_config over-write static config with warnings? | |
| 231 # #on an key by key basis? (top level only?) | |
| 232 # | |
| 233 # | |
| 234 # my $ftype_adaptor = $self->db->get_FeatureTypeAdaptor; | |
| 235 # | |
| 236 # foreach my $import_set(@{$self->import_sets}){ | |
| 237 # | |
| 238 # my $ftype_config = ${$self->{static_config}{feature_sets}{$import_set}{feature_type}}; | |
| 239 # my $ftype = $ftype_adaptor->fetch_by_name($ftype_config->{'name'}); | |
| 240 # | |
| 241 # $self->log("Validating $import_set FeatureType:\t".$ftype_config->{'name'}); | |
| 242 # | |
| 243 # if(! defined $ftype){ | |
| 244 # $self->log("FeatureType '".$ftype_config->{'name'}."' for external feature_set ".$self->{'type'}." not present"); | |
| 245 # $self->log("Storing using type hash definitions"); | |
| 246 # | |
| 247 # $ftype = Bio::EnsEMBL::Funcgen::FeatureType->new( | |
| 248 # -name => $ftype_config->{'name'}, | |
| 249 # -class => $ftype_config->{'class'}, | |
| 250 # -description => $ftype_config->{'description'}, | |
| 251 # ); | |
| 252 # ($ftype) = @{$ftype_adaptor->store($ftype)}; | |
| 253 # } | |
| 254 # | |
| 255 # #Replace hash config with object | |
| 256 # $self->{static_config}{feature_types}{$ftype_config->{'name'}} = $ftype; | |
| 257 # } | |
| 258 # | |
| 259 # return; | |
| 260 #} | |
| 261 # | |
| 262 | |
| 263 | |
| 264 | |
| 265 | |
| 266 | |
| 267 | |
| 268 | |
| 269 1; |
