b7c2dcc865207dd23298429f93057c9068acef68
angie
Wed Dec 9 15:48:34 2020 -0800
hgPhyloPlace: Add config option treeChoices: tab-sep file of {protobuf, metadata, source, description} so we can offer the user a choice between GISAID and public sequence trees (possibly different releases for reproducibility).
diff --git src/hg/hgPhyloPlace/hgPhyloPlace.c src/hg/hgPhyloPlace/hgPhyloPlace.c
index f3fb03e..ca2ac83 100644
--- src/hg/hgPhyloPlace/hgPhyloPlace.c
+++ src/hg/hgPhyloPlace/hgPhyloPlace.c
@@ -149,31 +149,32 @@
webEndJWest();
}
#define CHECK_FILE_INPUT_JS "{ var $fileInput = $('input[name="seqFileVar"]'); " \
"if ($fileInput && $fileInput[0] && $fileInput[0].files && !$fileInput[0].files.length) {" \
" alert('Please choose a file first, then click the upload button.');" \
" return false; " \
"} else { return true; } }"
static void inputForm()
/* Ask the user for FASTA or VCF. */
{
printf("<form action='%s' name='mainForm' method=POST enctype='multipart/form-data'>\n\n",
"hgPhyloPlace");
cartSaveSession(cart);
-cgiMakeHiddenVar("db", "wuhCor1");
+char *db = "wuhCor1";
+cgiMakeHiddenVar("db", db);
puts(" <div class='gbControl col-md-12'>");
puts("<div class='readableWidth'>");
puts("<p>Upload your SARS-CoV-2 sequence (FASTA or VCF file) to find the most similar\n"
"complete, high-coverage samples from \n"
"<a href='https://www.gisaid.org/' target='_blank'>GISAID</a>\n"
"and your sequence's placement in the phylogenetic tree generated by the\n"
"<a href='https://github.com/roblanf/sarscov2phylo' target='_blank'>sarscov2phylo</a>\n"
"pipeline.\n"
"Placement is performed by\n"
"<a href='https://github.com/yatisht/usher' target=_blank>"
"Ultrafast Sample placement on Existing tRee (UShER)</a> "
"(<a href='https://www.biorxiv.org/content/10.1101/2020.09.26.314971v1' target=_blank>"
"Turakhia <em>et al.</em></a>). UShER also generates local subtrees to show samples "
"in the context of the most closely related sequences. The subtrees can be visualized "
"as Genome Browser custom tracks and/or using "
@@ -189,39 +190,52 @@
"<p>We do not store your information "
"(aside from the information necessary to display results)\n"
"and will not share it with others unless you choose to share your Genome Browser view.</p>\n"
"<p>In order to enable rapid progress in SARS-CoV-2 research and genomic contact tracing,\n"
"please share your SARS-CoV-2 sequences by submitting them to an "
"<a href='https://ncbiinsights.ncbi.nlm.nih.gov/2020/08/17/insdc-covid-data-sharing/' "
"target=_blank>INSDC</a> member institution\n"
"(<a href='https://submit.ncbi.nlm.nih.gov/sarscov2/' target=_blank>NCBI</a>,\n"
"<a href='https://www.covid19dataportal.org/submit-data' target=_blank>EMBL-EBI</a>\n"
"or <a href='https://www.ddbj.nig.ac.jp/ddbj/websub.html' target=_blank>DDBJ</a>)\n"
"and <a href='https://www.gisaid.org/' target=_blank>GISAID</a>.\n"
"</p>\n");
puts("</div>");
puts(" </div>");
puts(" <div class='gbControl col-md-12'>");
+printf("<p>Select your FASTA or VCF file: ");
printf("<input type='file' id='%s' name='%s' "
"accept='.fa, .fasta, .vcf, .vcf.gz, .fa.gz, .fasta.gz'>",
seqFileVar, seqFileVar);
+struct treeChoices *treeChoices = loadTreeChoices(db);
+if (treeChoices)
+ {
+ puts("</p><p>");
+ printf("Phylogenetic tree version: ");
+ char *phyloPlaceTree = cartOptionalString(cart, "phyloPlaceTree");
+ cgiMakeDropListWithVals("phyloPlaceTree", treeChoices->descriptions, treeChoices->protobufFiles,
+ treeChoices->count, phyloPlaceTree);
+ }
+puts("</p><p>");
printf("Number of samples per subtree showing sample placement: ");
int subtreeSize = cartUsualInt(cart, "subtreeSize", 50);
cgiMakeIntVarWithLimits("subtreeSize", subtreeSize,
"Number of samples in subtree showing neighborhood of placement",
5, 10, 1000);
+puts("</p><p>");
cgiMakeOnClickSubmitButton(CHECK_FILE_INPUT_JS, "submit", "upload");
+puts("</p>");
puts(" </div>");
puts("</form>");
}
static void exampleForm()
/* Let the user try Russ's example. */
{
printf("<form action='%s' name='exampleForm' method=POST>\n\n",
"hgPhyloPlace");
cartSaveSession(cart);
cgiMakeHiddenVar("db", "wuhCor1");
puts(" <div class='gbControl col-md-12'>");
puts("If you don't have a local file, you can try an "
"<a href='https://github.com/russcd/USHER_DEMO/' target=_blank>example</a>: ");
cgiMakeButton("submit", "try example");
@@ -305,32 +319,34 @@
" </div>\n"
"</div>\n"
"<div class='row'>\n");
// Form submits subtree custom tracks to hgTracks
printf("<form action='%s' name='resultsForm' method=%s>\n\n",
hgTracksName(), cartUsualString(cart, "formMethod", "POST"));
cartSaveSession(cart);
puts(" <div class='gbControl col-md-12'>");
if (lf != NULL)
{
// Use trackLayout to get hgTracks parameters relevant to displaying trees:
struct trackLayout tl;
trackLayoutInit(&tl, cart);
// Do our best to place the user's samples, make custom tracks if successful:
+ char *phyloPlaceTree = cartOptionalString(cart, "phyloPlaceTree");
int subtreeSize = cartUsualInt(cart, "subtreeSize", 50);
- char *ctFile = phyloPlaceSamples(lf, db, measureTiming, subtreeSize, tl.fontHeight);
+ char *ctFile = phyloPlaceSamples(lf, db, phyloPlaceTree, measureTiming, subtreeSize,
+ tl.fontHeight);
if (ctFile)
{
cgiMakeHiddenVar(CT_CUSTOM_TEXT_VAR, ctFile);
if (tl.leftLabelWidthChars < 0 || tl.leftLabelWidthChars == leftLabelWidthDefaultChars)
cgiMakeHiddenVar(leftLabelWidthVar, leftLabelWidthForLongNames);
cgiMakeButton("submit", "view in Genome Browser");
puts(" </div>");
puts("</form>");
}
else
{
puts(" </div>");
puts("</form>");
// Let the user upload something else and try again:
inputForm();