warn that patch 00068/AddMissingStockAndTrialProps is so far only designed for some dbs
[sgn.git] / lib / CXGN / Fieldbook / TraitInfo.pm
blob98e75a297653f6ba80cf6a220637d4dda1070855
1 package CXGN::Fieldbook::TraitInfo;
3 =head1 NAME
5 CXGN::Fieldbook::TraitInfo - a module to get information from a trait to build the fieldbook trait file.
7 =head1 USAGE
9 my $trait_info_lookup = CXGN::Fieldbook::TraitInfo->new({ chado_schema => $chado_schema, db_name => $db_name, trait_accession => $trait_accession });
10 my $trait_info = $trait_info_lookup->get_trait_info(); #returns a string to use for the fieldbook trait file or returns false if not found
12 =head1 DESCRIPTION
14 Looks up a trait and builds a string to use in the fieldbook trait file.
16 =head1 AUTHORS
18 Jeremy D. Edwards (jde22@cornell.edu)
19 Naama Menda (nm249@cornell.edu)
21 =cut
23 use Moose;
24 use MooseX::FollowPBP;
25 use Moose::Util::TypeConstraints;
27 has 'chado_schema' => (
28 is => 'ro',
29 isa => 'DBIx::Class::Schema',
30 required => 1,
32 has 'db_name' => (
33 is => 'ro',
34 isa => 'Str',
35 required => 1,
37 has 'trait_accession' => (
38 is => 'ro',
39 isa => 'Str',
40 required => 1,
43 sub get_trait_info {
44 my $self = shift;
45 my $trait_name = shift;
46 my $chado_schema = $self->get_chado_schema();
47 my $trait_info_string;
49 my $db_rs = $chado_schema->resultset("General::Db")->search( { 'me.name' => $self->get_db_name() });
51 if (!$db_rs) {
52 print STDERR "Could not find trait ontology database: ".$self->get_db_name()."\n";
53 return;
56 my $trait_cvterm = $chado_schema->resultset("Cv::Cvterm")
57 ->find( {
58 'dbxref.db_id' => $db_rs->first()->db_id(),
59 'dbxref.accession' => $self->get_trait_accession(),
62 'join' => 'dbxref'
67 if (!$trait_cvterm) {
68 print STDERR "Could not find trait name: ".$trait_name."\n";
69 return;
72 #get cvtermprops
73 my $cvtermprops = $trait_cvterm->search_related('cvtermprops');
75 # add full name in detail field, plus scale info if it's available
76 my $trait_details = $trait_name;
77 my $trait_def = $trait_cvterm->definition();
78 $trait_def =~ s/([^\.]*\.\s{1})//;
79 if ($trait_def =~ /=/) { $trait_details .= "\n" . $trait_def; }
80 #print STDERR "trait details = $trait_details\n";
82 my $cvterms = $self->_get_cvterms();
84 my %trait_props;
85 #set default values
86 $trait_props{'trait_format'}='numeric';
87 $trait_props{'trait_default_value'}='';
88 $trait_props{'trait_minimum'}='';
89 $trait_props{'trait_maximum'}='';
90 $trait_props{'trait_details'}=$trait_details;
91 $trait_props{'trait_categories'}='';
94 print STDERR "trait name = $trait_name\n";
95 # change from default numeric based on trait name
96 if ($trait_name =~ m/percent/) {
97 $trait_props{'trait_format'}='percent';
98 $trait_props{'trait_minimum'}='0';
99 $trait_props{'trait_maximum'}='100';
100 $trait_props{'trait_default_value'}='50';
102 # elsif ($trait_name =~ m/counting/) {
103 # $trait_props{'trait_format'}='counter';
105 elsif ($trait_name =~ m/image/) {
106 $trait_props{'trait_format'}='photo';
108 elsif ($trait_name =~ m/([0-9])-([0-9]+)/) {
109 print STDERR "matched categorical trait with scale $1 to $2\n";
111 if (($2-$1) >= 12) { #leave categorical traits as numeric if they exceed fieldbook's max of 12 categories
112 $trait_props{'trait_minimum'}=$1;
113 $trait_props{'trait_maximum'}=$2;
114 } else {
115 $trait_props{'trait_format'}='categorical';
116 my $categories;
117 foreach (my $i=$1; $i < $2; $i++ ) {
118 $categories .= $i . "/";
120 $categories .= $2;
121 print STDERR "categories = $categories\n";
122 $trait_props{'trait_categories'}= $categories;
126 #change from default numeric based on properties stored in the database
127 foreach my $property_name (keys %{$cvterms}) {
128 my $prop_cvterm = $cvterms->{$property_name};
129 my $prop = $cvtermprops->find({'type_id' => $prop_cvterm->cvterm_id()});
130 if ($prop && $prop->value()) {
131 $trait_props{$property_name}=$prop->value();
135 #build trait_info_string
136 #order for trait file is: format,defaultValue,minimum,maximum,details,categories
137 $trait_info_string .= '"'.$trait_props{'trait_format'}.'",';
138 $trait_info_string .= '"'.$trait_props{'trait_default_value'}.'",';
139 $trait_info_string .= '"'.$trait_props{'trait_minimum'}.'",';
140 $trait_info_string .= '"'.$trait_props{'trait_maximum'}.'",';
141 $trait_info_string .= '"'.$trait_props{'trait_details'}.'",';
142 $trait_info_string .= '"'.$trait_props{'trait_categories'}.'"';
144 return $trait_info_string;
147 sub _get_cvterms {
148 my $self = shift;
149 my $chado_schema = $self->get_chado_schema();
150 my %cvterms;
152 my @trait_property_names = qw(
153 trait_format
154 trait_default_value
155 trait_minimum
156 trait_maximum
157 trait_details
158 trait_categories
161 # my $cv = $chado_schema->resultset("Cv::Cv")
162 # ->find_or_create({
163 # name => 'trait_property',
164 # });
165 # $cv->insert;
167 foreach my $property_name (@trait_property_names) {
169 $cvterms{$property_name} = $chado_schema->resultset("Cv::Cvterm")
170 ->create_with({
171 name => $property_name,
172 cv => 'trait_property',
176 return \%cvterms;
181 #######
183 #######