static void joinUnitigs_append(UnitigVector &unitigs, joinEntry *join) { uint32 frId = Unitig::fragIn(join->frFragID); uint32 toId = Unitig::fragIn(join->toFragID); Unitig *fr = unitigs[frId]; Unitig *to = unitigs[toId]; uint32 frIdx = Unitig::pathPosition(join->frFragID); uint32 toIdx = Unitig::pathPosition(join->toFragID); // The 'fr' unitig is assumed to be forward, and assumed to be the one we join to. // Compute the offset for our append. We just need to compute where the join fragment would // appear in the unitig. The join fragment MUST be the first thing in the frUnitig. //int32 offset = MIN(frF.position.bgn, frF.position.end); // Over all fragments in the frUnitig, add them to either the joinUnitig or the discUnitig. Unitig *joinUnitig = unitigs.newUnitig(false); Unitig *discUnitig = unitigs.newUnitig(false); // Reverse the 'to' unitig if needed. if (join->toFlip) to->reverseComplement(true); // If we're joining off the 5' end of the fr untiig, add the to reads first. if (join->frFirst == true) { uint32 ii=0; for (; ii < toIdx; ii++) joinUnitig->addFrag(to->ufpath[ii], 0, false); for (; ii < to->ufpath.size(); ii++) discUnitig->addFrag(to->ufpath[ii], 0, false); } // Now add all the fr unitig reads. for (uint32 ii=0; ii < fr->ufpath.size(); ii++) joinUnitig->addFrag(to->ufpath[ii], 0, false); // If we're not joining off the 5' end, add the to unitig reads last. if (join->frFirst == false) { uint32 ii = 0; for (; ii < toIdx; ii++) discUnitig->addFrag(to->ufpath[ii], 0, false); for (; ii < to->ufpath.size(); ii++) joinUnitig->addFrag(to->ufpath[ii], 0, false); } // Delete the donor unitigs. delete fr; delete to; unitigs[frId] = NULL; unitigs[toId] = NULL; // And make sure the new unitigs are consistent. joinUnitig->sort(); discUnitig->sort(); }