forked from splicebox/PsiCLASS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
support.hpp
171 lines (140 loc) · 3.21 KB
/
support.hpp
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
166
167
168
169
170
171
// The class that deals the number of alignments supporting blocks or edges
#ifndef _LSONG_RSCAF_SUPPORT_HEADER
#define _LSONG_RSCAF_SUPPORT_HEADER
extern int minimumSupport ;
class Support
{
private:
int uniqSupport ;
int multiSupport ;
int plusSupport ;
int minusSupport ;
int clipSupport ;
int nmSum ;
double multiSupportCoefficient ;
int64_t leftPos, rightPos ;
int coordCnt ; // Record how many coordinates showed up.
int64_t prevCoord ;
public:
Support()
{
uniqSupport = multiSupport = 0 ;
plusSupport = minusSupport = 0 ;
leftPos = rightPos = -1 ;
multiSupportCoefficient = 1.0 ;
nmSum = 0 ;
coordCnt = 0 ;
prevCoord = -1 ;
}
~Support()
{
}
void Add( Alignments &align, bool ignoreCoord = false )
{
if ( align.IsUnique() )
++uniqSupport ;
else
++multiSupport ;
int strand = align.GetStrand() ;
if ( strand == 1 )
++plusSupport ;
else if ( strand == -1 )
++minusSupport ;
int nm = align.GetFieldI( "NM" ) ;
if ( nm >= 0 )
nmSum += nm ;
if ( !ignoreCoord )
{
if ( leftPos == -1 || align.segments[0].a < leftPos )
leftPos = align.segments[0].a ;
if ( align.segments[ align.segCnt - 1 ].b > rightPos )
rightPos = align.segments[ align.segCnt - 1 ].b ;
if ( align.segments[0].a != prevCoord ) // This makes sense when the coordinates are sorted
++coordCnt ;
else if ( align.GetFieldZ( "SA" ) != NULL )
++coordCnt ;
prevCoord = align.segments[0].a ;
}
}
void Add( Support &in )
{
uniqSupport += in.uniqSupport ;
multiSupport += in.multiSupport ;
plusSupport += in.plusSupport ;
minusSupport += in.minusSupport ;
nmSum += in.nmSum ;
if ( in.leftPos != -1 && ( leftPos == -1 || in.leftPos < leftPos ) )
leftPos = in.leftPos ;
if ( in.rightPos > rightPos )
rightPos = in.rightPos ;
prevCoord = prevCoord > in.prevCoord ? prevCoord : in.prevCoord ;
coordCnt += in.coordCnt ;
}
bool IsGood()
{
if ( uniqSupport < 0.1 * ( uniqSupport + multiSupport ) || uniqSupport == 0 )
return false ;
if ( nmSum / ( uniqSupport + multiSupport ) >= 2.5 )
return false ;
return true ;
}
bool IsUnique()
{
if ( uniqSupport < 0.95 * ( uniqSupport + multiSupport ) )
return false ;
return true ;
}
int GetCount()
{
return (int)( uniqSupport + multiSupportCoefficient * multiSupport + 1e-6) ;
}
int GetUniqCount()
{
return uniqSupport ;
}
int GetStrand()
{
if ( plusSupport == minusSupport )
return 0 ;
else if ( plusSupport > minusSupport )
return 1 ;
else
return -1 ;
}
int GetLeftMostPos()
{
return leftPos ;
}
int GetRightMostPos()
{
return rightPos ;
}
int GetCoordCnt()
{
return coordCnt ;
}
void operator=( const Support &in )
{
uniqSupport = in.uniqSupport ;
multiSupport = in.multiSupport ;
plusSupport = in.plusSupport ;
minusSupport = in.minusSupport ;
nmSum = in.nmSum ;
leftPos = in.leftPos ;
rightPos = in.rightPos ;
multiSupportCoefficient = in.multiSupportCoefficient ;
prevCoord = in.prevCoord ;
coordCnt = in.coordCnt ;
}
void Clear()
{
uniqSupport = multiSupport = 0 ;
plusSupport = minusSupport = 0 ;
nmSum = 0 ;
leftPos = rightPos = -1 ;
multiSupportCoefficient = 1.0 ;
coordCnt = 0 ;
prevCoord = -1 ;
}
} ;
#endif