diff PsiCLASS-1.0.2/support.hpp @ 0:903fc43d6227 draft default tip

Uploaded
author lsong10
date Fri, 26 Mar 2021 16:52:45 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PsiCLASS-1.0.2/support.hpp	Fri Mar 26 16:52:45 2021 +0000
@@ -0,0 +1,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