/usr/include/blasr/datastructures/alignment/FilterCriteria.hpp is in libblasr-dev 0~20151014+gitbe5d1bf-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | #ifndef _BLASR_FILTER_CRITERIA_HPP_
#define _BLASR_FILTER_CRITERIA_HPP_
#include <string>
#include <iostream>
#include <vector>
#include <algorithm> // transform
#include <ctype.h> // toupper
#include "AlignmentCandidate.hpp"
/// POSITIVE - larger score value is better.
/// NEGATIVE - smaller score value is better.
enum class ScoreSign {NEGATIVE=-1, POSITIVE=1};
static const std::string AS = "AS";
class Score {
public:
Score(const float & value, const ScoreSign & sign);
Score(const Score & another);
~Score();
/// \returns float score value in [0, 100]
float Value() const;
/// \returns score sign, NEGATIVE or POSITIVE
ScoreSign Sign() const;
bool operator == (const Score & another) const;
/// \returns true if this score value is better than another's.
bool BetterThan(const Score & another) const;
/// \returns true if this score value is better than or equal to another's.
bool BetterThanOrEqual(const Score & another) const;
/// \returns true if this score value is worse than another's.
bool WorseThan(const Score & another) const;
private:
float _value;
ScoreSign _sign;
static constexpr float errorunit = 1e-6;
};
class HitPolicy {
/// \name Hit Policy
/// \{
public:
/// \note Constructor
HitPolicy(const std::string & hitPolicyStr, const ScoreSign & sign);
~HitPolicy(void);
const std::string ToString() const;
std::ostream & operator << (std::ostream & os);
/// \returns score sign, NEGATIVE or POSITIVE
ScoreSign Sign() const;
/// \returns a help string describing hit policies.
const std::string Help(const std::string & pad = "") const;
/// \returns true if HitPolicy is RANDOM.
bool IsRandom() const;
/// \returns true if HitPolicy is RANDOMBEST.
bool IsRandombest() const;
/// \returns true if HitPolicy is ALL.
bool IsAll() const;
/// \returns true if HitPolicy is ALLBEST.
bool IsAllbest() const;
/// \returns true if HitPolicy is LEFTMOST.
bool IsLeftmost() const;
/// Apply hit policy on a list of AlignmentCandidate pointers.
/// \returns apply hit policy and return alignment candidate pointers.
/// \params createRand, call rand() to generate a random number
/// or use the random number passed from caller.
/// \params passedRand, random int passed from caller
std::vector<T_AlignmentCandidate*>
Apply(const std::vector<T_AlignmentCandidate*> alnPtrs,
const bool & createRand = true,
const int & passedRand = 0) const;
//std::vector<AlignmentCandidate<>> &
//Apply(std::vector<AlignmentCandidate<>> & records) const;
#ifdef USE_PBBAM
/// Compare aligned bamRecords by query names, scores and target positions.
bool compareByQNameScoreTStart(const PacBio::BAM::BamRecord & a,
const PacBio::BAM::BamRecord & b) const;
/// Compare aligned bamRecords by scores and target positions.
/// \note BamRecords must share the same query name.
bool compareByScoreTStart(const PacBio::BAM::BamRecord & a,
const PacBio::BAM::BamRecord & b) const;
std::vector<PacBio::BAM::BamRecord>
Apply(const std::vector<PacBio::BAM::BamRecord> & records,
const bool & createRand = true,
const int & passedRand = 0) const;
#endif
private:
enum class HitPolicyEnum{RANDOM, ALL, ALLBEST, RANDOMBEST, LEFTMOST};
HitPolicyEnum _hit;
ScoreSign _sign;
/// \}
};
class FilterCriteria {
/// \name FilterCriteria
/// \{
public:
FilterCriteria(const DNALength & minAlnLength,
const float & minPctSimilarity,
const float & minPctAccuracy,
const bool & useScore,
const Score & score);
~FilterCriteria(void);
bool MakeSane(std::string & errMsg) const;
void Verbose(bool verbose);
template<typename T_TSequence, typename T_QSequence>
bool Satisfy(AlignmentCandidate<T_TSequence, T_QSequence> * a) const;
#ifdef USE_PBBAM
bool Satisfy(const PacBio::BAM::BamRecord & record) const;
#endif
public:
/// \retuns a string describing criteria for filtering alignments.
// const std::string Help(const std::string & pad = "");
const std::string MinAlnLengthHelp();
const std::string MinPctSimilarityHelp();
const std::string MinPctAccuracyHelp();
const std::string ScoreSignHelp();
const std::string ScoreCutoffHelp();
private:
DNALength _minAlnLength;
float _minPctSimilarity;
float _minPctAccuracy;
bool _useScore;
Score _scoreCutoff;
bool _verbose;
bool Satisfy(const DNALength & alnLength,
const float & pctSimilarity,
const float & pctAccuracy,
const Score & score) const;
/// \}
};
template<typename T_TSequence, typename T_QSequence>
bool FilterCriteria::Satisfy(AlignmentCandidate<T_TSequence, T_QSequence> * a) const {
float pctAccuracy = 100 * a->nMatch / static_cast<float>(a->nMismatch
+ a->nMatch + a->nIns + a->nDel);
Score s(a->score, _scoreCutoff.Sign());
return Satisfy(a->qAlignedSeqLength, a->pctSimilarity, pctAccuracy, s);
}
#endif //_BLASR_FILTER_CRITERIA_HPP_
|