e70152e44cc66cc599ff6b699eb8adc07f3e656a kent Sat May 24 21:09:34 2014 -0700 Adding Copyright NNNN Regents of the University of California to all files I believe with reasonable certainty were developed under UCSC employ or as part of Genome Browser copyright assignment. diff --git src/hg/hgGenome/upload.c src/hg/hgGenome/upload.c index 371687b..af57264 100644 --- src/hg/hgGenome/upload.c +++ src/hg/hgGenome/upload.c @@ -1,245 +1,248 @@ /* Upload - put up upload pages and sub-pages. */ +/* Copyright (C) 2011 The Regents of the University of California + * See README in this or parent directory for licensing information. */ + #include "common.h" #include "linefile.h" #include "hash.h" #include "ra.h" #include "portable.h" #include "cheapcgi.h" #include "localmem.h" #include "cart.h" #include "web.h" #include "chromInfo.h" #include "chromGraph.h" #include "chromGraphFactory.h" #include "errCatch.h" #include "hPrint.h" #include "customTrack.h" #include "hgGenome.h" #include "trashDir.h" static char *markerNames[] = { cgfMarkerGuess, cgfMarkerGenomic, cgfMarkerSts, cgfMarkerSnp, // cgfMarkerAffy100, cgfMarkerAffy500, cgfMarkerAffy6, cgfMarkerAffy6SV, cgfMarkerHumanHap300, cgfMarkerHumanHap550, cgfMarkerHumanHap650, cgfMarkerHumanHap1M, cgfMarkerAgilentCgh244A, }; static char *formatNames[] = { cgfFormatGuess, cgfFormatTab, cgfFormatComma, cgfFormatSpace, }; static char *colLabelNames[] = { cgfColLabelGuess, cgfColLabelNumbered, cgfColLabelFirstRow, }; void uploadPage() /* Put up initial upload page. */ { char *oldFileName = cartUsualString(cart, hggUploadFile "__filename", ""); cartWebStart(cart, database, "Upload Data to Genome Graphs"); hPrintf("<FORM ACTION=\"../cgi-bin/hgGenome\" METHOD=\"POST\" ENCTYPE=\"multipart/form-data\">"); cartSaveSession(cart); hPrintf("name of data set: "); cartMakeTextVar(cart, hggDataSetName, "", 16); hPrintf("<BR>"); hPrintf("description: "); cartMakeTextVar(cart, hggDataSetDescription, "", 64); hPrintf("<BR>\n"); hPrintf("file format: "); cgiMakeDropList(hggFormatType, formatNames, ArraySize(formatNames), cartUsualString(cart, hggFormatType, formatNames[0])); hPrintf("<BR>\n"); hPrintf(" markers are: "); cgiMakeDropList(hggMarkerType, markerNames, ArraySize(markerNames), cartUsualString(cart, hggMarkerType, markerNames[0])); hPrintf("<BR>\n"); hPrintf(" column labels: "); cgiMakeDropList(hggColumnLabels, colLabelNames, ArraySize(colLabelNames), cartUsualString(cart, hggColumnLabels, colLabelNames[0])); hPrintf("<BR>\n"); hPrintf("display min value: "); cartMakeTextVar(cart, hggMinVal, "", 5); hPrintf(" max value: "); cartMakeTextVar(cart, hggMaxVal, "", 5); hPrintf("<BR>\n"); hPrintf("label values: "); cartMakeTextVar(cart, hggLabelVals, "", 32); hPrintf("<BR>\n"); hPrintf("draw connecting lines between markers separated by up to "); cartMakeIntVar(cart, hggMaxGapToFill, 25000000, 8); hPrintf(" bases.<BR>"); hPrintf("<BR>\n"); hPrintf("file name: <INPUT TYPE=FILE NAME=\"%s\" VALUE=\"%s\">", hggUploadFile, oldFileName); hPrintf("<BR>\n"); hPrintf(" or<BR>\n"); hPrintf("Paste URLs or data:<br>"); cgiMakeTextArea(hggUploadUrl, "", 7, 73); hPrintf("<BR>\n"); hPrintf("<BR>\n"); cgiMakeButton(hggSubmitUpload, "submit"); hPrintf("</FORM>\n"); hPrintf("<i>Note: If you are uploading more than one data set please give them "); hPrintf("different names. Only the most recent data set of a given name is "); hPrintf("kept. Otherwise data sets will be kept for at least 48 hours from "); hPrintf("last use. After that time you may have to upload them again.</i>"); /* Put up section that describes file formats. */ webNewSection("Upload file formats"); hPrintf("%s", "<P>The upload file is a table in some format. In all formats there is " "a single line for each marker. " "Each line starts with information on the marker, and ends with " "the numerical values associated with that marker. The exact format " "of the line depends on what is selected from the markers drop " "down menu. If this is <i>chromosome base</i> then the line will " "contain the tab or space-separated fields: chromosome, position, " "and value(s). The first base in a chromosome is considered position 0. " "An example <i>chromosome base</i> type line is:<PRE><TT>\n" "chrX 100000 1.23\n" "</TT></PRE>The lines for other marker types contain two fields: " "marker and value(s). For dbSNP rsID's an example is:<PRE><TT>\n" "rs10218492 0.384\n" "</TT></PRE>" "</P><P>" "The file can contain multiple value fields. In this case a " "separate graph will be available for each value column in the input " "table. It's a " "good idea to set the display min/max values above if you want the " "graphs to share the same scale." "</P>" ); webNewSection("Using the upload page"); hPrintf( "To upload a file in any of the supported formats, " "locate the file on your computer using the controls next to <B>file name</B>, " "or supply a <B>URL</B> to the data, " "and then submit. The other controls on this form are optional, though " "filling them out will sometimes enhance the display. In general " "the controls that default to <i>best guess</i> can be left alone, " "since the guess is almost always correct. The controls for display min and " "max values and connecting lines can be set later via the configuration " "page as well. Here is a description of each control." "<UL>" "<LI><B>name of data set:</B> Displayed in graph drop-down in Genome Graphs " " and as trackname in Genome Browser. Only the first 16 characters are " " visible in some contexts. For data sets with multiple graphs, this is the " " first part of the name, shared with all members of the data set.</LI>" "<LI><B>description:</B> A short sentence describing the data set. Displayed in " "the Genome Graphs and Genome Browser configuration pages, and as the center " "label in the Genome Browser.</LI>" "<LI><B>file format:</B> Controls whether the upload file is a tab-separated, " " comma-separated, or space separated table.</LI>" "<LI><B>markers are:</B> Describes how to map the data to chromosomes. The choices " " are either the first column of the file is an ID of some sort, or the first column " " is a chromosome and the next a base. The IDs can be SNP rs numbers, STS marker names " " or ID's from any of the supported genotyping platforms.</LI>" "<LI><B>column labels:</B> Controls whether the first row of the upload file is " " interpreted as labels rather than data. If the first row contains text in the " " numerical fields, or if the mapping fields are empty, it is interpreted by " " \"best guess\" as labels. This is generally correct, but you can override this " " interpretation by explicitly setting the control. </LI>" "<LI><B>display min value/max value:</B> Set the range of the data set that will " " be plotted. If left blank, the range will be taken from the min/max values in the " " data set itself. For all data sets to share the same scale usually you'll need " " to set this.</LI>" "<LI><B>label values:</B> A comma-separated list of numbers for the vertical axis. " " If left blank the axis will be labeled at the 1/3 and 2/3 point. </LI>" "<LI><B>draw connecting lines:</B> Lines connecting data points separated by " " no more than this number of bases are drawn. </LI>" "<LI><B>file name, or Paste URLs or data:</B> Specify the uploaded data --" " enter either a file on your local computer; or a URL at which the data file can be" " found; or simply paste-in the data. If entries are made in both fields, the file name will take" " precedence. </LI>"); cartWebEnd(); } static void addIfNonempty(struct hash *hash, char *cgiVar, char *trackVar) /* If cgiVar exists and is non-empty, add it to ra. */ { char *val = skipLeadingSpaces(cartUsualString(cart, cgiVar, "")); if (val[0] != 0) hashAdd(hash, trackVar, val); } void updateCustomTracks(struct customTrack *upList) /* Update custom tracks file with current upload data */ { struct customTrack *oldList = customTracksParseCart(database, cart, NULL, NULL); struct customTrack *outList = customTrackAddToList(oldList, upList, NULL, FALSE); customTracksSaveCart(database, cart, outList); hPrintf("These data are now available in the drop-down menus on the "); hPrintf("main page for graphing.<BR>"); } void trySubmitUpload(struct sqlConnection *conn, char *rawText) /* Called when they've submitted from uploads page */ { struct lineFile *lf = lineFileOnString("uploaded data", TRUE, rawText); struct customPp *cpp = customPpNew(lf); struct hash *settings = hashNew(8); addIfNonempty(settings, hggMinVal, "minVal"); addIfNonempty(settings, hggMaxVal, "maxVal"); addIfNonempty(settings, hggMaxGapToFill, "maxGapToFill"); addIfNonempty(settings, hggLabelVals, "linesAt"); struct customTrack *trackList = chromGraphParser(database, cpp, cartUsualString(cart, hggFormatType, formatNames[0]), cartUsualString(cart, hggMarkerType, cgfMarkerGenomic), cartUsualString(cart, hggColumnLabels, colLabelNames[0]), nullIfAllSpace(cartUsualString(cart, hggDataSetName, NULL)), nullIfAllSpace(cartUsualString(cart, hggDataSetDescription, NULL)), settings, TRUE); updateCustomTracks(trackList); } void submitUpload(struct sqlConnection *conn) /* Called when they've submitted from uploads page */ { char *urlText = cartUsualString(cart, hggUploadUrl, NULL); char *fileText = cartUsualString(cart, hggUploadFile, NULL); char *rawText = urlText; if (isNotEmpty(fileText)) rawText = fileText; int rawTextSize = strlen(rawText); struct errCatch *errCatch = errCatchNew(); cartWebStart(cart, database, "Data Upload Complete (%d bytes)", rawTextSize); hPrintf("<FORM ACTION=\"../cgi-bin/hgGenome\">"); cartSaveSession(cart); if (errCatchStart(errCatch)) trySubmitUpload(conn, rawText); errCatchFinish(&errCatch); cartRemove(cart, hggUploadFile); hPrintf("<CENTER>"); cgiMakeButton("submit", "OK"); hPrintf("</CENTER>"); hPrintf("</FORM>"); cartWebEnd(); }