9c92205b58d6b9319f67782c79df1afc154dacd0 galt Thu Mar 31 00:13:38 2011 -0700 fixing hgLiftOver: grouping and slightly re-ordering options; adding a new section to show what parameters were actually used to display the results, since code currently resets most options to the values in the chain liftOverChains record; also renamed minSizeT to minChainT since that is what it really is, everywhere except liftOverChain.as and the actual db tables and liftOverChain.sql diff --git src/hg/hgLiftOver/hgLiftOver.c src/hg/hgLiftOver/hgLiftOver.c index 49b6bb6..2189855 100644 --- src/hg/hgLiftOver/hgLiftOver.c +++ src/hg/hgLiftOver/hgLiftOver.c @@ -21,31 +21,31 @@ /* CGI Variables */ #define HGLFT_USERDATA_VAR "hglft_userData" /* typed/pasted in data */ #define HGLFT_DATAFILE_VAR "hglft_dataFile" /* file of data to convert */ #define HGLFT_DATAFORMAT_VAR "hglft_dataFormat" /* format of data to convert */ #define HGLFT_FROMORG_VAR "hglft_fromOrg" /* FROM organism */ #define HGLFT_FROMDB_VAR "hglft_fromDb" /* FROM assembly */ #define HGLFT_TOORG_VAR "hglft_toOrg" /* TO organism */ #define HGLFT_TODB_VAR "hglft_toDb" /* TO assembly */ #define HGLFT_ERRORHELP_VAR "hglft_errorHelp" /* Print explanatory text */ #define HGLFT_REFRESHONLY_VAR "hglft_doRefreshOnly" /* Just refresh drop-down lists */ /* liftOver options: */ #define HGLFT_MINMATCH "hglft_minMatch" #define HGLFT_MINSIZEQ "hglft_minSizeQ" -#define HGLFT_MINSIZET "hglft_minSizeT" +#define HGLFT_MINCHAINT "hglft_minChainT" #define HGLFT_MULTIPLE "hglft_multiple" #define HGLFT_MINBLOCKS "hglft_minBlocks" #define HGLFT_FUDGETHICK "hglft_fudgeThick" /* Global Variables */ struct cart *cart; /* CGI and other variables */ struct hash *oldVars = NULL; /* Data Formats */ #define POSITION_FORMAT "Position" #define BED_FORMAT "BED" #define WIGGLE_FORMAT "Wiggle" char *formatList[] = {BED_FORMAT, POSITION_FORMAT, 0}; @@ -74,31 +74,31 @@ "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"); +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); @@ -115,78 +115,89 @@ 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(); +cgiTableField(" "); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField("BED 4 to BED 6 Options"); cgiTableRowEnd(); + cgiSimpleTableRowStart(); +cgiTableField("Allow multiple output regions:"); cgiSimpleTableFieldStart(); -cgiTableField("Minimum hit size in query:"); +cgiMakeCheckBox(HGLFT_MULTIPLE,multiple); cgiTableFieldEnd(); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField(" Minimum hit size in query:"); cgiSimpleTableFieldStart(); cgiMakeIntVar(HGLFT_MINSIZEQ,chain->minSizeQ,4); cgiTableFieldEnd(); cgiTableRowEnd(); + cgiSimpleTableRowStart(); +cgiTableField(" Minimum chain size in target:"); cgiSimpleTableFieldStart(); -cgiTableField("Allow multiple output regions:"); -cgiTableFieldEnd(); -cgiSimpleTableFieldStart(); -cgiMakeCheckBox(HGLFT_MULTIPLE,multiple); +cgiMakeIntVar(HGLFT_MINCHAINT,chain->minChainT,4); cgiTableFieldEnd(); cgiTableRowEnd(); + cgiSimpleTableRowStart(); -cgiSimpleTableFieldStart(); -cgiTableField("Min ratio of alignment blocks/exons that must map:"); -cgiTableFieldEnd(); +cgiTableField(" "); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField("BED 12 Options"); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField("Min ratio of alignment blocks or exons that must map:"); 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(); @@ -228,30 +239,96 @@ 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 webParamsUsed(float minMatch, boolean multiple, int minSizeQ, int minChainT, float minBlocks, boolean fudgeThick) +{ +webNewSection("Parameters Used"); +cgiSimpleTableStart(); + +cgiSimpleTableRowStart(); +cgiTableField("Minimum ratio of bases that must remap:"); +cgiSimpleTableFieldStart(); +printf("%.2f",minMatch); +cgiTableFieldEnd(); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField(" "); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField("BED 4 to BED 6 Options"); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField("Allow multiple output regions:"); +cgiSimpleTableFieldStart(); +printf("%s", multiple ? "on" : "off"); +cgiTableFieldEnd(); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField(" Minimum hit size in query:"); +cgiSimpleTableFieldStart(); +printf("%d",minSizeQ); +cgiTableFieldEnd(); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField(" Minimum chain size in target:"); +cgiSimpleTableFieldStart(); +printf("%d",minChainT); +cgiTableFieldEnd(); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField(" "); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField("BED 12 Options"); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField("Min ratio of alignment blocks or exons that must map:"); +cgiSimpleTableFieldStart(); +printf("%.2f",minBlocks); +cgiTableFieldEnd(); +cgiTableRowEnd(); + +cgiSimpleTableRowStart(); +cgiTableField("If thickStart/thickEnd is not mapped, use the closest mapped base:"); +cgiSimpleTableFieldStart(); +printf("%s", fudgeThick ? "on" : "off"); +cgiTableFieldEnd(); +cgiTableRowEnd(); + +cgiTableEnd(); +} + void webDataFormats() { webNewSection("Data Formats"); puts("<LI>"); puts( "<A HREF=\"../goldenPath/help/customTrack.html#BED\" TARGET=_blank>" "Browser Extensible Data (BED)</A>\n"); puts("</LI>"); puts("<LI>"); puts("Genomic Coordinate Position<BR>"); puts(" chrN<B>:</B>start<B>-</B>end"); puts("</LI>"); } void webDownloads() @@ -354,31 +431,31 @@ return choice; } 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; +int minSizeQ, minChainT; 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; } @@ -390,31 +467,31 @@ 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); +minChainT = cartCgiUsualInt(cart, HGLFT_MINCHAINT, choice->minChainT); 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; @@ -440,45 +517,42 @@ 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, + minChainT, 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, + minChainT, 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); } @@ -493,30 +567,33 @@ 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"); } + + webParamsUsed(minMatch, multiple, minSizeQ, minChainT, minBlocks, fudgeThick); + carefulClose(&unmapped); } webDataFormats(); webDownloads(); cartWebEnd(); } /* Null terminated list of CGI Variables we don't want to save * permanently. */ char *excludeVars[] = {"Submit", "submit", "SubmitFile", HGLFT_USERDATA_VAR, HGLFT_DATAFILE_VAR, HGLFT_ERRORHELP_VAR, NULL};