4898794edd81be5285ea6e544acbedeaeb31bf78 max Tue Nov 23 08:10:57 2021 -0800 Fixing pointers to README file for license in all source code files. refs #27614 diff --git src/hg/oneShot/bwTestRead/bwTestRead.c src/hg/oneShot/bwTestRead/bwTestRead.c index 10c273b..99d23b2 100644 --- src/hg/oneShot/bwTestRead/bwTestRead.c +++ src/hg/oneShot/bwTestRead/bwTestRead.c @@ -1,240 +1,240 @@ /* bwTestRead - Test scan and search side of bigWig.. */ /* Copyright (C) 2011 The Regents of the University of California - * See README in this or parent directory for licensing information. */ + * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "options.h" #include "sig.h" #include "sqlNum.h" #include "bPlusTree.h" #include "cirTree.h" #include "bwgInternal.h" #include "bigWig.h" void usage() /* Explain usage and exit. */ { errAbort( "bwTestRead - Test scan and search side of bigWig.\n" "usage:\n" " bwTestRead file.bw chrom start end\n" "options:\n" " -xxx=XXX\n" ); } static struct optionSpec options[] = { {NULL, 0}, }; void bptDumpCallback(void *context, void *key, int keySize, void *val, int valSize) { char *keyString = cloneStringZ(key, keySize); bits32 *pVal = val; printf("%s:%d:%u\n", keyString, valSize, *pVal); freeMem(keyString); } struct bigWigFileZoomLevel /* A zoom level in bigWig file. */ { struct bigWigFileZoomLevel *next; /* Next in list. */ bits32 reductionLevel; /* How many bases per item */ bits32 reserved; /* Zero for now. */ bits64 dataOffset; /* Offset of data for this level in file. */ bits64 indexOffset; /* Offset of index for this level in file. */ }; struct bigWigFile /* An open bigWigFile */ { struct bigWigFile *next; /* Next in list. */ char *fileName; /* Name of file - for better error reporting. */ FILE *f; /* Open file handle. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ struct bptFile *chromBpt; /* Index of chromosomes. */ bits32 zoomLevels; /* Number of zoom levels. */ bits64 chromTreeOffset; /* Offset to chromosome index. */ bits64 unzoomedDataOffset; /* Start of unzoomed data. */ bits64 unzoomedIndexOffset; /* Start of unzoomed index. */ struct bigWigFileZoomLevel *levelList; /* List of zoom levels. */ }; struct bigWigFile *bigWigFileOpen(char *fileName) /* Open up big wig file. */ { struct bigWigFile *bwf; AllocVar(bwf); bwf->fileName = cloneString(fileName); FILE *f = bwf->f = mustOpen(fileName, "rb"); /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = bwf->isSwapped = FALSE; mustReadOne(f, magic); if (magic != bigWigSig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != bigWigSig) errAbort("%s is not a bigWig file", fileName); } /* Read rest of defined bits of header, byte swapping as needed. */ bwf->zoomLevels = readBits32(f, isSwapped); bwf->chromTreeOffset = readBits64(f, isSwapped); bwf->unzoomedDataOffset = readBits64(f, isSwapped); bwf->unzoomedIndexOffset = readBits64(f, isSwapped); /* Skip over reserved area. */ fseek(f, 32, SEEK_CUR); /* Read zoom headers. */ int i; struct bigWigFileZoomLevel *level, *levelList = NULL; for (i=0; i<bwf->zoomLevels; ++i) { AllocVar(level); level->reductionLevel = readBits32(f, isSwapped); level->reserved = readBits32(f, isSwapped); level->dataOffset = readBits64(f, isSwapped); level->indexOffset = readBits64(f, isSwapped); slAddHead(&levelList, level); } slReverse(&levelList); bwf->levelList = levelList; /* Attach B+ tree of chromosome names and ids. */ bwf->chromBpt = bptFileAttach(fileName, f); return bwf; } void bigWigBlockDump(struct bigWigFile *bwf, char *chrom, FILE *out) /* Print out info on block starting at current position. */ { boolean isSwapped = bwf->isSwapped; FILE *f = bwf->f; bits32 chromId = readBits32(f, isSwapped); bits32 start = readBits32(f, isSwapped); bits32 end = readBits32(f, isSwapped); bits32 itemStep = readBits32(f, isSwapped); bits32 itemSpan = readBits32(f, isSwapped); UBYTE type = getc(f); UBYTE reserved8 = getc(f); bits16 itemCount = readBits16(f, isSwapped); bits16 i; float val; switch (type) { case bwgTypeBedGraph: { fprintf(out, "#bedGraph section %s:%u-%u\n", chrom, start, end); for (i=0; i<itemCount; ++i) { bits32 start = readBits32(f, isSwapped); bits32 end = readBits32(f, isSwapped); mustReadOne(f, val); fprintf(out, "%s\t%u\t%u\t%g\n", chrom, start, end, val); } break; } case bwgTypeVariableStep: { fprintf(out, "variableStep chrom=%s span=%u\n", chrom, itemSpan); for (i=0; i<itemCount; ++i) { bits32 start = readBits32(f, isSwapped); mustReadOne(f, val); fprintf(out, "%u\t%g\n", start+1, val); } break; } case bwgTypeFixedStep: { fprintf(out, "fixedStep chrom=%s start=%u step=%u span=%u\n", chrom, start, itemStep, itemSpan); for (i=0; i<itemCount; ++i) { mustReadOne(f, val); fprintf(out, "%g\n", val); } break; } default: internalErr(); break; } } struct bigWigView /* A view (particular zoom level, etc) within a bigWigFile. */ { struct bigWigView *next; /* Next in list. */ struct bigWigFile *file; /* Associated bigWigFile. */ struct cirTreeFile *index; /* Index of items in view. */ }; struct bigWigView *bigWigViewOpen(struct bigWigFile *bwf, float zoomLevel) /* Open up a view at given zoom level. */ { struct bigWigView *view; AllocVar(view); view->file = bwf; fseek(bwf->f, bwf->unzoomedIndexOffset, SEEK_SET); view->index = cirTreeFileAttach(bwf->fileName, bwf->f); return view; } void bigWigViewClose(struct bigWigView **pView) /* Close down view. */ { struct bigWigView *view = *pView; if (view != NULL) { cirTreeFileDetach(&view->index); freez(pView); } } struct fileOffsetSize *bigWigOverlappingBlocks(struct bigWigView *view, char *chrom, bits32 start, bits32 end) /* Fetch list of file blocks that contain items overlapping chromosome range. */ { struct bigWigFile *bwf = view->file; bits32 chromIx; if (!bptFileFind(bwf->chromBpt, chrom, strlen(chrom), &chromIx, sizeof(chromIx))) return NULL; return cirTreeFindOverlappingBlocks(view->index, chromIx, start, end); } void bwTestRead(char *fileName, char *chrom, int start, int end) /* bwTestRead - Test scan and search side of bigWig.. */ { struct bigWigFile *bwf = bigWigFileOpen(fileName); struct bigWigView *view = bigWigViewOpen(bwf, 1.0); struct fileOffsetSize *blockList = bigWigOverlappingBlocks(view, chrom, start, end); struct fileOffsetSize *block; for (block=blockList; block != NULL; block = block->next) { fseek(view->file->f, block->offset, SEEK_SET); bigWigBlockDump(view->file, chrom, uglyOut); } } int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, options); if (argc != 5) usage(); bwTestRead(argv[1], argv[2], sqlUnsigned(argv[3]), sqlUnsigned(argv[4])); return 0; }