80a8dbcfd43490512f126712ee37dcaf249aa0bc max Wed May 1 16:32:24 2013 -0700 making it possible to link to hgc without t and o parameters (europmc) diff --git src/hg/hgc/pubs.c src/hg/hgc/pubs.c index 90c0571..906e3c0 100644 --- src/hg/hgc/pubs.c +++ src/hg/hgc/pubs.c @@ -205,31 +205,33 @@ "", hgTracksPathAndSettings(), database, seqName, start+1, end); char startBuf[64], endBuf[64]; sprintLongWithCommas(startBuf, start + 1); sprintLongWithCommas(endBuf, end); printf("%s:%s-%s
\n", seqName, startBuf, endBuf); long size = end - start; sprintLongWithCommas(startBuf, size); if (showSize) printf("Genomic Size: %s
\n", startBuf); } static void printFilterLink(char *pslTrack, char *articleId, char *articleTable) /* print a link to hgTracks with an additional cgi param to activate the single article filter */ { - int start = cgiInt("o"); + int start = cgiOptionalInt("o", -1); + if (start==-1) + return; int end = cgiInt("t"); char qBuf[1024]; struct sqlConnection *conn = hAllocConn(database); safef(qBuf, sizeof(qBuf), "SELECT CONCAT(firstAuthor, year) FROM %s WHERE articleId='%s';", articleTable, articleId); char *dispId = sqlQuickString(conn, qBuf); printf( "
"); printf( "

", hgTracksPathAndSettings(), database, seqName, start+1, end, articleId, pslTrack, dispId); printf("Show these sequence matches individually on genome browser (activates track \"" "Individual matches for article\")

"); @@ -458,58 +460,64 @@ articleSource = row[7]; extId = row[8]; url = mangleUrl(url); if (strlen(abstract)==0) abstract = "(No abstract available for this article. " "Please follow the link to the fulltext above by clicking on the titel or the fulltext image.)"; if (stringIn("sciencedirect.com", url)) { pubsHasSupp = FALSE; pubsIsElsevier = TRUE; } // authors title -printf("
\n"); +printf("
\n"); printf("

%s

\n", authors); -printf("%s\n", url, title); - +// // logo of publisher char *logoUrl = urlToLogoUrl(conn, pubsArticleTable, articleId, url); if (logoUrl) printf("\n", url, logoUrl); freeMem(logoUrl); + +printf("
"); +printf("%s
\n", url, title); +printf("
\n"); printf("
\n"); -printf("

%s", cit); + +printf("

%s", cit); if (strlen(pmid)!=0 && strcmp(pmid, "0")) printf(", PMID%s\n", pmid, pmid); printf("

\n"); -printf("

%s

\n", abstract); +printf("

%s

\n", abstract); if (pubsIsElsevier) printf("

Copyright 2012 Elsevier B.V. All rights reserved.

"); sqlFreeResult(&sr); return articleId; } static struct hash *getSeqIdHash(struct sqlConnection *conn, char *trackTable, \ char *articleId, char *item, char *seqName, int start) /* return a hash with the sequence IDs for a given chain of BLAT matches */ { +if (start==-1) + return NULL; char query[512]; /* check first if the column exists (some debugging tables on hgwdev don't have seqIds) */ safef(query, sizeof(query), "SHOW COLUMNS FROM %s LIKE 'seqIds';", trackTable); char *seqIdPresent = sqlQuickString(conn, query); if (!seqIdPresent) { return NULL; } /* get sequence-Ids for feature that was clicked (item&startPos are unique) and return as hash*/ safef(query, sizeof(query), "SELECT seqIds,'' FROM %s WHERE name='%s' " "and chrom='%s' and chromStart=%d;", trackTable, item, seqName, start); if (pubsDebug) printf("%s
", query); // split comma-sep list into parts @@ -537,31 +545,31 @@ web2StartTableC("stdTbl centeredStdTbl"); web2StartTheadC("stdTblHead"); if (showDesc) web2PrintHeaderCell("Article file", 10); // yif sequences have no flanking text at M. Krauthammer's request if (stringIn("yif", articleSource)) web2PrintHeaderCell("Matching sequences", 60); else web2PrintHeaderCell("One row per sequence, with flanking text, sequence in bold", 60); if (pubsDebug) web2PrintHeaderCell("Identifiers", 30); if (!isClickedSection && !pubsDebug) - web2PrintHeaderCell("Chained matches with this sequence", 20); + web2PrintHeaderCell("Link to matching genomic location", 20); web2EndThead(); web2StartTbodyS("font-family: Arial, Helvetica, sans-serif; line-height: 1.5em; font-size: 0.9em;"); } static void printAddWbr(char *text, int distance) /* a crazy hack for firefox/mozilla that is unable to break long words in tables * We need to add a tag every x characters in the text to make text breakable. */ { int i; i = 0; char *c; c = text; bool doNotBreak = FALSE; while (*c != 0) @@ -683,31 +691,31 @@ "FROM %s WHERE articleId='%s';", pubsSequenceTable, articleId); if (pubsDebug) puts(query); struct sqlResult *sr = sqlGetResult(conn, query); // construct title for section char *otherFormat = NULL; if (fasta) otherFormat = "table"; else otherFormat = "fasta"; char fullTitle[5000]; safef(fullTitle, sizeof(fullTitle), "%s (%s format)\n", -title, cartSidUrlString(cart), cgiString("o"), cgiString("t"), cgiString("g"), cgiString("i"), +title, cartSidUrlString(cart), cgiOptionalString("o"), cgiOptionalString("t"), cgiString("g"), cgiString("i"), !fasta, otherFormat); web2StartSection("pubsSection", "%s", fullTitle); // print filtering link at start of table & table headers if (isClickedSection) { printFilterLink(pslTable, articleId, articleTable); } if (!fasta) printSeqHeaders(showDesc, isClickedSection); // output rows char **row; @@ -832,31 +840,36 @@ bool skippedRows; if (clickedSeqs) skippedRows = printSeqSection(articleId, "Sequences matching here", \ fileDesc, conn, clickedSeqs, 1, fasta, pslTable, articleTable); else skippedRows=1; if (skippedRows) { // the section title should change if the data comes from the yale image finder = a figure char* docType = "article"; if (stringIn("yif", articleSource)) docType = "figure"; char title[1024]; + if (clickedSeqs) safef(title, sizeof(title), "Other Sequences in this %s", docType); + // NO clicked seqs can happen if the hgc was called with no o or t parameters + // from somewhere outside the browser, like elsevier or europmc + else + safef(title, sizeof(title), "Sequences in this %s", docType); printSeqSection(articleId, title, \ fileDesc, conn, clickedSeqs, 0, fasta, pslTable, articleTable); } freeHash(&clickedSeqs); } static void printTrackVersion(struct trackDb *tdb, struct sqlConnection *conn, char *item) { char versionString[256]; char dateReference[256]; char headerTitle[512]; /* see if hgFixed.trackVersion exists */ boolean trackVersionExists = hTableExists("hgFixed", "trackVersion"); @@ -961,32 +974,32 @@ } psl->blockSizes[i] = bs/3; } } else qt = gftDna; showSomeAlignment(psl, oSeq, qt, 0, oSeq->size, NULL, 0, 0); } void doPubsDetails(struct trackDb *tdb, char *item) /* publications custom display */ { -int start = cgiInt("o"); -int end = cgiOptionalInt("t", 0); +int start = cgiOptionalInt("o", -1); +int end = cgiOptionalInt("t", -1); char *trackTable = cgiString("g"); char *aliTable = cgiOptionalString("aliTable"); int fasta = cgiOptionalInt("fasta", 0); pubsDebug = cgiOptionalInt("debug", 0); struct sqlConnection *conn = hAllocConn(database); char *articleTable = trackDbRequiredSetting(tdb, "pubsArticleTable"); if (stringIn("Psl", trackTable)) { if (aliTable!=NULL) { pubsSequenceTable = trackDbRequiredSetting(tdb, "pubsSequenceTable"); pubsAli(conn, trackTable, pubsSequenceTable, item); @@ -995,33 +1008,35 @@ else { genericHeader(tdb, item); struct psl *psl = getAlignments(conn, trackTable, item); printf("

Genomic Alignment with sequence found in publication fulltext

"); printAlignmentsSimple(psl, start, trackTable, trackTable, item); } } else { printTrackVersion(tdb, conn, item); if (stringIn("Marker", trackTable)) { char *markerTable = trackDbRequiredSetting(tdb, "pubsMarkerTable"); + if (start!=-1) printPositionAndSize(start, end, 0); printMarkerSnippets(conn, articleTable, markerTable, item); } else { pubsSequenceTable = trackDbRequiredSetting(tdb, "pubsSequenceTable"); char *articleId = printArticleInfo(conn, item, articleTable); if (articleId!=NULL) { char *pslTable = trackDbRequiredSetting(tdb, "pubsPslTrack"); - printSeqInfo(conn, trackTable, pslTable, articleId, item, seqName, start, pubsHasSupp, fasta, articleTable); + printSeqInfo(conn, trackTable, pslTable, articleId, item, \ + seqName, start, pubsHasSupp, fasta, articleTable); } } } printTrackHtml(tdb); hFreeConn(&conn); }