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