478610d3be4abc22e330f4fbb154a2ac8ac4abfa
max
  Tue Jan 20 15:24:18 2026 -0800
add strand filter option to oligoMatch track refs #36984

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 2c4f19ac1a9..b03b8ecbcad 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -1192,38 +1192,42 @@
  * Note that if you are extending this code, there is also a parallel copy
  * in src/hg/utils/oligoMatch/ that should be kept up to date!
  *
  */
 {
 char *dna = dnaInWindow();
 char *fOligo = oligoMatchSeq();
 toDna(fOligo);
 char *(*finder)(char *needle, char *haystack) = (anyIupac(fOligo) ? iupacIn : stringInWrapper);
 int oligoSize = strlen(fOligo);
 char *rOligo = cloneString(fOligo);
 char *rMatch = NULL, *fMatch = NULL;
 struct bed *bedList = NULL, *bed;
 char strand;
 int count = 0, maxCount = 1000000;
+char *strandFilter = cartUsualString(cart, oligoMatchStrandVar, oligoMatchStrandDefault);
+boolean searchForward = sameString(strandFilter, "both") || sameString(strandFilter, "forward");
+boolean searchReverse = sameString(strandFilter, "both") || sameString(strandFilter, "reverse");
 
 if (oligoSize >= 2)
     {
+    if (searchForward)
         fMatch = finder(fOligo, dna);
     iupacReverseComplement(rOligo, oligoSize);
     if (sameString(rOligo, fOligo))
         rOligo = NULL;
-    else
+    else if (searchReverse)
 	rMatch = finder(rOligo, dna);
     for (;;)
         {
 	char *oneMatch = NULL;
 	if (rMatch == NULL)
 	    {
 	    if (fMatch == NULL)
 		break;
 	    else
 		{
 		oneMatch = fMatch;
 		fMatch = finder(fOligo, fMatch+1);
 		strand = '+';
 		}
 	    }