00001 #ifndef GPIPE_COMMON___ALIGN_FILTER__HPP
00002 #define GPIPE_COMMON___ALIGN_FILTER__HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <corelib/ncbiobj.hpp>
00036 #include <util/qparse/query_parse.hpp>
00037
00038 #include <objects/seq/seq_id_handle.hpp>
00039
00040 #include <set>
00041
00042 BEGIN_NCBI_SCOPE
00043 BEGIN_SCOPE(objects)
00044 class CSeq_align;
00045 class CSeq_align_set;
00046 class CSeq_annot;
00047 class CScope;
00048 END_SCOPE(objects)
00049
00050
00051 class CAlignFilter : public CObject
00052 {
00053 public:
00054 CAlignFilter();
00055 CAlignFilter(const string& filter_string);
00056
00057
00058 void SetFilter(const string& filter_string);
00059
00060
00061
00062 void SetScope(objects::CScope& scope);
00063 objects::CScope& SetScope();
00064
00065
00066
00067
00068 CAlignFilter& SetRemoveDuplicates(bool b = true);
00069
00070
00071
00072
00073
00074
00075
00076
00077 void AddBlacklistQueryId(const objects::CSeq_id_Handle& idh);
00078 void AddBlacklistSubjectId(const objects::CSeq_id_Handle& idh);
00079
00080
00081
00082
00083
00084
00085
00086 void AddWhitelistQueryId(const objects::CSeq_id_Handle& idh);
00087 void AddWhitelistSubjectId(const objects::CSeq_id_Handle& idh);
00088
00089
00090 bool Match(const objects::CSeq_align& align);
00091
00092
00093
00094 void Filter(const list< CRef<objects::CSeq_align> >& aligns_in,
00095 list< CRef<objects::CSeq_align> >& aligns_out);
00096
00097
00098
00099 void Filter(const objects::CSeq_align_set& aligns_in,
00100 objects::CSeq_align_set& aligns_out);
00101
00102
00103
00104 void Filter(const objects::CSeq_annot& aligns_in,
00105 objects::CSeq_annot& aligns_out);
00106
00107 private:
00108 bool x_Match(const CQueryParseTree::TNode& node,
00109 const objects::CSeq_align& align);
00110
00111 bool x_IsUnique(const objects::CSeq_align& align);
00112
00113 double x_GetAlignmentScore(const string& score_name,
00114 const objects::CSeq_align& align);
00115
00116 bool x_Query_Op(const CQueryParseTree::TNode& key_node,
00117 CQueryParseNode::EType type,
00118 bool is_not,
00119 const CQueryParseTree::TNode& val_node,
00120 const objects::CSeq_align& align);
00121
00122 double x_FuncCall(const CQueryParseTree::TNode& func_node,
00123 const objects::CSeq_align& align);
00124 double x_TermValue(const CQueryParseTree::TNode& term_node,
00125 const objects::CSeq_align& align);
00126
00127 bool x_Query_Range(const CQueryParseTree::TNode& key_node,
00128 bool is_not,
00129 const CQueryParseTree::TNode& val1_node,
00130 const CQueryParseTree::TNode& val2_node,
00131 const objects::CSeq_align& align);
00132
00133 private:
00134 bool m_RemoveDuplicates;
00135 string m_Query;
00136 auto_ptr<CQueryParseTree> m_ParseTree;
00137
00138 CRef<objects::CScope> m_Scope;
00139
00140 set<objects::CSeq_id_Handle> m_QueryBlacklist;
00141 set<objects::CSeq_id_Handle> m_QueryWhitelist;
00142 set<objects::CSeq_id_Handle> m_SubjectBlacklist;
00143 set<objects::CSeq_id_Handle> m_SubjectWhitelist;
00144
00145 typedef set<string> TUniqueAligns;
00146 TUniqueAligns m_UniqueAligns;
00147 };
00148
00149
00150
00151 END_NCBI_SCOPE
00152
00153
00154 #endif // GPIPE_COMMON___ALIGN_FILTER__HPP
00155
00156