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/hgTables/longRange.c src/hg/hgTables/longRange.c index 817fec2..fa8e878 100644 --- src/hg/hgTables/longRange.c +++ src/hg/hgTables/longRange.c @@ -1,217 +1,217 @@ /* longRange - stuff to handle long range interaction stuff in table browser. */ /* Copyright (C) 2016 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 "hgTables.h" #include "hubConnect.h" #include "longRange.h" #include "asFilter.h" #include "bedTabix.h" boolean isLongTabixTable(char *table) /* Return TRUE if table corresponds to a longTabix file. */ { if (isHubTrack(table)) { struct trackDb *tdb = hashFindVal(fullTableToTdbHash, table); return startsWithWord("bedTabix", tdb->type) || startsWithWord("longTabix", tdb->type); } else return trackIsType(database, table, curTrack, "longTabix", ctLookupName); } struct slName *getLongTabixFields() /* Get fields of bam as simple name list. */ { struct asObject *as = longTabixAsObj(); return asColNames(as); } struct sqlFieldType *longTabixListFieldsAndTypes() /* Get fields of bigBed as list of sqlFieldType. */ { struct asObject *as = longTabixAsObj(); return sqlFieldTypesFromAs(as); } struct hTableInfo *longTabixToHti(char *table) /* Get standard fields of longTabix into hti structure. */ { struct hTableInfo *hti; AllocVar(hti); hti->rootName = cloneString(table); hti->isPos= TRUE; strcpy(hti->chromField, "chrom"); strcpy(hti->startField, "chromStart"); strcpy(hti->nameField, "chromEnd"); hti->type = cloneString("longTabix"); return hti; } void longTabixTabOut(char *db, char *table, struct sqlConnection *conn, char *fields, FILE *f) /* Print out selected fields from long tabix. If fields is NULL, then print out all fields. */ { struct hTableInfo *hti = NULL; hti = getHti(db, table, conn); struct hash *idHash = NULL; char *idField = getIdField(db, curTrack, table, hti); int idFieldNum = 0; /* if we know what field to use for the identifiers, get the hash of names */ if (idField != NULL) idHash = identifierHash(db, table); if (f == NULL) f = stdout; /* Convert comma separated list of fields to array. */ int fieldCount = chopByChar(fields, ',', NULL, 0); char **fieldArray; AllocArray(fieldArray, fieldCount); chopByChar(fields, ',', fieldArray, fieldCount); /* Get list of all fields in long tabix and turn it into a hash of column indexes keyed by * column name. */ struct hash *fieldHash = hashNew(0); struct slName *bb, *bbList = getLongTabixFields(); int i; for (bb = bbList, i=0; bb != NULL; bb = bb->next, ++i) { /* if we know the field for identifiers, save it away */ if ((idField != NULL) && sameString(idField, bb->name)) idFieldNum = i; hashAddInt(fieldHash, bb->name, i); } /* Create an array of column indexes corresponding to the selected field list. */ int *columnArray; AllocArray(columnArray, fieldCount); for (i=0; i<fieldCount; ++i) { columnArray[i] = hashIntVal(fieldHash, fieldArray[i]); } /* Output row of labels */ fprintf(f, "#%s", fieldArray[0]); for (i=1; i<fieldCount; ++i) fprintf(f, "\t%s", fieldArray[i]); fprintf(f, "\n"); struct asObject *as = longTabixAsObj(); struct asFilter *filter = NULL; if (anyFilter()) { filter = asFilterFromCart(cart, db, table, as); if (filter) { fprintf(f, "# Filtering on %d columns\n", slCount(filter->columnList)); } } struct region *region, *regionList = getRegions(); int maxOut = bigFileMaxOutput(); char *fileName = bigFileNameFromCtOrHub(table, conn); struct bedTabixFile *btf = bedTabixFileMayOpen(fileName, NULL, 0, 0); /* Loop through outputting each region */ for (region = regionList; region != NULL && (maxOut > 0); region = region->next) { if (!lineFileSetTabixRegion(btf->lf, region->chrom, region->start, region->end)) continue; char *row[6]; int wordCount; while (((wordCount = lineFileChopTab(btf->lf, row)) > 0) && (maxOut > 0)) { if (asFilterOnRow(filter, row)) { /* if we're looking for identifiers, check if this matches */ if ((idHash != NULL)&&(hashLookup(idHash, row[idFieldNum]) == NULL)) continue; int i; fprintf(f, "%s", row[columnArray[0]]); for (i=1; i<fieldCount; ++i) fprintf(f, "\t%s", row[columnArray[i]]); fprintf(f, "\n"); maxOut --; } } freeMem(fileName); } if (maxOut == 0) errAbort("Reached output limit of %d data values, please make region smaller,\n\tor set a higher output line limit with the filter settings.", bigFileMaxOutput()); /* Clean up and exit. */ hashFree(&fieldHash); freeMem(fieldArray); freeMem(columnArray); } static void addFilteredBedsOnRegion(char *fileName, struct region *region, char *table, struct asFilter *filter, struct lm *bedLm, struct bed **pBedList, struct hash *idHash, int *pMaxOut) /* Add relevant beds in reverse order to pBedList */ { struct bedTabixFile *btf = bedTabixFileMayOpen(fileName, NULL, 0, 0); if (!lineFileSetTabixRegion(btf->lf, region->chrom, region->start, region->end)) return; char *row[6]; int wordCount; while (((wordCount = lineFileChopTab(btf->lf, row)) > 0) && (*pMaxOut > 0)) { if (asFilterOnRow(filter, row)) { if ((idHash != NULL) && (hashLookup(idHash, row[3]) == NULL)) continue; struct bed *bed; lmAllocVar(bedLm, bed); bed->chrom = cloneString(row[0]); bed->chromStart = sqlUnsigned(row[1]); bed->chromEnd = sqlUnsigned(row[2]); bed->name = cloneString(row[3]); } (*pMaxOut)--; if (*pMaxOut <= 0) break; } } struct bed *longTabixGetFilteredBedsOnRegions(struct sqlConnection *conn, char *db, char *table, struct region *regionList, struct lm *lm, int *retFieldCount) /* Get list of beds from long tabix, in all regions, that pass filtering. */ { int maxOut = bigFileMaxOutput(); /* Figure out bam file name get column info and filter. */ struct asObject *as = longTabixAsObj(); struct asFilter *filter = asFilterFromCart(cart, db, table, as); struct hash *idHash = identifierHash(db, table); /* Get beds a region at a time. */ struct bed *bedList = NULL; struct region *region; char *fileName = bigFileNameFromCtOrHub(table, conn); for (region = regionList; region != NULL; region = region->next) { addFilteredBedsOnRegion(fileName, region, table, filter, lm, &bedList, idHash, &maxOut); freeMem(fileName); if (maxOut <= 0) { errAbort("Reached output limit of %d data values, please make region smaller,\n" "\tor set a higher output line limit with the filter settings.", bigFileMaxOutput()); } } slReverse(&bedList); return bedList; } void showSchemaLongTabix(char *table, struct trackDb *tdb) /* Show schema on long tabix. */ // FIXME: restore 'View schema' and 'schema' links for longTabix type (in hui.c) // when this is implemented { }