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

Annotation of /FigKernelPackages/SampleDir.pm

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : olson 1.1 #
2 :     # Utilities for dealing with samples, function summaries,
3 :     # OTU summaries, and the vectors that represent them.
4 :     #
5 :    
6 :     #
7 :     # A sample is stored in a directory.
8 :     #
9 :     # The raw DNA for the sample is in sample.fa
10 :     # Metadata about the sample is stored in a set of flat files:
11 :     #
12 :     # NAME
13 :     # DESCRIPTION
14 :     #
15 :     # Each analysis is stored in a directory
16 :     #
17 :     # dataset-name/idx
18 :     #
19 :     # where dataset-name is the name of the Kmer dataset used for the analysis,
20 :     # and idx is a numeric index. Each analysis with a different set of
21 :     # parameters is stored in its own directory.
22 :     #
23 :     # The processing parameters are stored in a YAML file params.yml.
24 :     # The parameters file contains a serialized hash with the following keys:
25 :     # kmer: kmer size
26 :     # max_gap: max-gap parameter
27 :     # min_size: min-size parameter
28 :     # dataset: Kmer dataset identifier
29 :     #
30 :    
31 :     package SampleDir;
32 :    
33 :     use strict;
34 :     use SeedUtils;
35 :     use ANNOserver;
36 :     use Data::Dumper;
37 :     use YAML::Any qw(Dump Load DumpFile LoadFile);
38 :    
39 :     use base qw(Class::Accessor);
40 :    
41 :     __PACKAGE__->mk_accessors(qw(dir sequence_type anno));
42 :    
43 :     our %kmer_defaults = (-kmer => 8,
44 :     -minHits => 3,
45 :     -maxGap => 600);
46 :    
47 :     sub create
48 :     {
49 :     my($class, $dir, $sample_file) = @_;
50 :    
51 :     if (-d $dir)
52 :     {
53 :     die "SampleDir::create: directorty $dir already exists\n";
54 :     }
55 :    
56 :     if (! -f $sample_file)
57 :     {
58 :     die "SampleDir::create: sample file $sample_file does not exist\n";
59 :     }
60 :    
61 :     mkdir($dir) or die "SampleDir::create: mkdir $dir failed: $!";
62 :     my $seq_type = SeedUtils::validate_fasta_file($sample_file, "$dir/sample.fa");
63 :    
64 :     my $obj = $class->new($dir);
65 :     $obj->sequence_type($seq_type);
66 :    
67 :     return $obj;
68 :     }
69 :    
70 :     sub new
71 :     {
72 :     my($class, $dir, %args ) = @_;
73 :    
74 :     my $self = {
75 :     dir => $dir,
76 :     anno => ANNOserver->new(exists($args{-url}) ? (-url => $args{-url}) : ()),
77 :     args => \%args,
78 :     };
79 :    
80 :     return bless $self, $class;
81 :     }
82 :    
83 :     sub name
84 :     {
85 :     my($self) = @_;
86 :     my $n = &SeedUtils::file_head("$self->{dir}/NAME",1 );
87 :     chomp $n;
88 :     return $n;
89 :     }
90 :    
91 :     sub description
92 :     {
93 :     my($self) = @_;
94 :     my $n = &SeedUtils::file_head("$self->{dir}/DESCRIPTION",1 );
95 :     chomp $n;
96 :     return $n;
97 :     }
98 :    
99 :     sub perform_basic_analysis
100 :     {
101 :     my($self, %args) = @_;
102 :    
103 :     my %params = %kmer_defaults;
104 :     for my $k (keys %args)
105 :     {
106 :     if (defined($params{$k}))
107 :     {
108 :     $params{$k} = $args{$k};
109 :     }
110 :     }
111 :    
112 :     #
113 :     # If dataset not specified, look up the current
114 :     # default and specify it with all future calls.
115 :     #
116 :     if (!defined($params{-kmerDataset}))
117 :     {
118 :     my $ds = $self->anno->get_dataset();
119 :     $params{-kmerDataset} = $ds;
120 :     print "Using default dataset $ds\n";
121 :     }
122 :    
123 :     #
124 :     # Create the dataset directory if not already present.
125 :     #
126 :    
127 :     my $ds = $params{-kmerDataset};
128 :     my $ds_dir = "$self->{dir}/$ds";
129 :     if (!-d $ds_dir)
130 :     {
131 :     mkdir($ds_dir) or die "Cannot mkdir $ds_dir: $!";
132 :     }
133 :    
134 :     #
135 :     # Find a new analysis dir pathname. Start at zero.
136 :     #
137 :     my $analysis_num = 0;
138 :     my $analysis_dir = "$ds_dir/$analysis_num";
139 :     while (-e $analysis_dir)
140 :     {
141 :     $analysis_num++;
142 :     $analysis_dir = "$ds_dir/$analysis_num";
143 :     }
144 :    
145 :     mkdir($analysis_dir) or die "Cannot mkdir $analysis_dir: $!";
146 :    
147 :     print STDERR "Using analysis dir $analysis_dir\n";
148 :    
149 :     DumpFile("$analysis_dir/params.yml", \%params);
150 :    
151 :     my $fh;
152 :     my $sample = "$self->{dir}/sample.fa";
153 :     if (!open($fh, "<", $sample))
154 :     {
155 :     die "Cannot open sample file $sample: $!";
156 :     }
157 :     my %otu_summary;
158 :     my %fn_summary;
159 :    
160 :     my $details_fh;
161 :     open($details_fh, ">", "$analysis_dir/sample.out") or die "Cannot write $analysis_dir/sample.out: $!";
162 :    
163 :     my $otu_sum_fh;
164 :     open($otu_sum_fh, ">", "$analysis_dir/sample.otu.sum") or die "Cannot write $analysis_dir/sample.otu.sum: $!";
165 :    
166 :     my $fn_sum_fh;
167 :     open($fn_sum_fh, ">", "$analysis_dir/sample.fn.sum") or die "Cannot write $analysis_dir/sample.fn.sum: $!";
168 :    
169 :     my $rh = $self->anno->assign_functions_to_dna(-input => $fh, %params);
170 :     my $totF = 0;
171 :     my $totO = 0;
172 :     while (my $res = $rh->get_next())
173 :     {
174 :     my($id, $tuple) = @$res;
175 :    
176 :     my($count, $start, $stop, $func, $otu) = @$tuple;
177 :    
178 :     my $loc = "${id}_${start}_${stop}";
179 :     print $details_fh "$id\t$count\t$loc\t$func\t$otu\n";
180 :    
181 :     if (defined($otu))
182 :     {
183 :     $otu_summary{$otu}++;
184 :     $totO++;
185 :     }
186 :     if (defined($func))
187 :     {
188 :     $fn_summary{$func}++;
189 :     $totF++;
190 :     }
191 :     }
192 :    
193 :     close($details_fh);
194 :    
195 :     for my $fn (sort { $fn_summary{$b} <=> $fn_summary{$a} } keys %fn_summary)
196 :     {
197 :     print $fn_sum_fh join("\t",
198 :     $fn_summary{$fn},
199 :     sprintf("%0.6f", $fn_summary{$fn} / $totF),
200 :     $fn), "\n";
201 :     }
202 :     close($fn_sum_fh);
203 :    
204 :     for my $otu (sort { $otu_summary{$b} <=> $otu_summary{$a} } keys %otu_summary)
205 :     {
206 :     print $otu_sum_fh join("\t",
207 :     $otu_summary{$otu},
208 :     sprintf("%0.6f", $otu_summary{$otu} / $totO),
209 :     $otu), "\n";
210 :     }
211 :     close($otu_sum_fh);
212 :    
213 :     }
214 :    
215 :    
216 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3