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