0bdb0e42b90052c0ffd7c710ceb8d603cf27db48 galt Wed Jan 27 10:31:04 2016 -0800 Requested changes to multi-region config see # 16666 note 21 diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c index 7fd2b16..bee1e8d 100644 --- src/hg/hgTracks/hgTracks.c +++ src/hg/hgTracks/hgTracks.c @@ -3456,44 +3456,42 @@ int best = -1; struct kce *e, *prev = NULL; for(e=list; e; prev=e, e=e->next) { int start = e->gene->exonStarts[e->exonNumber]; if ((start < best) || (best == -1)) { best = start; *pBestKce = e; *pPrevKce = prev; } } return best; } -static void padExons(struct genePred *gene, int chromSize) +static void padExons(struct genePred *gene, int chromSize, int padding) /* pad all of the exons */ { int i; for(i=0; i < gene->exonCount; ++i) { - // padding - gene->exonStarts[i] -= emPadding; + gene->exonStarts[i] -= padding; if (gene->exonStarts[i] < 0) gene->exonStarts[i] = 0; - gene->exonEnds[i] += emPadding; + gene->exonEnds[i] += padding; if (gene->exonEnds[i] > chromSize) gene->exonEnds[i] = chromSize; - } } static void convertGenePredGeneToExon(struct genePred *gene) /* convert gene into a gene with just one exon that spans the entire gene */ { if (gene->exonCount < 1) errAbort("unexpected input in convertGenePredGeneToExon(), gene->exonCount=%d < 1", gene->exonCount); gene->exonEnds[0] = gene->exonEnds[gene->exonCount - 1]; gene->exonCount = 1; } void initVirtRegionsFromEMGeneTableExons(boolean showNoncoding, char *knownCanonical, char *knownToTag, boolean geneMostly) /* Create a regionlist from knownGene exons. */ // Merge exon regions that overlap. @@ -3511,30 +3509,33 @@ // which is slow, or trying to read one chrom at a time in the sorted order which is also slow, we can instead // just fetch them in their native order, and then create a duplicate array and copy the contents // to it in memory, one chunk per chrom, which would be very fast, but temporarily require duplicate vchrom array mem. // Not sure what to do about assemblies with many scaffolds. // // Adding support for extra options from Gencode hg38 so we can filter for // comprehensive, splice-variants, non-coding subsets. { struct sqlConnection *conn = hAllocConn(database); virtRegionList = NULL; struct sqlResult *sr; char **row; int rowOffset = 0; char query[256]; +int padding = emPadding; +if (sameString(virtModeType, "geneMostly")) + padding = gmPadding; // knownCanonical Hash struct hash *kcHash = NULL; if (knownCanonical) // filter out alt splicing variants { // load up hash of canonical transcriptIds sqlSafef(query, sizeof(query), "select transcript from %s" //" where chrom not like '%%_hap_%%' and chrom not like '%%_random'" , knownCanonical); if (virtualSingleChrom()) sqlSafefAppend(query, sizeof(query), " where chrom='%s'", chromName); //warn("query = [%s]", query); // DEBUG REMOVE kcHash = newHash(10); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { @@ -3596,32 +3597,32 @@ readIt = FALSE; if (readIt) { row = sqlNextRow(sr); if (row) { gene = genePredLoad(row+rowOffset); //warn("GALT loaded gene %s\n", gene->name); // DEBUG REMOVE if (geneMostly) convertGenePredGeneToExon(gene); if (!sameString(lastChromSizeChrom, gene->chrom)) { chromSize = hChromSize(database, gene->chrom); safecpy(lastChromSizeChrom, sizeof lastChromSizeChrom, gene->chrom); } - if (emPadding > 0) - padExons(gene, chromSize); // handle padding + if (padding > 0) + padExons(gene, chromSize, padding); // handle padding } else { isEOF = TRUE; } } if (gene && !showNoncoding && (gene->cdsStart == gene->cdsEnd)) { //warn("GALT skip non-coding gene %s cdsStart==cdsEnd", gene->name); // DEBUG REMOVE genePredFree(&gene); } if (gene && knownCanonical && !hashLookup(kcHash, gene->name)) { //warn("GALT skip not in knownCanonical hash gene %s", gene->name); // DEBUG REMOVE genePredFree(&gene); @@ -8437,30 +8438,31 @@ withLeftLabels = cartUsualBoolean(cart, "leftLabels", TRUE); withCenterLabels = cartUsualBoolean(cart, "centerLabels", TRUE); withGuidelines = cartUsualBoolean(cart, "guidelines", TRUE); if (!cartUsualBoolean(cart, "hgt.imageV1", FALSE)) { withNextItemArrows = cartUsualBoolean(cart, "nextItemArrows", FALSE); withNextExonArrows = cartUsualBoolean(cart, "nextExonArrows", TRUE); } withExonNumbers = cartUsualBoolean(cart, "exonNumbers", TRUE); emAltHighlight = cartUsualBoolean(cart, "emAltHighlight", FALSE); if (!hIsGsidServer()) { revCmplDisp = cartUsualBooleanDb(cart, database, REV_CMPL_DISP, FALSE); } emPadding = cartUsualInt(cart, "emPadding", emPadding); +gmPadding = cartUsualInt(cart, "gmPadding", gmPadding); withPriorityOverride = cartUsualBoolean(cart, configPriorityOverride, FALSE); fullInsideX = trackOffsetX(); fullInsideWidth = tl.picWidth-gfxBorder-fullInsideX; } void parseVirtPosition(char *position) /* parse virtual position * TODO this is just temporary */ { if (!position) { errAbort("position NULL"); } char *vPos = cloneString(position); char *colon = strchr(vPos, ':');