src/hg/hgc/hgc.c 1.1618

1.1618 2010/05/01 04:44:16 markd
include link back to browser in tables of PSL. also fix corner case on PAR were link to wrong chrom
Index: src/hg/hgc/hgc.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgc/hgc.c,v
retrieving revision 1.1617
retrieving revision 1.1618
diff -b -B -U 4 -r1.1617 -r1.1618
--- src/hg/hgc/hgc.c	30 Apr 2010 21:24:50 -0000	1.1617
+++ src/hg/hgc/hgc.c	1 May 2010 04:44:16 -0000	1.1618
@@ -5126,36 +5126,46 @@
 hFreeConn(&conn);
 hFreeConn(&conn2);
 }
 
+static boolean isPslToPrintByClick(struct psl *psl, int startFirst, boolean isClicked)
+/* Determine if a psl should be printed based on if it was or was not the one that was clicked
+ * on.
+ */
+{
+return ((psl->tStart == startFirst) && sameString(psl->tName, seqName)) == isClicked;
+}
+
 void printAlignmentsSimple(struct psl *pslList, int startFirst, char *hgcCommand,
                            char *typeName, char *itemIn)
 /* Print list of mRNA alignments, don't add extra textual link when
  * doesn't honor hgcCommand. */
 {
 struct psl *psl;
 int aliCount = slCount(pslList);
-boolean same;
+boolean isClicked;
 if (pslList == NULL || typeName == NULL)
     return;
 
 if (aliCount > 1)
     printf("The alignment you clicked on is first in the table below.<BR>\n");
 
 printf("<PRE><TT>");
 if (startsWith("chr", pslList->tName))
-    printf(" SIZE IDENTITY CHROMOSOME  STRAND    START     END              QUERY      START  END  TOTAL\n");
+    printf("BROWSER | SIZE IDENTITY CHROMOSOME  STRAND    START     END              QUERY      START  END  TOTAL\n");
 else
-    printf(" SIZE IDENTITY  SCAFFOLD   STRAND    START     END              QUERY      START  END  TOTAL\n");
-printf("--------------------------------------------------------------------------------------------\n");
-for (same = 1; same >= 0; same -= 1)
+    printf("BROWSER | SIZE IDENTITY  SCAFFOLD   STRAND    START     END              QUERY      START  END  TOTAL\n");
+printf("-----------------------------------------------------------------------------------------------------\n");
+for (isClicked = 1; isClicked >= 0; isClicked -= 1)
     {
     for (psl = pslList; psl != NULL; psl = psl->next)
 	{
-	if (same ^ (psl->tStart != startFirst))
+	if (isPslToPrintByClick(psl, startFirst, isClicked))
 	    {
             char otherString[512];
-	    sprintf(otherString, "%d&aliTrack=%s", psl->tStart, typeName);
+	    safef(otherString, sizeof(otherString), "%d&aliTrack=%s", psl->tStart, typeName);
+            printf("<A HREF=\"%s&db=%s&position=%s%%3A%d-%d\">browser</A> | ",
+                   hgTracksPathAndSettings(), database, psl->tName, psl->tStart+1, psl->tEnd);
 	    hgcAnchorSomewhere(hgcCommand, itemIn, otherString, psl->tName);
 	    printf("%5d  %5.1f%%  %9s     %s %9d %9d  %20s %5d %5d %5d</A>",
 		   psl->match + psl->misMatch + psl->repMatch,
 		   100.0 - pslCalcMilliBad(psl, TRUE) * 0.1,
@@ -5183,8 +5193,9 @@
 	&&
 	!startsWith("xeno", typeName)
 	&& !(startsWith("user", typeName) && pslIsProtein(psl))
 	&& psl->tStart == startFirst
+        && sameString(psl->tName, seqName)
 	)
 	{
         char otherString[512];
 	safef(otherString, sizeof(otherString), "%d&aliTrack=%s",
@@ -6500,10 +6510,10 @@
     }
 
 /* Look up alignments in database */
 hFindSplitTable(database, seqName, type, table, &hasBin);
-sprintf(query, "select * from %s where qName = '%s' and tStart=%d",
-	table, acc, start);
+sprintf(query, "select * from %s where qName = '%s' and tName=\"%s\" and tStart=%d",
+	table, acc, seqName, start);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) == NULL)
     errAbort("Couldn't find alignment for %s at %d", acc, start);
 psl = pslLoad(row+hasBin);
@@ -6634,10 +6644,10 @@
     {
     /* Look up alignments in database */
     hFindSplitTable(database, seqName, track, table, &hasBin);
     safef(query, sizeof(query),
-	  "select * from %s where qName = '%s' and tStart=%d",
-	  table, acc, start);
+	  "select * from %s where qName = '%s' and tName=\"%s\" and tStart=%d",
+	  table, acc, seqName, start);
     sr = sqlGetResult(conn, query);
     if ((row = sqlNextRow(sr)) == NULL)
 	errAbort("Couldn't find alignment for %s at %d", acc, start);
     wholePsl = pslLoad(row+hasBin);
@@ -18546,9 +18556,9 @@
 /* Show protein to translated dna alignment for accession. */
 {
 char startBuf[64], endBuf[64];
 int start = cartInt(cart, "o");
-boolean same;
+boolean isClicked;
 struct psl *psl = 0;
 struct sqlResult *sr = NULL;
 struct sqlConnection *conn = hAllocConn(database);
 char query[256], **row;
@@ -18704,13 +18714,13 @@
     printf("<P>The alignment you clicked on is first in the table below.<BR>\n");
 printf("<TT><PRE>");
 printf("ALIGNMENT PEPTIDE COVERAGE IDENTITY  START END EXTENT  STRAND   LINK TO BROWSER \n");
 printf("--------------------------------------------------------------------------------\n");
-for (same = 1; same >= 0; same -= 1)
+for (isClicked = 1; isClicked >= 0; isClicked -= 1)
     {
     for (psl = pslList; psl != NULL; psl = psl->next)
 	{
-	if (same ^ (psl->tStart != start))
+	if (isPslToPrintByClick(psl, start, isClicked))
 	    {
 	    printf("<A HREF=\"%s&o=%d&g=htcProteinAli&i=%s&c=%s&l=%d&r=%d&db=%s&aliTrack=%s&pred=%s\">",
 		hgcPathAndSettings(), psl->tStart, psl->qName,  psl->tName,
 		psl->tStart, psl->tEnd, database,tdb->tableName, pred);
@@ -18730,9 +18740,9 @@
 		   tdb->tableName, itemName);
 	    sprintLongWithCommas(startBuf, psl->tStart + 1);
 	    sprintLongWithCommas(endBuf, psl->tEnd);
 	    printf("%s:%s-%s</A> <BR>",psl->tName,startBuf, endBuf);
-	    if (same)
+	    if (isClicked)
 		printf("\n");
 	    }
 	}
     }