/***************************************************************************** # 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 "contig.h" #include "primerType.h" #include "consedParameters.h" #include "numutil.h" #include // for malloc using namespace std; #include "createPrimerCandidate.h" void createPrimerCandidates( Contig* pContigOfCursor, const int nPaddedConsPosOfCursor, const bool bForwardNotReversePrimer, primerType** ppPrimerArray, int& nNumberOfPrimers ) { int nUnpaddedPosOfCursor = pContigOfCursor->nUnpaddedIndex( nPaddedConsPosOfCursor ); int nMinUnpadded; int nMaxUnpadded; if (bForwardNotReversePrimer ) { nMaxUnpadded = nUnpaddedPosOfCursor - consedParameters::pGetConsedParameters()->nPrimersNumberOfBasesToBackUpToStartLooking_; if (nMaxUnpadded < pContigOfCursor->nGetUnpaddedStartIndex() ) { cout << "can't back up " << consedParameters::pGetConsedParameters()->nPrimersNumberOfBasesToBackUpToStartLooking_ << " so not backing up" << endl; nMaxUnpadded = nUnpaddedPosOfCursor; } nMinUnpadded = nMaxUnpadded - consedParameters::pGetConsedParameters()->nPrimersWindowSizeInLookingToUse_; nMinUnpadded = MAX( nMinUnpadded, pContigOfCursor->nGetUnpaddedStartIndex() ); } else { nMinUnpadded = nUnpaddedPosOfCursor + consedParameters::pGetConsedParameters()->nPrimersNumberOfBasesToBackUpToStartLooking_; if (nMinUnpadded + consedParameters::pGetConsedParameters()->nPrimersMinimumLengthOfAPrimerToUse_ > pContigOfCursor->nGetUnpaddedEndIndex() ) { cout << "can't move to the right " << consedParameters::pGetConsedParameters()->nPrimersNumberOfBasesToBackUpToStartLooking_ << " so not moving to right" << endl; nMinUnpadded = nUnpaddedPosOfCursor; } nMaxUnpadded = nMinUnpadded + consedParameters::pGetConsedParameters()->nPrimersWindowSizeInLookingToUse_; nMaxUnpadded = MIN( nMaxUnpadded, pContigOfCursor->nGetUnpaddedEndIndex() ); } if ( ! ( ( nMinUnpadded <= nMaxUnpadded ) && ( pContigOfCursor->nGetUnpaddedStartIndex() <= nMinUnpadded ) && ( nMaxUnpadded <= pContigOfCursor->nGetUnpaddedEndIndex() ) ) ) { cerr << "nMinUnpadded = " << nMinUnpadded << endl; cerr << "nMaxUnpadded = " << nMaxUnpadded << endl; cerr << "nUnpaddedPosOfCursor = " << nUnpaddedPosOfCursor << endl; cerr << "nPaddedPosOfCursor = " << nPaddedConsPosOfCursor << endl; cerr << "pContigOfCursor->nGetUnpaddedStartIndex() = " << pContigOfCursor->nGetUnpaddedStartIndex() << endl; cerr << "pContigOfCursor->nGetUnpaddedEndIndex() = " << pContigOfCursor->nGetUnpaddedEndIndex() << endl; cerr << "bForwardNotReversePrimer = " << ( bForwardNotReversePrimer ? "true" : "false" ) << endl; assert( false ); } assert( nMinUnpadded <= nMaxUnpadded ); assert( pContigOfCursor->nGetUnpaddedStartIndex() <= nMinUnpadded ); assert( nMaxUnpadded <= pContigOfCursor->nGetUnpaddedEndIndex() ); int nUnpaddedPositionsForPrimersToStart = nMaxUnpadded - nMinUnpadded + 1; nNumberOfPrimers = nUnpaddedPositionsForPrimersToStart * ( consedParameters::pGetConsedParameters()->nPrimersMaximumLengthOfAPrimerToUse_ - consedParameters::pGetConsedParameters()->nPrimersMinimumLengthOfAPrimerToUse_ + 1 ); primerType* pPrimerArray = (primerType*) malloc( sizeof( primerType ) * nNumberOfPrimers ); // cerr << "allocating " << sizeof( primerType ) * nNumberOfPrimers << // " bytes" << endl; assert( pPrimerArray ); *ppPrimerArray = pPrimerArray; // value to return int nPrimersSoFar = 0; for( int nUnpadded = nMinUnpadded; nUnpadded <= nMaxUnpadded; ++nUnpadded ) { for( int nLengthOfPrimer = consedParameters::pGetConsedParameters()->nPrimersMinimumLengthOfAPrimerToUse_; nLengthOfPrimer <= consedParameters::pGetConsedParameters()->nPrimersMaximumLengthOfAPrimerToUse_; ++nLengthOfPrimer ) { // for every end position, there must be a shortest primer // in order to do the matches to template and vector. // thus make sure there is a shortest primer ending at // nMaxUnpadded if ( nUnpadded + nLengthOfPrimer - 1 > nMaxUnpadded ) continue; primerType* pPrimer = pPrimerArray + nPrimersSoFar; createPrimerCandidate( pPrimer, nUnpadded, nLengthOfPrimer, bForwardNotReversePrimer, pContigOfCursor, nUnpaddedPosOfCursor ); ++nPrimersSoFar; } } assert( nPrimersSoFar <= nNumberOfPrimers ); nNumberOfPrimers = nPrimersSoFar; }