1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
#include "BedPlusInterval.h"
#include "SingleLineDelimTextFileReader.h"
BedPlusInterval::BedPlusInterval()
: _numFixedFields(defaultNumFixedFields),
_numPrintFields(0)
{
_plusFields.setNumOffsetFields(defaultNumFixedFields);
}
void BedPlusInterval::setNumFixedFields(int numFields) {
_numFixedFields = numFields;
_plusFields.setNumOffsetFields(numFields);
}
bool BedPlusInterval::initFromFile(SingleLineDelimTextFileReader *fileReader)
{
bool baseRetFlag = Bed3Interval::initFromFile(fileReader);
if (_numFixedFields != defaultNumFixedFields) {
fileReader->getField(3, _name);
fileReader->getField(4, _score);
fileReader->getField(5, _strand);
adjustStrandVal();
}
_plusFields.initFromFile(fileReader);
return baseRetFlag;
}
void BedPlusInterval::clear() {
Bed3Interval::clear();
_plusFields.clear();
}
void BedPlusInterval::print(string &outBuf) const
{
Bed3Interval::print(outBuf);
outBuf.append("\t");
printBed6PlusFields(outBuf);
_plusFields.printFields(outBuf);
}
void BedPlusInterval::print(string &outBuf, int start, int end) const
{
Bed3Interval::print(outBuf, start, end);
outBuf.append("\t");
printBed6PlusFields(outBuf);
_plusFields.printFields(outBuf);
}
void BedPlusInterval::print(string &outBuf, const string & start, const string & end) const
{
Bed3Interval::print(outBuf, start, end);
outBuf.append("\t");
printBed6PlusFields(outBuf);
_plusFields.printFields(outBuf);
}
void BedPlusInterval::printNull(string &outBuf) const
{
Bed3Interval::printNull(outBuf);
printBed6PlusNullFields(outBuf);
for (int i=_numFixedFields; i < _numPrintFields; i++) {
outBuf.append("\t.");
}
}
const string &BedPlusInterval::getField(int fieldNum) const
{
if (fieldNum > _numFixedFields) {
return _plusFields.getField(fieldNum);
} else if (fieldNum == 4 && _numFixedFields >=4) {
return _name;
} else if (fieldNum == 5 && _numFixedFields >=5) {
return _score;
}
else if (fieldNum == 6 && _numFixedFields >=6) {
return _strand;
}
return Bed3Interval::getField(fieldNum);
}
bool BedPlusInterval::isNumericField(int fieldNum) {
//
// TBD: There is no currently no good way to guarantee / enforce whether
// fields after the 3rd are numeric, so for now we'll give the user the
// benefit of the doubt on those.
//
if (fieldNum > defaultNumFixedFields) {
return true;
}
return Bed3Interval::isNumericField(fieldNum);
}
void BedPlusInterval::printBed6PlusFields(string &outBuf) const {
if (_numFixedFields != defaultNumFixedFields) {
outBuf.append(_name);
outBuf.append("\t");
outBuf.append(_score);
outBuf.append("\t");
outBuf.append(_strand);
outBuf.append("\t");
}
}
void BedPlusInterval::printBed6PlusNullFields(string &outBuf) const {
if (_numFixedFields != defaultNumFixedFields) {
outBuf.append("\t.\t.\t.");
}
}
|