void AlignChime3SDRealign(const SeqData &QSD3, const SeqData &ASD3, const SeqData &BSD3, ChimeHit2 &Hit) { SeqData QSD; SeqData ASD; SeqData BSD; StripGapsAlloc(QSD3, QSD); StripGapsAlloc(ASD3, ASD); StripGapsAlloc(BSD3, BSD); string PathQA; string PathQB; bool FoundQA = GlobalAlign(QSD, ASD, PathQA); bool FoundQB = GlobalAlign(QSD, BSD, PathQB); if (!FoundQA || !FoundQB) { Hit.Clear(); Hit.QLabel = QSD3.Label; return; } AlignChime(QSD, ASD, BSD, PathQA, PathQB, Hit); myfree((void *) QSD.Seq); myfree((void *) ASD.Seq); myfree((void *) BSD.Seq); }
SCORE AlignTwoMSAs(const MSA &msa1, const MSA &msa2, MSA &msaOut, PWPath &Path, bool bLockLeft, bool bLockRight) { const unsigned uLengthA = msa1.GetColCount(); const unsigned uLengthB = msa2.GetColCount(); ProfPos *PA = ProfileFromMSA(msa1); ProfPos *PB = ProfileFromMSA(msa2); if (bLockLeft) { PA[0].m_scoreGapOpen = MINUS_INFINITY; PB[0].m_scoreGapOpen = MINUS_INFINITY; } if (bLockRight) { PA[uLengthA-1].m_scoreGapClose = MINUS_INFINITY; PB[uLengthB-1].m_scoreGapClose = MINUS_INFINITY; } float r = (float) uLengthA/ (float) (uLengthB + 1); // +1 to prevent div 0 if (r < 1) r = 1/r; SCORE Score = GlobalAlign(PA, uLengthA, PB, uLengthB, Path); AlignTwoMSAsGivenPath(Path, msa1, msa2, msaOut); delete[] PA; delete[] PB; return Score; }
SCORE GlobalAlignNoDiags(const ProfPos *PA, unsigned uLengthA, const ProfPos *PB, unsigned uLengthB, PWPath &Path) { return GlobalAlign(PA, uLengthA, PB, uLengthB, Path); }