void ReadContainer::addUpstreamRead ( const Genome& genome, const chr_num_t chr, const chr_pos_t pos ) { assume(pos <= 0, "3' ends need to be given as negative numbers!"); int ipos = pos - 1; // fix difference in one-based offsets auto upstr = genome.getReadAt(chr, ipos); // 3' ends are linked at negative indices if (upstr != nullptr) { // check if this is a multistrand splice junction if (genome.multistrand != nullptr && (upstr->chromosome != chromosome || (upstr->flags & MULTISTRAND) == MULTISTRAND)) { upstr->flags |= MULTISTRAND; flags |= MULTISTRAND; genome.multistrand->insert(shared_from_this()); genome.multistrand->insert(upstr); } int link = findLink(upstr, false); // search link upstr <= this int backLink = upstr->findLink(shared_from_this()); // search link upstr => this if (link == -1) { // upstr <= this unknown yet fivePrimeRead->push_back(upstr); } if (backLink >= 0) { // upstr => this known upstr->threePrimeRefs->at(backLink)++; } else { // upstr => this new upstr->threePrimeRead->push_back(shared_from_this()); upstr->threePrimeRefs->push_back(1); } } }
void ReadContainer::addDownstreamRead ( const Genome& genome, const chr_num_t chr, const chr_pos_t pos ) { auto dnstr = genome.getReadAt(chr, pos); if (dnstr != nullptr) { // check if this is a multistrand splice junction if (dnstr->chromosome != chromosome && !(dnstr->flags & MULTISTRAND) ) { flags |= MULTISTRAND; genome.multistrand->insert(shared_from_this()); // adding one multistrand seed suffices } int link = findLink(dnstr); // search link this => dnstr int backLink = dnstr->findLink(shared_from_this(), false); // search link this <= dnstr if (link == -1) { // this => dnstr unknown yet threePrimeRead->push_back(dnstr); threePrimeRefs->push_back(1); } else { // this => dnstr known threePrimeRefs->at(link)++; } if (backLink == -1) { // this <= dnstr unknown yet dnstr->fivePrimeRead->push_back(shared_from_this()); } } }