1 /*****************************************************************************
2 shiftBed.cpp
3
4 (c) 2016 - David Richardson
5 European Molecular Biology Laboratory, European Bioinformatics Institute
6 davidr@ebi.ac.uk
7
8 Licensed under the GNU General Public License 2.0 license.
9 ******************************************************************************/
10 #include "lineFileUtilities.h"
11 #include "shiftBed.h"
12
BedShift(string & bedFile,string & genomeFile,float shiftMinus,float shiftPlus,bool fractional,bool printHeader)13 BedShift::BedShift(string &bedFile, string &genomeFile, float shiftMinus,
14 float shiftPlus, bool fractional, bool printHeader) {
15
16 _bedFile = bedFile;
17 _genomeFile = genomeFile;
18 _shiftMinus = shiftMinus;
19 _shiftPlus = shiftPlus;
20 _fractional = fractional;
21 _printHeader = printHeader;
22
23 _bed = new BedFile(bedFile);
24 _genome = new GenomeFile(genomeFile);
25
26 // get going, shift it around.
27 ShiftBed();
28 }
29
~BedShift(void)30 BedShift::~BedShift(void) {}
31
ShiftBed()32 void BedShift::ShiftBed() {
33
34 BED bedEntry; // used to store the current BED line from the BED file.
35
36 _bed->Open();
37 // report header first if asked.
38 if (_printHeader == true) {
39 _bed->PrintHeader();
40 }
41 while (_bed->GetNextBed(bedEntry)) {
42 if (_bed->_status == BED_VALID) {
43 AddShift(bedEntry);
44 _bed->reportBedNewLine(bedEntry);
45 }
46 }
47 _bed->Close();
48 }
49
AddShift(BED & bed)50 void BedShift::AddShift(BED &bed) {
51
52 CHRPOS chromSize = (CHRPOS)_genome->getChromSize(bed.chrom);
53
54 double shift;
55
56 if (bed.strand == "-") {
57 shift = _shiftMinus;
58 } else {
59 shift = _shiftPlus;
60 }
61 if (_fractional == true)
62 shift = shift * (double)bed.size();
63
64 if ((bed.start + shift) < 0)
65 bed.start = 0;
66 else if ((bed.start + shift) > (chromSize - 1))
67 bed.start = (chromSize - 1);
68 else
69 bed.start = bed.start + shift;
70
71 if ((bed.end + shift) <= 0)
72 bed.end = 1;
73 else if ((bed.end + shift) > chromSize)
74 bed.end = chromSize;
75 else
76 bed.end = bed.end + shift;
77 }
78