annotate BEDTools-Version-2.14.3/src/unionBedGraphs/unionBedGraphs.cpp @ 0:dfcd8b6c1bda

Uploaded
author aaronquinlan
date Thu, 03 Nov 2011 10:25:04 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
1 /*****************************************************************************
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
2 unionBedGraphs.cpp
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
3
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
4 (c) 2010 - Assaf Gordon, CSHL
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
5 - Aaron Quinlan, UVA
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
6 Hall Laboratory
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
7 Department of Biochemistry and Molecular Genetics
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
8 University of Virginia
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
9 aaronquinlan@gmail.com
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
10
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
11 Licenced under the GNU General Public License 2.0 license.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
12 ******************************************************************************/
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
13 #include <cassert>
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
14 #include <cstring>
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
15 #include <cstdlib>
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
16 #include <iostream>
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
17 #include <algorithm>
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
18
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
19 #include "bedGraphFile.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
20 #include "unionBedGraphs.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
21
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
22 using namespace std;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
23
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
24
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
25 UnionBedGraphs::UnionBedGraphs(std::ostream& _output,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
26 const vector<string>& _filenames,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
27 const vector<string>& _titles,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
28 bool _print_empty_regions,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
29 const std::string& _genome_size_filename,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
30 const std::string& _no_coverage_value ) :
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
31 filenames(_filenames),
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
32 titles(_titles),
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
33 output(_output),
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
34 current_non_zero_inputs(0),
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
35 print_empty_regions(_print_empty_regions),
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
36 genome_sizes(NULL),
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
37 no_coverage_value(_no_coverage_value)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
38 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
39 if (print_empty_regions) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
40 assert(!_genome_size_filename.empty());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
41
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
42 genome_sizes = new GenomeFile(_genome_size_filename);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
43 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
44 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
45
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
46
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
47 UnionBedGraphs::~UnionBedGraphs() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
48 CloseBedgraphFiles();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
49 if (genome_sizes) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
50 delete genome_sizes;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
51 genome_sizes = NULL ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
52 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
53 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
54
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
55
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
56 void UnionBedGraphs::Union() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
57 OpenBedgraphFiles();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
58
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
59 // Add the first interval from each file
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
60 for(size_t i=0;i<bedgraph_files.size();++i)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
61 LoadNextBedgraphItem(i);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
62
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
63 // Chromosome loop - once per chromosome
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
64 do {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
65 // Find the first chromosome to use
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
66 current_chrom = DetermineNextChrom();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
67
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
68 // Populate the queue with initial values from all files
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
69 // (if they belong to the correct chromosome)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
70 for(size_t i=0;i<bedgraph_files.size();++i)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
71 AddInterval(i);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
72
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
73 CHRPOS current_start = ConsumeNextCoordinate();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
74
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
75 // User wanted empty regions, and the first coordinate is not 0 - print a dummy empty coverage
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
76 if (print_empty_regions && current_start > 0)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
77 PrintEmptyCoverage(0,current_start);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
78
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
79 // Intervals loop - until all intervals (of current chromosome) from all files are used.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
80 do {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
81 CHRPOS current_end = queue.top().coord;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
82 PrintCoverage(current_start, current_end);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
83 current_start = ConsumeNextCoordinate();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
84 } while (!queue.empty());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
85
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
86 // User wanted empty regions, and the last coordinate is not the last coordinate of the chromosome
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
87 // print a dummy empty coverage
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
88 if (print_empty_regions) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
89 CHRPOS chrom_size = genome_sizes->getChromSize(current_chrom);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
90 if (current_start < chrom_size)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
91 PrintEmptyCoverage(current_start, chrom_size);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
92 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
93
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
94 } while (!AllFilesDone());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
95 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
96
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
97
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
98 CHRPOS UnionBedGraphs::ConsumeNextCoordinate() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
99 assert(!queue.empty());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
100
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
101 CHRPOS new_position = queue.top().coord;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
102 do {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
103 IntervalItem item = queue.top();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
104 UpdateInformation(item);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
105 queue.pop();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
106 } while (!queue.empty() && queue.top().coord == new_position);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
107
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
108 return new_position;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
109 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
110
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
111
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
112 void UnionBedGraphs::UpdateInformation(const IntervalItem &item) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
113 // Update the depth coverage for this file
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
114
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
115 // Which coordinate is it - start or end?
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
116 switch (item.coord_type)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
117 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
118 case START:
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
119 current_depth[item.source_index] = item.depth;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
120 current_non_zero_inputs++;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
121 break;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
122 case END:
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
123 //Read the next interval from this file
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
124 AddInterval(item.source_index);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
125 current_depth[item.source_index] = no_coverage_value;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
126 current_non_zero_inputs--;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
127 break;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
128 default:
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
129 assert(0);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
130 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
131 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
132
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
133
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
134 void UnionBedGraphs::PrintHeader() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
135 output << "chrom\tstart\tend" ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
136 for (size_t i=0;i<titles.size();++i)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
137 output << "\t" <<titles[i];
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
138 output << endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
139 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
140
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
141
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
142 void UnionBedGraphs::PrintCoverage(CHRPOS start, CHRPOS end) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
143 if ( current_non_zero_inputs == 0 && ! print_empty_regions )
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
144 return ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
145
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
146 output << current_chrom << "\t"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
147 << start << "\t"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
148 << end;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
149
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
150 for (size_t i=0;i<current_depth.size();++i)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
151 output << "\t" << current_depth[i] ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
152
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
153 output << endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
154 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
155
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
156
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
157 void UnionBedGraphs::PrintEmptyCoverage(CHRPOS start, CHRPOS end) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
158 output << current_chrom << "\t"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
159 << start << "\t"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
160 << end;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
161
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
162 for (size_t i=0;i<current_depth.size();++i)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
163 output << "\t" << no_coverage_value ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
164
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
165 output << endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
166 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
167
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
168
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
169 void UnionBedGraphs::LoadNextBedgraphItem(int index) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
170 assert(static_cast<unsigned int>(index) < bedgraph_files.size());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
171
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
172 current_bedgraph_item[index].chrom="";
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
173
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
174 BedGraphFile *file = bedgraph_files[index];
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
175 BEDGRAPH_STR bg;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
176 int lineNum = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
177 BedGraphLineStatus status;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
178
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
179 while ( (status = file->GetNextBedGraph(bg, lineNum)) != BEDGRAPH_INVALID ) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
180 if (status != BEDGRAPH_VALID)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
181 continue;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
182
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
183 current_bedgraph_item[index] = bg ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
184 break;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
185 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
186 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
187
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
188
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
189 bool UnionBedGraphs::AllFilesDone() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
190 for (size_t i=0;i<current_bedgraph_item.size();++i)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
191 if (!current_bedgraph_item[i].chrom.empty())
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
192 return false;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
193 return true;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
194 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
195
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
196
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
197 string UnionBedGraphs::DetermineNextChrom() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
198 string next_chrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
199 for (size_t i=0;i<current_bedgraph_item.size();++i) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
200 if (current_bedgraph_item[i].chrom.empty())
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
201 continue;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
202
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
203 if (next_chrom.empty())
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
204 next_chrom = current_bedgraph_item[i].chrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
205 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
206 if (current_bedgraph_item[i].chrom < next_chrom)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
207 next_chrom = current_bedgraph_item[i].chrom ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
208 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
209 return next_chrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
210 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
211
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
212
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
213 void UnionBedGraphs::AddInterval(int index) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
214 assert(static_cast<unsigned int>(index) < bedgraph_files.size());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
215
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
216 //This file has no more intervals
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
217 if (current_bedgraph_item[index].chrom.empty())
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
218 return ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
219
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
220 //If the next interval belongs to a different chrom, don't add it
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
221 if (current_bedgraph_item[index].chrom!=current_chrom)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
222 return ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
223
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
224 const BEDGRAPH_STR &bg(current_bedgraph_item[index]);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
225
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
226 IntervalItem start_item(index, START, bg.start, bg.depth);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
227 IntervalItem end_item(index, END, bg.end, bg.depth);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
228
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
229 queue.push(start_item);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
230 queue.push(end_item);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
231
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
232 LoadNextBedgraphItem(index);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
233 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
234
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
235
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
236 void UnionBedGraphs::OpenBedgraphFiles() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
237 for (size_t i=0;i<filenames.size();++i) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
238 BedGraphFile *file = new BedGraphFile(filenames[i]);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
239 file->Open();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
240 bedgraph_files.push_back(file);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
241
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
242 current_depth.push_back(no_coverage_value);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
243 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
244 current_bedgraph_item.resize(filenames.size());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
245 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
246
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
247
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
248 void UnionBedGraphs::CloseBedgraphFiles() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
249 for (size_t i=0;i<bedgraph_files.size();++i) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
250 BedGraphFile *file = bedgraph_files[i];
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
251 delete file;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
252 bedgraph_files[i] = NULL ;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
253 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
254 bedgraph_files.clear();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
255 }