Mercurial > repos > lsong10 > psiclass
view 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 source
// 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