1eb157e704df43fc4f530be034e7a934475c2b0b braney Fri Sep 9 11:26:06 2022 -0700 require at least one extra index of a chromAlias bigBed diff --git src/lib/bbiAlias.c src/lib/bbiAlias.c index d205773..7ccff95 100644 --- src/lib/bbiAlias.c +++ src/lib/bbiAlias.c @@ -1,120 +1,124 @@ #include "common.h" #include "bigBed.h" #include "bbiAlias.h" #include "bPlusTree.h" #include "obscure.h" #include "hash.h" struct slName *bbiAliasFindAliases(struct bbiFile *bbi, struct lm *lm, char *seqName) /* Find the aliases for a given seqName using the alias bigBed. */ { struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, seqName, 0, 1, 0, lm); char *bedRow[bbi->fieldCount]; char startBuf[16], endBuf[16]; struct slName *list = NULL; for (bb = bbList; bb != NULL; bb = bb->next) { bigBedIntervalToRow(bb, seqName, startBuf, endBuf, bedRow, ArraySize(bedRow)); int ii; for(ii=3; ii < bbi->fieldCount; ii++) { struct slName *name = newSlName(bedRow[ii]); slAddHead(&list, name); } } slReverse(&list); return list; } struct bptIndex *bbiAliasOpenExtra(struct bbiFile *bbi) /* Open any extra indices that this bigBed has. */ { struct bptIndex *bptList = NULL; struct slName *indexList = bigBedListExtraIndexes(bbi); + +if (indexList == NULL) + errAbort("chromAlias bigBed file %s has to have a least one extra index.", bbi->fileName); + for(; indexList; indexList = indexList->next) { struct bptIndex *bptIndex; AllocVar(bptIndex); bptIndex->bpt = bigBedOpenExtraIndex(bbi, indexList->name, &bptIndex->fieldIx); slAddHead(&bptList, bptIndex); } return bptList; } char *bbiAliasFindNative(struct bbiFile *bbi, struct bptIndex *bptIndex, struct lm *lm, char *alias) /* Find the native seqName for a given alias given a bigBed. */ { for(; bptIndex; bptIndex = bptIndex->next) { struct bigBedInterval *bb = bigBedNameQuery(bbi, bptIndex->bpt, bptIndex->fieldIx, alias, lm); if (bb != NULL) { char chromName[1024]; bptStringKeyAtPos(bbi->chromBpt, bb->chromId, chromName, sizeof(chromName)); return cloneString(chromName); } } return NULL; } unsigned bbiAliasChromSizeExt(struct bbiFile *bbi, struct bptIndex *bptIndex, struct lm *lm, char *chrom, struct hash *usedHash, int lineIx) /* Find the size of the given chrom in the given chromAlias bbi file. If this alias has been used before, complain and exit. */ { if (usedHash) { struct hashEl *hel; if ((hel = hashLookup(usedHash, chrom)) != NULL) { int previousLineIx = ptToInt(hel->val); errAbort("line %d: using a different alias for a previously seen name on line %d", lineIx, previousLineIx); } } struct bigBedInterval *bb = bigBedIntervalQuery(bbi, chrom, 0, 1, 0, lm); if (bb == NULL) { for(; bptIndex; bptIndex = bptIndex->next) { bb= bigBedNameQuery(bbi, bptIndex->bpt, bptIndex->fieldIx, chrom, lm); if (bb != NULL) break; } } char *bedRow[bbi->fieldCount]; char startBuf[16], endBuf[16]; if (bb != NULL) { int fieldCount = bigBedIntervalToRow(bb, chrom, startBuf, endBuf, bedRow, ArraySize(bedRow)); if (usedHash) { hashAddInt(usedHash, bedRow[0], lineIx); int ii; for (ii = 3; ii < fieldCount; ii++) hashAddInt(usedHash, bedRow[ii], lineIx); } // sequence size is the end address of the bigBed item int ret = atoi(endBuf); return ret; } return 0; } unsigned bbiAliasChromSize(struct bbiFile *bbi, struct bptIndex *bptIndex, struct lm *lm, char *chrom) /* Find the size of the given chrom in the given chromAlias bbi file. */ { return bbiAliasChromSizeExt(bbi, bptIndex, lm, chrom, NULL, 0); }