1 #ifndef CSAMRECORDS__HPP 2 #define CSAMRECORDS__HPP 3 4 #include "csam.hpp" 5 #include "ctranscript.hpp" 6 #include <util/range.hpp> 7 8 BEGIN_OLIGOFAR_SCOPES 9 10 class CSamRecord : public CSamBase 11 { 12 public: 13 typedef TTrSequence TCigar; 14 typedef unsigned short TFlags; 15 typedef unsigned char TMapQ; 16 typedef int TPos; // 29 bits in SAM 1.2 17 typedef int TOff; // 29 bits in SAM 1.2 18 typedef CRange<int> TRange; 19 typedef map<string,string> TTags; 20 GetQName() const21 const char * GetQName() const { return m_qname; } GetRName() const22 const char * GetRName() const { return m_rname; } GetFlags() const23 TFlags GetFlags() const { return m_flags; } GetMapQual() const24 TMapQ GetMapQual() const { return m_mapq; } GetPos() const25 TPos GetPos() const { return m_pos; } GetImprovedCigar() const26 const TCigar& GetImprovedCigar() const { return m_cigar; } 27 TCigar GetBasicCigar() const; // is generated from m_cigar 28 const char * GetMateRefName() const; // should be 'refname' (for '=') or '' (for '*') in this implementation, and not '' ONLY for paired hits GetMatePos() const29 TPos GetMatePos() const { return m_mpos; } GetInsertSize() const30 TOff GetInsertSize() const { return m_isize; } GetQueryIupac() const31 const char * GetQueryIupac() const { return m_qiupac; } GetQueryQual() const32 const char * GetQueryQual() const { return m_qqual; } 33 HasTags() const34 bool HasTags() const { return m_tags && m_tags->size(); } GetTags() const35 const TTags& GetTags() const { return *m_tags; } 36 ESamTagType GetTagType( const string& tname ) const; 37 string GetTagString( const string& name ) const; 38 int GetTagInt( const string& name ) const; 39 float GetTagFloat( const string& name ) const; 40 41 void DropTag( const string& name ); 42 void SetTagString( const string& name, const string& val ); 43 void SetTagInt( const string& name, int val ); 44 void SetTagFloat( const string& name, float val ); 45 IsPairedRead() const46 bool IsPairedRead() const { return m_flags & fPairedQuery; } IsPairedHit() const47 bool IsPairedHit() const { return m_flags & fPairedHit; } GetComponent() const48 int GetComponent() const { return m_flags & fSeqIsSecond ? 1 : 0; } IsUnmapped() const49 bool IsUnmapped() const { return m_flags & fSeqUnmapped; } IsReverse() const50 bool IsReverse() const { return m_flags & fSeqReverse; } IsNull() const51 bool IsNull() const { return m_qname == 0 || *m_qname == 0; } 52 53 TRange GetQryBounding() const; 54 TRange GetRefBounding() const; 55 56 bool IsQueryMateOf( const CSamRecord& other ) const; 57 bool IsHitMateOf( const CSamRecord& other ) const; 58 59 void WriteAsSam( ostream& out, bool basic = false ) const; 60 CSamRecord(); 61 CSamRecord( const string& samline ); 62 CSamRecord( const CSamRecord& other ); 63 ~CSamRecord(); 64 65 CSamRecord& operator = ( const CSamRecord& other ); 66 67 void SetNull(); 68 void Init( const string& line ); 69 void InitUnmapped( const string& qname, TFlags flags, const string& seq, const string& qual = "" ); 70 void InitSingleHit( const string& qname, TFlags flags, const string& rname, TPos pos, TMapQ mapq, const TCigar& cigar, const string& seq, const string& qual = "" ); 71 void InitPairedHit( const string& qname, TFlags flags, const string& rname, TPos pos, TMapQ mapq, const TCigar& cigar, TPos mpos, TOff isize, 72 const string& seq, const string& qual = "" ); 73 GetFlags(TFlags mask) const74 TFlags GetFlags( TFlags mask ) const { return m_flags & mask; } SetFlags(TFlags mask,bool on=true)75 void SetFlags( TFlags mask, bool on = true ) { if( on ) m_flags |= mask; else m_flags &= ~mask; } IsSetAnyFlag(TFlags mask) const76 bool IsSetAnyFlag( TFlags mask ) const { return m_flags & mask; } AreSetAllFlags(TFlags mask) const77 bool AreSetAllFlags( TFlags mask ) const { return (m_flags & mask) == mask; } FlagsEqual(TFlags value,TFlags mask=~TFlags (0)) const78 bool FlagsEqual( TFlags value, TFlags mask = ~TFlags(0) ) const { return (m_flags & mask) == (value & mask); } 79 ComputeScore(double id=1,double mm=-1,double go=-3,double ge=-1.5) const80 double ComputeScore( double id = 1, double mm = -1, double go = -3, double ge = -1.5 ) const 81 { return ComputeScore( m_cigar, id, mm, go, ge ); } 82 static double ComputeScore( const TCigar& cigar, double id = 1, double mm = -1, double go = -3, double ge = -1.5 ); 83 SetSingle()84 void SetSingle() { m_flags &= ~fPairedHit; m_mpos = m_isize = 0; } 85 void SetPaired( CSamRecord& other ); 86 protected: 87 void x_InitStrings( const char * qname, int qnlen, const char * rname, int rnlen, const char * iupac, int iulen, const char * qual, int qlen ); 88 void x_InitStrings( const char * qname, const char * rname, const char * iupac, const char * qual ); 89 void x_InitStrings( const string& qname, const string& rname, const string& iupac, const string& qual ); 90 91 protected: 92 char * m_qname; 93 char * m_rname; 94 char * m_qiupac; 95 char * m_qqual; 96 TFlags m_flags; 97 TMapQ m_mapq; 98 TPos m_pos; 99 TPos m_mpos; 100 TOff m_isize; 101 TCigar m_cigar; 102 TTags * m_tags; 103 }; 104 105 class CSamMdParser : public CTrBase 106 { 107 public: 108 typedef CSamRecord::TCigar TCigar; CSamMdParser(const TCigar & cigar,const string & mdtag)109 CSamMdParser( const TCigar& cigar, const string& mdtag ) 110 : m_cigar( cigar ), m_mdtag( mdtag ), m_current( cigar.begin() ) {} 111 TCigar GetFullCigar(); GetCount() const112 int GetCount() const { return m_ccount; } GetEvent() const113 EEvent GetEvent() const { return m_cevent; } NextEvent()114 EEvent NextEvent() { 115 if( m_current == m_cigar.end() ) return m_cevent = eEvent_NULL; 116 --m_ccount; 117 if( m_ccount == 0 ) { 118 if( ++m_current == m_cigar.end() ) return m_cevent = eEvent_NULL; 119 else { 120 m_ccount = m_current->GetCount(); 121 return m_cevent = m_current->GetEvent(); 122 } 123 } else return m_cevent; 124 } 125 protected: 126 const TCigar& m_cigar; 127 const string& m_mdtag; 128 TCigar::const_iterator m_current; 129 const char * m_mdptr; 130 EEvent m_cevent; 131 int m_ccount; 132 int m_mcount; 133 }; 134 135 END_OLIGOFAR_SCOPES 136 137 #endif 138