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
|
#include <alignment/datastructures/alignmentset/SAMSupplementalQVList.hpp>
const char *SupplementalQVList::qvNames[] = {"InsertionQV", "DeletionQV", "SubstitutionQV",
"MergeQV", "SubstitutionTag", "DeletionTag"};
const char *SupplementalQVList::qvTags[] = {"iq", "dq", "sq", "mq", "st", "dt"};
// Only the first 4 tags are quality values.
int SupplementalQVList::nqvTags = 4;
int SupplementalQVList::nTags = 6;
int SupplementalQVList::UseQV(std::vector<std::string> &qvList)
{
useqv = 0;
for (size_t i = 0; i < qvList.size(); i++) {
int j;
for (j = 0; j < nTags; j++) {
if (qvList[i] == qvNames[j]) {
useqv |= 1 << j;
break;
}
}
if (j == nTags) {
return 1;
}
}
return 0;
}
void SupplementalQVList::FormatQVOptionalFields(SMRTSequence &alignedSubsequence)
{
int i;
for (i = 0; i < nqvTags; i++) {
if (alignedSubsequence.GetQVPointerByIndex(i + 1)->data == NULL) {
// mask off this quality value since it does not exist
useqv = useqv & ~(1 << i);
}
}
for (i = 0; i < nqvTags; i++) {
if (useqv & (1 << i)) {
QualityVectorToPrintable(alignedSubsequence.GetQVPointerByIndex(i + 1)->data,
alignedSubsequence.length);
}
}
}
void SupplementalQVList::PrintQVOptionalFields(SMRTSequence &alignedSubsequence, std::ostream &out)
{
int i = 0;
for (i = 0; i < nqvTags; i++) {
if (alignedSubsequence.GetQVPointerByIndex(i + 1)->data == NULL) {
// mask off this quality value since it does not exist
useqv = useqv & ~(1 << i);
}
}
for (i = 0; i < nTags; i++) {
if (alignedSubsequence.GetQVPointerByIndex(i + 1) != NULL and (useqv & (1 << i))) {
out << "\t" << qvTags[i] << ":Z:";
alignedSubsequence.PrintAsciiRichQuality(out, i + 1, 0);
}
}
if (alignedSubsequence.substitutionTag != NULL and (useqv & SubstitutionTag)) {
out << "\t" << qvTags[I_SubstitutionTag - 1] << ":Z:";
alignedSubsequence.PrintAsciiRichQuality(out, I_SubstitutionTag, 0);
}
if (alignedSubsequence.deletionTag != NULL and (useqv & DeletionTag)) {
out << "\t" << qvTags[I_DeletionTag - 1] << ":Z:";
alignedSubsequence.PrintAsciiRichQuality(out, I_DeletionTag, 0);
}
}
void SupplementalQVList::clear()
{
for (int j = 0; j < nTags; j++) {
useqv &= 0 << j;
}
}
|