static void hgSeqDisplayOptions(struct cart *cart, boolean canDoUTR, boolean canDoIntrons, boolean offerRevComp) /* Print out HTML FORM entries for sequence display options. */ { char *casing, *repMasking; puts("\n<H3> Sequence Formatting Options: </H3>\n"); casing = cartCgiUsualString(cart, "hgSeq.casing", "exon"); if (canDoIntrons) { cgiMakeRadioButton("hgSeq.casing", "exon", sameString(casing, "exon")); if (canDoUTR) puts("Exons in upper case, everything else in lower case. <BR>"); else puts("Blocks in upper case, everything else in lower case. <BR>"); } if (canDoUTR) { if (sameString(casing, "exon") && !canDoIntrons) casing = "cds"; cgiMakeRadioButton("hgSeq.casing", "cds", sameString(casing, "cds")); puts("CDS in upper case, UTR in lower case. <BR>"); } if ((sameString(casing, "exon") && !canDoIntrons) || (sameString(casing, "cds") && !canDoUTR)) casing = "upper"; cgiMakeRadioButton("hgSeq.casing", "upper", sameString(casing, "upper")); puts("All upper case. <BR>"); cgiMakeRadioButton("hgSeq.casing", "lower", sameString(casing, "lower")); puts("All lower case. <BR>"); cgiMakeCheckBox("hgSeq.maskRepeats", cartCgiUsualBoolean(cart, "hgSeq.maskRepeats", FALSE)); puts("Mask repeats: "); repMasking = cartCgiUsualString(cart, "hgSeq.repMasking", "lower"); cgiMakeRadioButton("hgSeq.repMasking", "lower", sameString(repMasking, "lower")); puts(" to lower case "); cgiMakeRadioButton("hgSeq.repMasking", "N", sameString(repMasking, "N")); puts(" to N <BR>"); if (offerRevComp) { cgiMakeCheckBox("hgSeq.revComp", cartCgiUsualBoolean(cart, "hgSeq.revComp", FALSE)); puts("Reverse complement (get \'-\' strand sequence)"); } }
static void showWiggleMergeOptions() /* Show subtrack merge operation options for wiggle/bedGraph tables. */ { char *setting = cartUsualString(cart, hgtaNextSubtrackMergeWigOp, "average"); makeWigOpButton("average", setting); printf("Average (at each position) of all selected subtracks' scores<BR>\n"); makeWigOpButton("sum", setting); printf("Sum (at each position) of all selected subtracks' scores<BR>\n"); makeWigOpButton("product", setting); printf("Product (at each position) of all selected subtracks' scores<BR>\n"); makeWigOpButton("min", setting); printf("Minimum (at each position) of all selected subtracks' scores<BR>\n"); makeWigOpButton("max", setting); printf("Maximum (at each position) of all selected subtracks' scores<P>\n"); cgiMakeCheckBox(hgtaNextSubtrackMergeRequireAll, cartUsualBoolean(cart, hgtaSubtrackMergeRequireAll, FALSE)); printf("Discard scores for positions at which one or more selected subtracks " "have no data.<BR>\n"); cgiMakeCheckBox(hgtaNextSubtrackMergeUseMinScore, cartUsualBoolean(cart, hgtaSubtrackMergeUseMinScore, FALSE)); printf("Discard scores less than \n"); setting = cartCgiUsualString(cart, hgtaNextSubtrackMergeMinScore, "0.0"); cgiMakeTextVar(hgtaNextSubtrackMergeMinScore, setting, 5); printf(" after performing the above operation.<P>\n"); }
static void showBedMergeOptions() /* Show subtrack merge operation options for tables that are distilled * to BED (not wiggle/bedGraph). */ { char *op = cartUsualString(cart, hgtaNextSubtrackMergeOp, "any"); char *setting = NULL; hPrintf("These combinations will maintain the gene/alignment structure " "(if any) of %s: <P>\n", curTable); makeOpButton("any", op); printf("All %s records that have any overlap with any other selected subtrack<BR>\n", curTable); makeOpButton("none", op); printf("All %s records that have no overlap with any other selected subtrack<BR>\n", curTable); makeOpButton("more", op); printf("All %s records that have at least ", curTable); setting = cartCgiUsualString(cart, hgtaNextSubtrackMergeMoreThreshold, "80"); cgiMakeTextVar(hgtaNextSubtrackMergeMoreThreshold, setting, 3); printf(" %% overlap with any other selected subtrack<BR>\n"); makeOpButton("less", op); printf("All %s records that have at most ", curTable); setting = cartCgiUsualString(cart, hgtaNextSubtrackMergeLessThreshold, "80"); cgiMakeTextVar(hgtaNextSubtrackMergeLessThreshold, setting, 3); printf(" %% overlap with any other selected subtrack<BR>\n"); makeOpButton("cat", op); printf("All %s records, as well as all records from all other selected subtracks<P>\n", curTable); printf("These combinations will discard the gene/alignment structure (if any) " "of %s and produce a simple list of position ranges.<P>\n", curTable); makeOpButton("and", op); printf("Base-pair-wise intersection (AND) of %s and other selected subtracks<BR>\n", curTable); makeOpButton("or", op); printf("Base-pair-wise union (OR) of %s and other selected subtracks<P>\n", curTable); }
static void conservationStatsLink(struct trackDb *tdb, char *label, char *table) /* write link that to display statistics of phastCons table */ { char *chrom = cartCgiUsualString(cart, "c", "chr7"); printf("<A HREF=\"%s&g=%s&i=%s&c=%s&l=%d&r=%d&o=%d&db=%s" "&parentWigMaf=%s\" TARGET=\"_blank\">%s</A>", hgcPathAndSettings(), table, table, chrom, winStart, winEnd, winStart, database, tdb->track, label); }
struct liftOverChain *defaultChoices(struct liftOverChain *chainList, char *cartDb) /* Out of a list of liftOverChains and a cart, choose a * list to display. */ { char *fromOrg, *fromDb, *toOrg, *toDb, *cartOrg; struct liftOverChain *choice = NULL; struct hash *dbRank = hGetDatabaseRank(); double bestScore = -1; struct liftOverChain *this = NULL; /* Get the initial values. */ fromOrg = cartCgiUsualString(cart, HGLFT_FROMORG_VAR, "0"); fromDb = cartCgiUsualString(cart, HGLFT_FROMDB_VAR, "0"); toOrg = cartCgiUsualString(cart, HGLFT_TOORG_VAR, "0"); toDb = cartCgiUsualString(cart, HGLFT_TODB_VAR, "0"); cartOrg = hArchiveOrganism(cartDb); if (sameWord(fromOrg,"0")) fromOrg = NULL; if (sameWord(fromDb,"0")) fromDb = NULL; if (sameWord(toOrg,"0")) toOrg = NULL; if (sameWord(toDb,"0")) toDb = NULL; if (sameWord(cartDb,"0")) cartDb = NULL; for (this = chainList; this != NULL; this = this->next) { double score = scoreLiftOverChain(this, fromOrg, fromDb, toOrg, toDb, cartOrg, cartDb, dbRank); if (score > bestScore) { choice = this; bestScore = score; } } return choice; }
boolean doGetBedOrCt(struct sqlConnection *conn, boolean doCt, boolean doCtFile, boolean redirectToGb) /* Actually output bed or custom track. Return TRUE unless no results. */ { char *db = cloneString(database); char *table = curTable; struct hTableInfo *hti = getHti(db, table, conn); struct featureBits *fbList = NULL, *fbPtr; struct customTrack *ctNew = NULL; boolean doCtHdr = (cartUsualBoolean(cart, hgtaPrintCustomTrackHeaders, FALSE) || doCt || doCtFile); char *ctWigOutType = cartCgiUsualString(cart, hgtaCtWigOutType, outWigData); char *fbQual = fbOptionsToQualifier(); char fbTQ[128]; int fields = hTableInfoBedFieldCount(hti); boolean gotResults = FALSE; struct region *region, *regionList = getRegions(); boolean isBedGr = isBedGraph(curTable); boolean isBgWg = isBigWigTable(curTable); boolean needSubtrackMerge = anySubtrackMerge(database, curTable); boolean doDataPoints = FALSE; boolean isWig = isWiggle(database, table); struct wigAsciiData *wigDataList = NULL; struct dataVector *dataVectorList = NULL; boolean doRgb = bedItemRgb(hTrackDbForTrack(db, curTable)); if (!cartUsualBoolean(cart, hgtaDoGreatOutput, FALSE) && !doCt) { textOpen(); } if (cartUsualBoolean(cart, hgtaDoGreatOutput, FALSE)) fputs("#", stdout); if ((isWig || isBedGr || isBgWg) && sameString(outWigData, ctWigOutType)) doDataPoints = TRUE; for (region = regionList; region != NULL; region = region->next) { struct bed *bedList = NULL, *bed; struct lm *lm = lmInit(64*1024); struct dataVector *dv = NULL; if (isWig && doDataPoints) { if (needSubtrackMerge) { dv = wiggleDataVector(curTrack, curTable, conn, region); if (dv != NULL) slAddHead(&dataVectorList, dv); } else { int count = 0; struct wigAsciiData *wigData = NULL; struct wigAsciiData *asciiData; struct wigAsciiData *next; wigData = getWiggleAsData(conn, curTable, region); for (asciiData = wigData; asciiData; asciiData = next) { next = asciiData->next; if (asciiData->count) { slAddHead(&wigDataList, asciiData); ++count; } } slReverse(&wigDataList); } } else if (isBedGr && doDataPoints) { dv = bedGraphDataVector(curTable, conn, region); if (dv != NULL) slAddHead(&dataVectorList, dv); } else if (isBgWg && doDataPoints) { dv = bigWigDataVector(curTable, conn, region); if (dv != NULL) slAddHead(&dataVectorList, dv); } else if (isWig || isBgWg) { dv = wiggleDataVector(curTrack, curTable, conn, region); bedList = dataVectorToBedList(dv); dataVectorFree(&dv); } else if (isBedGr) { bedList = getBedGraphAsBed(conn, curTable, region); } else { bedList = cookedBedList(conn, curTable, region, lm, &fields); } /* this is a one-time only initial creation of the custom track * structure to receive the results. gotResults turns it off after * the first time. */ if (doCtHdr && !gotResults && ((bedList != NULL) || (wigDataList != NULL) || (dataVectorList != NULL))) { ctNew = beginCustomTrack(table, fields, doCt, (isWig || isBedGr || isBgWg), doDataPoints); } if (doDataPoints && (wigDataList || dataVectorList)) gotResults = TRUE; else { if ((fbQual == NULL) || (fbQual[0] == 0)) { for (bed = bedList; bed != NULL; bed = bed->next) { if (bed->name != NULL) { subChar(bed->name, ' ', '_'); } if (doCt) { struct bed *dupe = cloneBed(bed); /* Out of local memory. */ slAddHead(&ctNew->bedList, dupe); } else { if (doRgb) bedTabOutNitemRgb(bed, fields, stdout); else bedTabOutN(bed, fields, stdout); } gotResults = TRUE; } } else { safef(fbTQ, sizeof(fbTQ), "%s:%s", hti->rootName, fbQual); fbList = fbFromBed(db, fbTQ, hti, bedList, 0, 0, FALSE, FALSE); if (fields >= 6) fields = 6; else if (fields >= 4) fields = 4; else fields = 3; if (doCt && ctNew) { ctNew->fieldCount = fields; safef(ctNew->tdb->type, strlen(ctNew->tdb->type)+1, "bed %d", fields); } for (fbPtr=fbList; fbPtr != NULL; fbPtr=fbPtr->next) { if (fbPtr->name != NULL) { char *ptr = strchr(fbPtr->name, ' '); if (ptr != NULL) *ptr = 0; } if (doCt) { struct bed *fbBed = fbToBedOne(fbPtr); slAddHead(&ctNew->bedList, fbBed ); } else { if (fields >= 6) hPrintf("%s\t%d\t%d\t%s\t%d\t%c\n", fbPtr->chrom, fbPtr->start, fbPtr->end, fbPtr->name, 0, fbPtr->strand); else if (fields >= 4) hPrintf("%s\t%d\t%d\t%s\n", fbPtr->chrom, fbPtr->start, fbPtr->end, fbPtr->name); else hPrintf("%s\t%d\t%d\n", fbPtr->chrom, fbPtr->start, fbPtr->end); } gotResults = TRUE; } featureBitsFreeList(&fbList); } } bedList = NULL; lmCleanup(&lm); } if (!gotResults) { hPrintf(NO_RESULTS); } else if (doCt) { int wigDataSize = 0; /* Load existing custom tracks and add this new one: */ struct customTrack *ctList = getCustomTracks(); removeNamedCustom(&ctList, ctNew->tdb->table); if (doDataPoints) { if (needSubtrackMerge || isBedGr || isBgWg) { slReverse(&dataVectorList); wigDataSize = dataVectorWriteWigAscii(dataVectorList, ctNew->wigAscii, 0, NULL); // TODO: see if can make prettier wig output here that // doesn't necessarily have one value per base } else { struct wiggleDataStream *wds = NULL; /* create an otherwise empty wds so we can print out the list */ wds = wiggleDataStreamNew(); wds->ascii = wigDataList; wigDataSize = wds->asciiOut(wds, db, ctNew->wigAscii, TRUE, FALSE); #if defined(DEBUG) /* dbg */ /* allow file readability for debug */ chmod(ctNew->wigAscii, 0666); #endif wiggleDataStreamFree(&wds); } } else slReverse(&ctNew->bedList); slAddHead(&ctList, ctNew); /* Save the custom tracks out to file (overwrite the old file): */ customTracksSaveCart(db, cart, ctList); /* Put up redirect-to-browser page. */ if (redirectToGb) { char browserUrl[256]; char headerText[512]; int redirDelay = 3; safef(browserUrl, sizeof(browserUrl), "%s?%s&db=%s", hgTracksName(), cartSidUrlString(cart), database); safef(headerText, sizeof(headerText), "<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"%d;URL=%s\">", redirDelay, browserUrl); webStartHeader(cart, database, headerText, "Table Browser: %s %s: %s", hOrganism(database), freezeName, "get custom track"); if (doDataPoints) { hPrintf("There are %d data points in custom track. ", wigDataSize); } else { hPrintf("There are %d items in custom track. ", slCount(ctNew->bedList)); } hPrintf("You will be automatically redirected to the genome browser in\n" "%d seconds, or you can \n" "<A HREF=\"%s\">click here to continue</A>.\n", redirDelay, browserUrl); } } else if (doDataPoints) { if (needSubtrackMerge || isBedGr || isBgWg) { slReverse(&dataVectorList); dataVectorWriteWigAscii(dataVectorList, "stdout", 0, NULL); } else { /* create an otherwise empty wds so we can print out the list */ struct wiggleDataStream *wds = NULL; wds = wiggleDataStreamNew(); wds->ascii = wigDataList; wds->asciiOut(wds, db, "stdout", TRUE, FALSE); wiggleDataStreamFree(&wds); } } return gotResults; }
void doBedOrCtOptions(char *table, struct sqlConnection *conn, boolean doCt) /* Put up form to get options on BED or custom track output. */ /* (Taken from hgText.c/doBedCtOptions) */ { char *table2 = NULL; /* For now... */ struct hTableInfo *hti = getHti(database, table, conn); char buf[256]; char *setting; htmlOpen("Output %s as %s", table, (doCt ? "Custom Track" : "BED")); if (doGalaxy()) startGalaxyForm(); else if (doGreat()) { verifyGreatAssemblies(); startGreatForm(); } else hPrintf("<FORM ACTION=\"%s\" METHOD=GET>\n", getScriptName()); cartSaveSession(cart); if (!doGreat()) { hPrintf("%s\n", "<TABLE><TR><TD>"); if (doCt) { hPrintf("%s\n", "</TD><TD>" "<A HREF=\"../goldenPath/help/customTrack.html\" TARGET=_blank>" "Custom track</A> header: </B>"); } else { cgiMakeCheckBox(hgtaPrintCustomTrackHeaders, cartCgiUsualBoolean(cart, hgtaPrintCustomTrackHeaders, FALSE)); hPrintf("%s\n", "</TD><TD> <B> Include " "<A HREF=\"../goldenPath/help/customTrack.html\" TARGET=_blank>" "custom track</A> header: </B>"); } hPrintf("%s\n", "</TD></TR><TR><TD></TD><TD>name="); safef(buf, sizeof(buf), "tb_%s", hti->rootName); setting = cgiUsualString(hgtaCtName, buf); cgiMakeTextVar(hgtaCtName, setting, 16); hPrintf("%s\n", "</TD></TR><TR><TD></TD><TD>description="); safef(buf, sizeof(buf), "table browser query on %s%s%s", table, (table2 ? ", " : ""), (table2 ? table2 : "")); setting = cgiUsualString(hgtaCtDesc, buf); cgiMakeTextVar(hgtaCtDesc, setting, 50); hPrintf("%s\n", "</TD></TR><TR><TD></TD><TD>visibility="); if (isWiggle(database, table) || isBigWigTable(table)) { setting = cartCgiUsualString(cart, hgtaCtVis, ctVisWigMenu[2]); cgiMakeDropList(hgtaCtVis, ctVisWigMenu, ctVisWigMenuSize, setting); } else { setting = cartCgiUsualString(cart, hgtaCtVis, ctVisMenu[3]); cgiMakeDropList(hgtaCtVis, ctVisMenu, ctVisMenuSize, setting); } hPrintf("%s\n", "</TD></TR><TR><TD></TD><TD>url="); setting = cartCgiUsualString(cart, hgtaCtUrl, ""); cgiMakeTextVar(hgtaCtUrl, setting, 50); hPrintf("%s\n", "</TD></TR><TR><TD></TD><TD>"); hPrintf("%s\n", "</TD></TR></TABLE>"); } if (isWiggle(database, table) || isBedGraph(table) || isBigWigTable(table) ) { char *setting = NULL; hPrintf("<P> <B> Select type of data output: </B> <BR>\n"); setting = cartCgiUsualString(cart, hgtaCtWigOutType, outWigData); cgiMakeRadioButton(hgtaCtWigOutType, outWigBed, sameString(setting, outWigBed)); hPrintf("BED format (no data value information, only position)<BR>\n"); cgiMakeRadioButton(hgtaCtWigOutType, outWigData, sameString(setting, outWigData)); hPrintf("DATA VALUE format (position and real valued data)</P>\n"); } else { cgiDown(0.9); hPrintf("<B> Create one BED record per: </B>\n"); if ((anyIntersection() && intersectionIsBpWise()) || (anySubtrackMerge(database, table) && subtrackMergeIsBpWise())) { /* The original table may have blocks/CDS, described in hti, but * that info will be lost after base pair-wise operations. So make * a temporary copy of hti with its flags tweaked: */ struct hTableInfo simplifiedHti; memcpy(&simplifiedHti, hti, sizeof(simplifiedHti)); simplifiedHti.hasBlocks = FALSE; simplifiedHti.hasCDS = FALSE; fbOptionsHtiCart(&simplifiedHti, cart); } else fbOptionsHtiCart(hti, cart); } if (doCt) { if (doGalaxy()) { /* send the action parameter with the form as well */ cgiMakeHiddenVar(hgtaDoGetCustomTrackFile, "get custom track in file"); printGalaxySubmitButtons(); } else { cgiMakeButton(hgtaDoGetCustomTrackTb, "get custom track in table browser"); hPrintf(" "); cgiMakeButton(hgtaDoGetCustomTrackFile, "get custom track in file"); hPrintf("<BR>\n"); cgiMakeButton(hgtaDoGetCustomTrackGb, "get custom track in genome browser"); } } else { if (doGalaxy()) { cgiMakeHiddenVar(hgtaDoGetBed, "get BED"); printGalaxySubmitButtons(); } else if (doGreat()) { cgiMakeHiddenVar(hgtaDoGetBed, "get BED"); printGreatSubmitButtons(); } else cgiMakeButton(hgtaDoGetBed, "get BED"); } if (!doGalaxy() && !doGreat()) { hPrintf(" "); cgiMakeButton(hgtaDoMainPage, "cancel"); hPrintf("</FORM>\n"); } cgiDown(0.9); htmlClose(); }
void doIntersectMore(struct sqlConnection *conn) /* Continue working in intersect page. */ { struct trackDb *iTrack; char *name = curTableLabel(); char *iName, *iTable; char *onChange = onChangeEither(); char *op, *setting; boolean wigOptions = (isWiggle(database, curTable) || isBedGraph(curTable)); // Note - bigWig is purposely left out of wigOptions. It supports more intersection options // than wig does. struct hTableInfo *hti1 = maybeGetHti(database, curTable, conn), *hti2 = NULL; htmlOpen("Intersect with %s", name); hPrintf("<FORM ACTION=\"%s\" NAME=\"mainForm\" METHOD=GET>\n", getScriptName()); cartSaveSession(cart); hPrintf("<TABLE BORDER=0>\n"); /* Print group and track line. */ hPrintf("Select a group, track and table to intersect with:\n"); iTrack = showGroupTrackRow(hgtaNextIntersectGroup, onChange, hgtaNextIntersectTrack, onChange, conn); iName = iTrack->shortLabel; hPrintf("<TR><TD>\n"); iTable = showTableField(iTrack, hgtaNextIntersectTable, FALSE); hti2 = maybeGetHti(database, iTable, conn); hPrintf("</TD></TR>\n"); hPrintf("</TABLE>\n"); if (!wigOptions) { if (hti1 && hti1->hasBlocks) hPrintf("<BR>Note: %s has gene/alignment structure. " "Only the exons/blocks will be considered.\n", name); if (hti2 && hti2->hasBlocks) hPrintf("<BR>Note: %s has gene/alignment structure. " "Only the bases covered by its exons/blocks will be " "considered.\n", iName); hPrintf("<H4>Intersect %s items with bases covered by %s:</H4>\n", name, iName); hPrintf("These combinations will maintain the names and " "gene/alignment structure (if any) of %s: <P>\n", name); } else hPrintf("<P>\n"); op = cartUsualString(cart, hgtaNextIntersectOp, "any"); jsTrackingVar("op", op); makeOpButton("any", op); printf("All %s records that have any overlap with %s <BR>\n", name, iName); makeOpButton("none", op); printf("All %s records that have no overlap with %s <BR>\n", name, iName); if (!wigOptions) { makeOpButton("more", op); printf("All %s records that have at least ", name); setting = cartCgiUsualString(cart, hgtaNextMoreThreshold, "80"); cgiMakeTextVar(hgtaNextMoreThreshold, setting, 3); printf(" %% overlap with %s <BR>\n", iName); makeOpButton("less", op); printf("All %s records that have at most ", name); setting = cartCgiUsualString(cart, hgtaNextLessThreshold, "80"); cgiMakeTextVar(hgtaNextLessThreshold, setting, 3); printf(" %% overlap with %s <P>\n", iName); } else { /* keep javaScript onClick happy */ hPrintf("<input TYPE=HIDDEN NAME=\"hgta_nextMoreThreshold\" VALUE=80>\n"); hPrintf("<input TYPE=HIDDEN NAME=\"hgta_nextLessThreshold\" VALUE=80>\n"); hPrintf(" <P>\n"); } if (!wigOptions) { boolean bigWig = isBigWigTable(curTable); hPrintf("<H4>Intersect bases covered by %s and/or %s:</H4>\n", name, iName); if (!bigWig) hPrintf("These combinations will discard the names and " "gene/alignment structure (if any) of %s and produce a simple " "list of position ranges.<P>\n", name); makeOpButton("and", op); printf("Base-pair-wise intersection (AND) of %s and %s <BR>\n", name, iName); makeOpButton("or", op); printf("Base-pair-wise union (OR) of %s and %s <P>\n", name, iName); hPrintf("Check the following boxes to complement one or both tables. " "To complement a table means to include a base pair in the " "intersection/union if it is <I>not</I> included in the table." "<P>\n"); if (!bigWig) { jsMakeTrackingCheckBox(cart, hgtaNextInvertTable, "invertTable", FALSE); printf("Complement %s before base-pair-wise intersection/union <BR>\n", name); } jsMakeTrackingCheckBox(cart, hgtaNextInvertTable2, "invertTable2", FALSE); printf("Complement %s before base-pair-wise intersection/union <P>\n", iName); } else { /* keep javaScript onClick happy */ jsTrackingVar("op", op); hPrintf("<SCRIPT>\n"); hPrintf("var invertTable=0;\n"); hPrintf("var invertTable2=0;\n"); hPrintf("</SCRIPT>\n"); hPrintf("(data track %s is not composed of gene records. Specialized intersection operations are not available.)<P>\n", name); } cgiMakeButton(hgtaDoIntersectSubmit, "submit"); hPrintf(" "); cgiMakeButton(hgtaDoMainPage, "cancel"); hPrintf("</FORM>\n"); /* Hidden form - for benefit of javascript. */ { static char *saveVars[32]; int varCount = ArraySize(nextVars); memcpy(saveVars, nextVars, varCount * sizeof(saveVars[0])); saveVars[varCount] = hgtaDoIntersectMore; jsCreateHiddenForm(cart, getScriptName(), saveVars, varCount+1); } htmlClose(); }
static void hgSeqFeatureRegionOptions(struct cart *cart, boolean canDoUTR, boolean canDoIntrons) /* Print out HTML FORM entries for feature region options. */ { char *exonStr = canDoIntrons ? " Exons" : ""; char *setting; puts("\n<H3> Sequence Retrieval Region Options: </H3>\n"); if (canDoIntrons || canDoUTR) { cgiMakeCheckBox("hgSeq.promoter", cartCgiUsualBoolean(cart, "hgSeq.promoter", FALSE)); puts("Promoter/Upstream by "); setting = cartCgiUsualString(cart, "hgSeq.promoterSize", "1000"); cgiMakeTextVar("hgSeq.promoterSize", setting, 5); puts("bases <BR>"); } if (canDoUTR) { cgiMakeCheckBox("hgSeq.utrExon5", cartCgiUsualBoolean(cart, "hgSeq.utrExon5", TRUE)); printf("5' UTR%s <BR>\n", exonStr); } if (canDoIntrons) { cgiMakeCheckBox("hgSeq.cdsExon", cartCgiUsualBoolean(cart, "hgSeq.cdsExon", TRUE)); if (canDoUTR) printf("CDS Exons <BR>\n"); else printf("Blocks <BR>\n"); } else if (canDoUTR) { cgiMakeCheckBox("hgSeq.cdsExon", cartCgiUsualBoolean(cart, "hgSeq.cdsExon", TRUE)); printf("CDS <BR>\n"); } else { cgiMakeHiddenVar("hgSeq.cdsExon", "1"); } if (canDoUTR) { cgiMakeCheckBox("hgSeq.utrExon3", cartCgiUsualBoolean(cart, "hgSeq.utrExon3", TRUE)); printf("3' UTR%s <BR>\n", exonStr); } if (canDoIntrons) { cgiMakeCheckBox("hgSeq.intron", cartCgiUsualBoolean(cart, "hgSeq.intron", TRUE)); if (canDoUTR) puts("Introns <BR>"); else puts("Regions between blocks <BR>"); } if (canDoIntrons || canDoUTR) { cgiMakeCheckBox("hgSeq.downstream", cartCgiUsualBoolean(cart, "hgSeq.downstream", FALSE)); puts("Downstream by "); setting = cartCgiUsualString(cart, "hgSeq.downstreamSize", "1000"); cgiMakeTextVar("hgSeq.downstreamSize", setting, 5); puts("bases <BR>"); } if (canDoIntrons || canDoUTR) { setting = cartCgiUsualString(cart, "hgSeq.granularity", "gene"); cgiMakeRadioButton("hgSeq.granularity", "gene", sameString(setting, "gene")); if (canDoUTR) puts("One FASTA record per gene. <BR>"); else puts("One FASTA record per item. <BR>"); cgiMakeRadioButton("hgSeq.granularity", "feature", sameString(setting, "feature")); if (canDoUTR) puts("One FASTA record per region (exon, intron, etc.) with "); else puts("One FASTA record per region (block/between blocks) with "); } else { puts("Add "); } setting = cartCgiUsualString(cart, "hgSeq.padding5", "0"); cgiMakeTextVar("hgSeq.padding5", setting, 5); puts("extra bases upstream (5') and "); setting = cartCgiUsualString(cart, "hgSeq.padding3", "0"); cgiMakeTextVar("hgSeq.padding3", setting, 5); puts("extra downstream (3') <BR>"); if (canDoIntrons && canDoUTR) { puts(" "); cgiMakeCheckBox("hgSeq.splitCDSUTR", cartCgiUsualBoolean(cart, "hgSeq.splitCDSUTR", FALSE)); puts("Split UTR and CDS parts of an exon into separate FASTA records"); } puts("<BR>\n"); puts("Note: if a feature is close to the beginning or end of a chromosome \n" "and upstream/downstream bases are added, they may be truncated \n" "in order to avoid extending past the edge of the chromosome. <P>"); }
void webMain(struct liftOverChain *chain, char *dataFormat, boolean multiple) /* set up page for entering data */ { struct dbDb *dbList; char *fromOrg = hArchiveOrganism(chain->fromDb), *toOrg = hArchiveOrganism(chain->toDb); cgiParagraph( "This tool converts genome coordinates and genome annotation files " "between assemblies. " "The input data can be pasted into the text box, or uploaded from a file. " "If a pair of assemblies cannot be selected from the pull-down menus," " a direct lift between them is unavailable. " "However, a sequential lift may be possible. " "Example: lift from Mouse, May 2004, to Mouse, Feb. 2006, and then from Mouse, " "Feb. 2006 to Mouse, July 2007 to achieve a lift from mm5 to mm9. " ""); /* create HMTL form */ puts("<FORM ACTION=\"../cgi-bin/hgLiftOver\" METHOD=\"POST\" " " ENCTYPE=\"multipart/form-data\" NAME=\"mainForm\">\n"); cartSaveSession(cart); /* create HTML table for layout purposes */ puts("\n<TABLE WIDTH=\"100%%\">\n"); /* top two rows -- genome and assembly menus */ cgiSimpleTableRowStart(); cgiTableField("Original Genome: "); cgiTableField("Original Assembly: "); cgiTableField("New Genome: "); cgiTableField("New Assembly: "); cgiTableRowEnd(); cgiSimpleTableRowStart(); /* genome */ cgiSimpleTableFieldStart(); dbList = hGetLiftOverFromDatabases(); printSomeGenomeListHtmlNamed(HGLFT_FROMORG_VAR, chain->fromDb, dbList, onChange); cgiTableFieldEnd(); /* from assembly */ cgiSimpleTableFieldStart(); printAllAssemblyListHtmlParm(chain->fromDb, dbList, HGLFT_FROMDB_VAR, TRUE, onChange); cgiTableFieldEnd(); /* to assembly */ cgiSimpleTableFieldStart(); dbDbFreeList(&dbList); dbList = hGetLiftOverToDatabases(chain->fromDb); printLiftOverGenomeList(HGLFT_TOORG_VAR, chain->toDb, dbList, onChange); cgiTableFieldEnd(); cgiSimpleTableFieldStart(); printAllAssemblyListHtmlParm(chain->toDb, dbList, HGLFT_TODB_VAR, TRUE, ""); cgiTableFieldEnd(); cgiTableRowEnd(); cgiTableEnd(); cgiParagraph(" "); cgiSimpleTableStart(); cgiSimpleTableRowStart(); cgiSimpleTableFieldStart(); cgiTableField("Minimum ratio of bases that must remap:"); cgiTableFieldEnd(); cgiSimpleTableFieldStart(); cgiMakeDoubleVar(HGLFT_MINMATCH,chain->minMatch,6); cgiTableFieldEnd(); cgiTableRowEnd(); cgiSimpleTableRowStart(); cgiSimpleTableFieldStart(); cgiTableField("Minimum chain size in target:"); cgiTableFieldEnd(); cgiSimpleTableFieldStart(); cgiMakeIntVar(HGLFT_MINSIZET,chain->minSizeT,4); cgiTableFieldEnd(); cgiTableRowEnd(); cgiSimpleTableRowStart(); cgiSimpleTableFieldStart(); cgiTableField("Minimum hit size in query:"); cgiTableFieldEnd(); cgiSimpleTableFieldStart(); cgiMakeIntVar(HGLFT_MINSIZEQ,chain->minSizeQ,4); cgiTableFieldEnd(); cgiTableRowEnd(); cgiSimpleTableRowStart(); cgiSimpleTableFieldStart(); cgiTableField("Allow multiple output regions:"); cgiTableFieldEnd(); cgiSimpleTableFieldStart(); cgiMakeCheckBox(HGLFT_MULTIPLE,multiple); cgiTableFieldEnd(); cgiTableRowEnd(); cgiSimpleTableRowStart(); cgiSimpleTableFieldStart(); cgiTableField("Min ratio of alignment blocks/exons that must map:"); cgiTableFieldEnd(); cgiSimpleTableFieldStart(); cgiMakeDoubleVar(HGLFT_MINBLOCKS,chain->minBlocks,6); cgiTableFieldEnd(); cgiTableRowEnd(); cgiSimpleTableRowStart(); cgiSimpleTableFieldStart(); cgiTableField("If thickStart/thickEnd is not mapped, use the closest mapped base:"); cgiTableFieldEnd(); cgiSimpleTableFieldStart(); cgiMakeCheckBox(HGLFT_FUDGETHICK,(chain->fudgeThick[0]=='Y') ? TRUE : FALSE); cgiTableFieldEnd(); cgiTableRowEnd(); cgiTableEnd(); /* next row -- file format menu */ cgiParagraph( " For descriptions of the supported data formats, see the bottom of this page."); cgiSimpleTableStart(); cgiSimpleTableRowStart(); cgiTableField("Data Format: "); cgiSimpleTableFieldStart(); cgiMakeDropList(HGLFT_DATAFORMAT_VAR, formatList, sizeof(formatList)/sizeof (char*) - 1, dataFormat); cgiTableFieldEnd(); cgiTableRowEnd(); cgiTableEnd(); /* text box and two buttons (submit, reset) */ cgiParagraph(" Paste in data:\n"); cgiSimpleTableStart(); cgiSimpleTableRowStart(); cgiSimpleTableFieldStart(); cgiMakeTextArea(HGLFT_USERDATA_VAR, cartCgiUsualString(cart, HGLFT_USERDATA_VAR, NULL), 10, 80); cgiTableFieldEnd(); /* right element of table is a nested table * with two buttons stacked on top of each other */ cgiSimpleTableFieldStart(); cgiSimpleTableStart(); cgiSimpleTableRowStart(); cgiSimpleTableFieldStart(); cgiMakeSubmitButton(); cgiTableFieldEnd(); cgiTableRowEnd(); cgiSimpleTableRowStart(); cgiSimpleTableFieldStart(); cgiMakeClearButton("mainForm", HGLFT_USERDATA_VAR); cgiTableFieldEnd(); cgiTableRowEnd(); cgiTableEnd(); cgiTableFieldEnd(); cgiTableRowEnd(); cgiTableEnd(); /* next row -- file upload controls */ cgiParagraph(" Or upload data from a file:"); cgiSimpleTableStart(); cgiSimpleTableRowStart(); printf("<TD><INPUT TYPE=FILE NAME=\"%s\"></TD>\n", HGLFT_DATAFILE_VAR); puts("<TD><INPUT TYPE=SUBMIT NAME=SubmitFile VALUE=\"Submit File\"></TD>\n"); cgiTableRowEnd(); cgiTableEnd(); printf("<input type=\"hidden\" name=\"%s\" value=\"0\">\n", HGLFT_REFRESHONLY_VAR); puts("</FORM>\n"); cartSaveSession(cart); puts("</FORM>"); freeMem(fromOrg); freeMem(toOrg); }
void doMiddle(struct cart *theCart) /* Set up globals and make web page */ { /* struct liftOverChain *chainList = NULL, *chain; */ char *userData; /* char *dataFile; */ char *dataFormat; char *organism; char *db; float minBlocks, minMatch; boolean multiple, fudgeThick; int minSizeQ, minSizeT; boolean refreshOnly = FALSE; /* char *err = NULL; */ struct liftOverChain *chainList = NULL, *choice; cart = theCart; if (cgiOptionalString(HGLFT_ERRORHELP_VAR)) { puts("<PRE>"); puts(liftOverErrHelp()); //system("/usr/bin/cal"); puts("</PRE>"); return; } /* Get data to convert - from userData variable, or if * that is empty from a file. */ if (cartOptionalString(cart, "SubmitFile")) userData = cartOptionalString(cart, HGLFT_DATAFILE_VAR); else userData = cartOptionalString(cart, HGLFT_USERDATA_VAR); dataFormat = cartCgiUsualString(cart, HGLFT_DATAFORMAT_VAR, DEFAULT_FORMAT); cartWebStart(cart, NULL, "Lift Genome Annotations"); getDbAndGenome(cart, &db, &organism, oldVars); chainList = liftOverChainListFiltered(); choice = defaultChoices(chainList, db); if (choice == NULL) errAbort("Sorry, no conversions available from this assembly\n"); minSizeQ = cartCgiUsualInt(cart, HGLFT_MINSIZEQ, choice->minSizeQ); minSizeT = cartCgiUsualInt(cart, HGLFT_MINSIZET, choice->minSizeT); minBlocks = cartCgiUsualDouble(cart, HGLFT_MINBLOCKS, choice->minBlocks); minMatch = cartCgiUsualDouble(cart, HGLFT_MINMATCH, choice->minMatch); fudgeThick = cartCgiUsualBoolean(cart, HGLFT_FUDGETHICK, (choice->fudgeThick[0]=='Y') ? TRUE : FALSE); multiple = cartCgiUsualBoolean(cart, HGLFT_MULTIPLE, (choice->multiple[0]=='Y') ? TRUE : FALSE); refreshOnly = cartCgiUsualInt(cart, HGLFT_REFRESHONLY_VAR, 0); webMain(choice, dataFormat, multiple); liftOverChainFreeList(&chainList); if (!refreshOnly && userData != NULL && userData[0] != '\0') { struct hash *chainHash = newHash(0); char *chainFile; struct tempName oldTn, mappedTn, unmappedTn; FILE *old, *mapped, *unmapped; char *line; int lineSize; char *fromDb, *toDb; int ct = 0, errCt = 0; /* read in user data and save to file */ makeTempName(&oldTn, HGLFT, ".user"); old = mustOpen(oldTn.forCgi, "w"); fputs(userData, old); fputs("\n", old); /* in case user doesn't end last line */ carefulClose(&old); chmod(oldTn.forCgi, 0666); /* setup output files -- one for converted lines, the other * for lines that could not be mapped */ makeTempName(&mappedTn, HGLFT, ".bed"); makeTempName(&unmappedTn, HGLFT, ".err"); mapped = mustOpen(mappedTn.forCgi, "w"); chmod(mappedTn.forCgi, 0666); unmapped = mustOpen(unmappedTn.forCgi, "w"); chmod(unmappedTn.forCgi, 0666); fromDb = cgiString(HGLFT_FROMDB_VAR); toDb = cgiString(HGLFT_TODB_VAR); chainFile = liftOverChainFile(fromDb, toDb); if (chainFile == NULL) errAbort("ERROR: Can't convert from %s to %s: no chain file loaded", fromDb, toDb); readLiftOverMap(chainFile, chainHash); if (sameString(dataFormat, WIGGLE_FORMAT)) /* TODO: implement Wiggle */ {} else if (sameString(dataFormat, POSITION_FORMAT)) { /* minSizeT here and in liftOverChain.c/h has been renamed minChainT in liftOver.c */ /* ignore multiple, it must be false when position is used */ ct = liftOverPositions(oldTn.forCgi, chainHash, minMatch, minBlocks, 0, minSizeQ, minSizeT, 0, fudgeThick, mapped, unmapped, FALSE, NULL, &errCt); } else if (sameString(dataFormat, BED_FORMAT)) { /* minSizeT here and in liftOverChain.c/h has been renamed minChainT in liftOver.c */ ct = liftOverBed(oldTn.forCgi, chainHash, minMatch, minBlocks, 0, minSizeQ, minSizeT, 0, fudgeThick, mapped, unmapped, multiple, NULL, &errCt); } else /* programming error */ errAbort("ERROR: Unsupported data format: %s\n", dataFormat); webNewSection("Results"); if (ct) { /* some records succesfully converted */ cgiParagraph(""); printf("Successfully converted %d record", ct); printf("%s: ", ct > 1 ? "s" : ""); printf("<A HREF=%s TARGET=_blank>View Conversions</A>\n", mappedTn.forCgi); } if (errCt) { /* some records not converted */ cgiParagraph(""); printf("Conversion failed on %d record", errCt); printf("%s. ", errCt > 1 ? "s" : ""); printf("<A HREF=%s TARGET=_blank>Display failure file</A> \n", unmappedTn.forCgi); printf("<A HREF=\"../cgi-bin/hgLiftOver?%s=1\" TARGET=_blank>Explain failure messages</A>\n", HGLFT_ERRORHELP_VAR); puts("<P>Failed input regions:\n"); struct lineFile *errFile = lineFileOpen(unmappedTn.forCgi, TRUE); puts("<BLOCKQUOTE><PRE>\n"); while (lineFileNext(errFile, &line, &lineSize)) puts(line); lineFileClose(&errFile); puts("</PRE></BLOCKQUOTE>\n"); } if (sameString(dataFormat, POSITION_FORMAT) && multiple) { puts("<BLOCKQUOTE><PRE>\n"); puts("Note: multiple checkbox ignored since it is not supported for position format."); puts("</PRE></BLOCKQUOTE>\n"); } carefulClose(&unmapped); } webDataFormats(); webDownloads(); cartWebEnd(); }