/***************************************************************************** # Copyright (C) 1994-2008 by David Gordon. # All rights reserved. # # This software is part of a beta-test version of the Consed/Autofinish # package. It should not be redistributed or # used for any commercial purpose, including commercially funded # sequencing, without written permission from the author and the # University of Washington. # # This software is provided ``AS IS'' and any express or implied # warranties, including, but not limited to, the implied warranties of # merchantability and fitness for a particular purpose, are disclaimed. # In no event shall the authors or the University of Washington be # liable for any direct, indirect, incidental, special, exemplary, or # consequential damages (including, but not limited to, procurement of # substitute goods or services; loss of use, data, or profits; or # business interruption) however caused and on any theory of liability, # whether in contract, strict liability, or tort (including negligence # or otherwise) arising in any way out of the use of this software, even # if advised of the possibility of such damage. # # Building Consed from source is error prone and not simple which is # why I provide executables. Due to time limitations I cannot # provide any assistance in building Consed. Even if you do not # modify the source, you may introduce errors due to using a # different version of the compiler, a different version of motif, # different versions of other libraries than I used, etc. For this # reason, if you discover Consed bugs, I can only offer help with # those bugs if you first reproduce those bugs with an executable # provided by me--not an executable you have built. # # Modifying Consed is also difficult. Although Consed is modular, # some modules are used by many other modules. Thus making a change # in one place can have unforeseen effects on many other features. # It may takes months for you to notice these other side-effects # which may not seen connected at all. It is not feasable for me to # provide help with modifying Consed sources because of the # potentially huge amount of time involved. # #*****************************************************************************/ #include "bForwardReversePairIsConsistentWithContigOrder.h" #include "locatedFragment.h" #include "contig.h" #include "assert.h" #include "fwdRevPair2.h" // note that this will only work if // Contig::bThisContigIsComplementedInTheScaffold_ and // Contig::nClonePosLeft_ are set. Former is set by // calling Assembly :: figureOutContigOrderAndOrientation() and // the latter by Assembly::getScaffoldBases bool bForwardReversePairIsConsistentWithContigOrder( LocatedFragment* pForwardLocFrag, LocatedFragment* pReverseLocFrag, char& cProblem ) { // this is not what we are checking if ( pForwardLocFrag->pGetContig() == pReverseLocFrag->pGetContig() ) return( true ); // this is also not what we are checking if ( pForwardLocFrag->pGetContig()->nScaffold_ != pReverseLocFrag->pGetContig()->nScaffold_ ) return( true ); LocatedFragment* pLeftLocFrag; LocatedFragment* pRightLocFrag; if ( pForwardLocFrag->pGetContig()->nClonePosLeft_ < pReverseLocFrag->pGetContig()->nClonePosLeft_ ) { pLeftLocFrag = pForwardLocFrag; pRightLocFrag = pReverseLocFrag; } else { pLeftLocFrag = pReverseLocFrag; pRightLocFrag = pForwardLocFrag; } // if reached here, the reads are in different contigs within the // same scaffold. Make sure they are pointing towards each other // within the scaffold. bool bLeftLocFragPointsRight; bool bRightLocFragPointsRight; if ( pLeftLocFrag->bComp() ) bLeftLocFragPointsRight = false; else bLeftLocFragPointsRight = true; if ( pRightLocFrag->bComp() ) bRightLocFragPointsRight = false; else bRightLocFragPointsRight = true; if ( pLeftLocFrag->pGetContig()->bThisContigIsComplementedInTheScaffold_ ) bLeftLocFragPointsRight = !bLeftLocFragPointsRight; if ( pRightLocFrag->pGetContig()->bThisContigIsComplementedInTheScaffold_ ) bRightLocFragPointsRight = !bRightLocFragPointsRight; if ( bLeftLocFragPointsRight && bRightLocFragPointsRight ) { cProblem = fwdRevPair2::cBOTH_POINT_RIGHT; return( false ); } else if ( !bLeftLocFragPointsRight && !bRightLocFragPointsRight ) { cProblem = fwdRevPair2::cBOTH_POINT_LEFT; return( false ); } else if ( !bLeftLocFragPointsRight && bRightLocFragPointsRight ) { cProblem = fwdRevPair2::cPOINT_AWAY_FROM_EACH_OTHER; return( false ); } else if ( bLeftLocFragPointsRight && !bRightLocFragPointsRight ) { return( true ); } else assert( false ); }