int addBam(const bam1_t *bam, void *data) /* bam_fetch() calls this on each bam alignment retrieved. Translate each bam * into a linkedFeatures item, and add it to tg->items. */ { struct bamTrackData *btd = (struct bamTrackData *)data; if (!passesFilters(bam, btd)) return 0; struct linkedFeatures *lf = bamToLf(bam, data); struct track *tg = btd->tg; slAddHead(&(tg->items), lf); return 0; }
void Discover::acceptRecords (QList<Record> records, bool removeThem, QString senderScope, QString senderAddress, QString senderPort) { // TODO // This function gets its own copy of records // This loop edits each item so it can be used after for (Record& record : records) { // Preprocess the record before considering it Record::decompressReserved(record); // Set the scope based on the address if included, otherwise scope of sender QHostAddress recordAddress; if (record.has("Address")) recordAddress.setAddress(record["Address"]); if (recordAddress.protocol()!=QAbstractSocket::IPv4Protocol) recordAddress = QHostAddress::Null; if (recordAddress==QHostAddress::Broadcast) recordAddress = QHostAddress::Null; if (recordAddress==QHostAddress::AnyIPv4) recordAddress = QHostAddress::Null; if (recordAddress.isNull()) { record["Scope"] = senderScope; } else { if (recordAddress.isLoopback()) record["Scope"] = "Loopback"; else if (addressIsLocal(recordAddress)) record["Scope"] = "Local"; else record["Scope"] = "Global"; } if (record["Address"].isEmpty()) record["Address"] = senderAddress; // Sender may override these if (record["Port"].isEmpty()) record["Port"] = senderPort; // Sender may override these // TODO Extract a custom expiration duration so each record can have its own if (removeThem) { // See if it's new if (foundRecords.contains(record)) { logDebug(QString("Record Departed: %1").arg(record.toString())); foundRecords.remove(record); emit recordLost(record); } } else { // See if it's new if (not foundRecords.contains(record) and passesFilters(record)) { logDebug(QString("Found Record: %1").arg(record.toString())); emit recordFound(record); } // Reset the timer foundRecords[record] = QDateTime::currentMSecsSinceEpoch() + 2500; // Set the expire time } expireTimer->start(0); // In case the next expiration time was changed } // Server: Forward global departures to other global peers if (mServerMode and removeThem and senderScope == "Global") { QByteArray datagram("DSDD"); datagram += makeDatagram(records, false); for (Record& record : foundRecords.keys()) if (record["Scope"] == "Global") { bool ok; globalSocket->writeDatagram(datagram, QHostAddress(record["Address"]), record["Port"].toUInt(&ok, 10)); } } }
int addBamPaired(const bam1_t *bam, void *data) #endif /* bam_fetch() calls this on each bam alignment retrieved. Translate each bam * into a linkedFeaturesSeries item, and either store it until we find its mate * or add it to tg->items. */ { const bam1_core_t *core = &bam->core; struct bamTrackData *btd = (struct bamTrackData *)data; if (! passesFilters(bam, btd)) return 0; struct linkedFeatures *lf = bamToLf(bam, data); struct track *tg = btd->tg; if (!(core->flag & BAM_FPAIRED) || (core->flag & BAM_FMUNMAP)) { if (lf->start < winEnd && lf->end > winStart) slAddHead(&(tg->items), lfsFromLf(lf)); if ((core->flag & BAM_FMUNMAP) && sameString(btd->colorMode, BAM_COLOR_MODE_GRAY) && sameString(btd->grayMode, BAM_GRAY_MODE_UNPAIRED)) // not properly paired: make it a lighter shade. lf->grayIx -= 4; } else { struct linkedFeatures *lfMate = (struct linkedFeatures *)hashFindVal(btd->pairHash, lf->name); if (lfMate == NULL) { if (core->flag & BAM_FPROPER_PAIR) { // If we know that this is properly paired, but don't have the mate, // make a bogus item off the edge of the window so that if we don't // encounter its mate later, we can at least draw an arrow off the // edge of the window. struct linkedFeatures *stub; // don't link to pair that's not on the same chrom if ((core->mpos < 0) || (core->tid != core->mtid)) { int offscreen; if (lf->orientation > 0) offscreen = max(winEnd, lf->end) + 10; else offscreen = min(winStart, lf->start) - 10; if (offscreen < 0) offscreen = 0; stub = lfStub(offscreen, -lf->orientation); } else { stub = lfStub(core->mpos, -lf->orientation); } lf->next = stub; } else if (sameString(btd->colorMode, BAM_COLOR_MODE_GRAY) && sameString(btd->grayMode, BAM_GRAY_MODE_UNPAIRED)) // not properly paired: make it a lighter shade. lf->grayIx -= 4; hashAdd(btd->pairHash, lf->name, lf); } else { lfMate->next = lf; if (min(lfMate->start, lf->start) < winEnd && max(lfMate->end, lf->end) > winStart) slAddHead(&(tg->items), lfsFromLf(lfMate)); hashRemove(btd->pairHash, lf->name); } } return 0; }