annotate BEDTools-Version-2.14.3/src/shuffleBed/shuffleBed.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 shuffleBed.cpp
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
3
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
4 (c) 2009 - Aaron Quinlan
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
5 Hall Laboratory
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
6 Department of Biochemistry and Molecular Genetics
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
7 University of Virginia
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
8 aaronquinlan@gmail.com
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
9
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
10 Licenced under the GNU General Public License 2.0 license.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
11 ******************************************************************************/
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
12 #include "lineFileUtilities.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
13 #include "shuffleBed.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
14
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
15
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
16 BedShuffle::BedShuffle(string &bedFile, string &genomeFile, string &excludeFile, string &includeFile,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
17 bool haveSeed, bool haveExclude, bool haveInclude, bool sameChrom,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
18 float overlapFraction, int seed) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
19
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
20 _bedFile = bedFile;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
21 _genomeFile = genomeFile;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
22 _excludeFile = excludeFile;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
23 _includeFile = includeFile;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
24 _sameChrom = sameChrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
25 _haveExclude = haveExclude;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
26 _haveInclude = haveInclude;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
27 _overlapFraction = overlapFraction;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
28 _haveSeed = haveSeed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
29
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
30
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
31 // use the supplied seed for the random
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
32 // number generation if given. else,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
33 // roll our own.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
34 if (_haveSeed) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
35 _seed = seed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
36 srand(seed);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
37 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
38 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
39 // thanks to Rob Long for the tip.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
40 _seed = (unsigned)time(0)+(unsigned)getpid();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
41 srand(_seed);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
42 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
43
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
44 _bed = new BedFile(bedFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
45 _genome = new GenomeFile(genomeFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
46 _chroms = _genome->getChromList();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
47 _numChroms = _genome->getNumberOfChroms();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
48
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
49 if (_haveExclude) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
50 _exclude = new BedFile(excludeFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
51 _exclude->loadBedFileIntoMap();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
52 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
53
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
54 if (_haveInclude) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
55 _include = new BedFile(includeFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
56 _include->loadBedFileIntoMapNoBin();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
57
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
58 _numIncludeChroms = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
59 masterBedMapNoBin::const_iterator it = _include->bedMapNoBin.begin();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
60 masterBedMapNoBin::const_iterator itEnd = _include->bedMapNoBin.end();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
61 for(; it != itEnd; ++it) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
62 _includeChroms.push_back(it->first);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
63 _numIncludeChroms++;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
64 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
65 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
66
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
67 if (_haveExclude == true && _haveInclude == false)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
68 ShuffleWithExclusions();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
69 else if (_haveExclude == false && _haveInclude == true)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
70 ShuffleWithInclusions();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
71 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
72 Shuffle();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
73 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
74
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
75
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
76 BedShuffle::~BedShuffle(void) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
77
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
78 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
79
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
80
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
81 void BedShuffle::Shuffle() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
82
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
83 int lineNum = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
84 BED bedEntry, nullBed; // used to store the current BED line from the BED file.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
85 BedLineStatus bedStatus;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
86
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
87 _bed->Open();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
88 while ((bedStatus = _bed->GetNextBed(bedEntry, lineNum)) != BED_INVALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
89 if (bedStatus == BED_VALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
90 ChooseLocus(bedEntry);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
91 _bed->reportBedNewLine(bedEntry);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
92 bedEntry = nullBed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
93 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
94 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
95 _bed->Close();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
96 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
97
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
98
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
99
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
100 void BedShuffle::ShuffleWithExclusions() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
101
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
102 int lineNum = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
103 BED bedEntry, nullBed; // used to store the current BED line from the BED file.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
104 BedLineStatus bedStatus;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
105
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
106 _bed->Open();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
107 while ((bedStatus = _bed->GetNextBed(bedEntry, lineNum)) != BED_INVALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
108 if (bedStatus == BED_VALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
109 // keep looking as long as the chosen
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
110 // locus happens to overlap with regions
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
111 // that the user wishes to exclude.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
112 int tries = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
113 bool haveOverlap = false;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
114 do
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
115 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
116 // choose a new locus
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
117 ChooseLocus(bedEntry);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
118 haveOverlap = _exclude->FindOneOrMoreOverlapsPerBin(bedEntry.chrom, bedEntry.start, bedEntry.end,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
119 bedEntry.strand, false, _overlapFraction);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
120 tries++;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
121 } while ((haveOverlap == true) && (tries <= MAX_TRIES));
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
122
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
123
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
124 if (tries > MAX_TRIES) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
125 cerr << "Error, line " << lineNum << ": tried " << MAX_TRIES << " potential loci for entry, but could not avoid excluded regions. Ignoring entry and moving on." << endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
126 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
127 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
128 _bed->reportBedNewLine(bedEntry);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
129 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
130 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
131 bedEntry = nullBed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
132 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
133 _bed->Close();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
134 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
135
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
136
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
137 void BedShuffle::ShuffleWithInclusions() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
138
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
139 int lineNum = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
140 BED bedEntry, nullBed; // used to store the current BED line from the BED file.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
141 BedLineStatus bedStatus;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
142
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
143 _bed->Open();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
144 while ((bedStatus = _bed->GetNextBed(bedEntry, lineNum)) != BED_INVALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
145 if (bedStatus == BED_VALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
146 // choose a new locus
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
147 ChooseLocusFromInclusionFile(bedEntry);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
148 _bed->reportBedNewLine(bedEntry);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
149 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
150 bedEntry = nullBed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
151 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
152 _bed->Close();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
153 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
154
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
155
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
156 void BedShuffle::ChooseLocus(BED &bedEntry) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
157
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
158 string chrom = bedEntry.chrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
159 CHRPOS start = bedEntry.start;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
160 CHRPOS end = bedEntry.end;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
161 CHRPOS length = end - start;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
162
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
163 string randomChrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
164 CHRPOS randomStart;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
165 CHRPOS chromSize;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
166
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
167 if (_sameChrom == false) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
168 randomChrom = _chroms[rand() % _numChroms];
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
169 chromSize = _genome->getChromSize(randomChrom);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
170 randomStart = rand() % chromSize;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
171 bedEntry.chrom = randomChrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
172 bedEntry.start = randomStart;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
173 bedEntry.end = randomStart + length;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
174 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
175 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
176 chromSize = _genome->getChromSize(chrom);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
177 randomStart = rand() % chromSize;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
178 bedEntry.start = randomStart;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
179 bedEntry.end = randomStart + length;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
180 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
181
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
182 // ensure that the chosen location doesn't go past
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
183 // the length of the chromosome. if so, keep looking
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
184 // for a new spot.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
185 while (bedEntry.end > chromSize) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
186 if (_sameChrom == false) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
187 randomChrom = _chroms[rand() % _numChroms];
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
188 chromSize = _genome->getChromSize(randomChrom);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
189 randomStart = rand() % chromSize;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
190 bedEntry.chrom = randomChrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
191 bedEntry.start = randomStart;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
192 bedEntry.end = randomStart + length;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
193 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
194 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
195 chromSize = _genome->getChromSize(chrom);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
196 randomStart = rand() % chromSize;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
197 bedEntry.start = randomStart;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
198 bedEntry.end = randomStart + length;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
199 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
200 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
201 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
202
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
203
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
204 void BedShuffle::ChooseLocusFromInclusionFile(BED &bedEntry) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
205
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
206 string chrom = bedEntry.chrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
207 CHRPOS length = bedEntry.end - bedEntry.start;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
208
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
209 string randomChrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
210 CHRPOS randomStart;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
211 BED includeInterval;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
212
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
213 if (_sameChrom == false) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
214
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
215 // grab a random chromosome from the inclusion file.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
216 randomChrom = _includeChroms[rand() % _numIncludeChroms];
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
217 // get the number of inclusion intervals for that chrom
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
218 size_t size = _include->bedMapNoBin[randomChrom].size();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
219 // grab a random interval on the chosen chromosome.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
220 size_t interval = rand() % size;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
221 // retreive a ranom -incl interval on the selected chrom
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
222 includeInterval = _include->bedMapNoBin[randomChrom][interval];
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
223
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
224 bedEntry.chrom = randomChrom;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
225 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
226 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
227 // get the number of inclusion intervals for the original chrom
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
228 size_t size = _include->bedMapNoBin[chrom].size();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
229 // grab a random interval on the chosen chromosome.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
230 includeInterval = _include->bedMapNoBin[chrom][rand() % size];
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
231 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
232
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
233 randomStart = includeInterval.start + rand() % (includeInterval.size());
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
234 bedEntry.start = randomStart;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
235 bedEntry.end = randomStart + length;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
236
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
237 // use recursion to ensure that the chosen location
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
238 // doesn't go past the end of the chrom
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
239 if (bedEntry.end > ((size_t) _genome->getChromSize(chrom))) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
240 //bedEntry.end = _genome->getChromSize(chrom);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
241 ChooseLocusFromInclusionFile(bedEntry);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
242 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
243 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
244