X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FFinder.java;h=3c72598179d0541eb6d445295361b8349b9b8543;hb=7d6575e94bed92bc06043d432576e3a39e8a8e75;hp=1fa15e3a88a3e6d7458b81069ba890fbb2b1b4d9;hpb=2de8acfae59aced665e4c37ad0f7dcc2ed68818e;p=jalview.git diff --git a/src/jalview/analysis/Finder.java b/src/jalview/analysis/Finder.java index 1fa15e3..3c72598 100644 --- a/src/jalview/analysis/Finder.java +++ b/src/jalview/analysis/Finder.java @@ -1,26 +1,34 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) - * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.analysis; -import java.util.*; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.SearchResults; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceGroup; +import jalview.util.Comparison; -import jalview.datamodel.*; +import java.util.Vector; + +import com.stevesoft.pat.Regex; public class Finder { @@ -31,20 +39,22 @@ public class Finder AlignmentI alignment; - jalview.datamodel.SequenceGroup selection = null; + SequenceGroup selection = null; Vector idMatch = null; boolean caseSensitive = false; + private boolean includeDescription = false; + boolean findAll = false; - com.stevesoft.pat.Regex regex = null; + Regex regex = null; /** * hold's last-searched position between calles to find(false) */ - int seqIndex = 0, resIndex = 0; + int seqIndex = 0, resIndex = -1; public Finder(AlignmentI alignment, SequenceGroup selection) { @@ -52,6 +62,15 @@ public class Finder this.selection = selection; } + /** + * restart search at given sequence and residue on alignment and (optionally) + * contained in selection + * + * @param alignment + * @param selectionGroup + * @param seqIndex + * @param resIndex + */ public Finder(AlignmentI alignment, SequenceGroup selectionGroup, int seqIndex, int resIndex) { @@ -67,38 +86,17 @@ public class Finder { searchString = searchString.toUpperCase(); } - regex = new com.stevesoft.pat.Regex(searchString); + regex = new Regex(searchString); regex.setIgnoreCase(!caseSensitive); searchResults = new SearchResults(); idMatch = new Vector(); Sequence seq; String item = null; boolean found = false; - - // //// is the searchString a residue number? - try - { - int res = Integer.parseInt(searchString); - found = true; - if (selection == null || selection.getSize() < 1) - { - seq = (Sequence) alignment.getSequenceAt(0); - } - else - { - seq = (Sequence) (selection.getSequenceAt(0)); - } - - searchResults.addResult(seq, res, res); - hasResults = true; - } catch (NumberFormatException ex) - { - } + int end = alignment.getHeight(); // ///////////////////////////////////////////// - int end = alignment.getHeight(); - if (selection != null) { if ((selection.getSize() < 1) @@ -112,15 +110,64 @@ public class Finder { seq = (Sequence) alignment.getSequenceAt(seqIndex); - if ((selection != null && selection.getSize()>0) + if ((selection != null && selection.getSize() > 0) && !selection.getSequences(null).contains(seq)) { seqIndex++; - resIndex = 0; + resIndex = -1; continue; } + if (resIndex < 0) + { + resIndex = 0; + // test for one off matches - sequence position and sequence ID + // //// is the searchString a residue number? + try + { + int res = Integer.parseInt(searchString); + // possibly a residue number - check if valid for seq + if (seq.getEnd() >= res) + { + searchResults.addResult(seq, res, res); + hasResults = true; + // resIndex=seq.getLength(); + // seqIndex++; + if (!findAll) + { + found = true; + break; + } + } + } catch (NumberFormatException ex) + { + } + if (regex.search(seq.getName())) + { + idMatch.addElement(seq); + hasResults = true; + if (!findAll) + { + // stop and return the match + found = true; + break; + } + } + + if (isIncludeDescription() && seq.getDescription() != null + && regex.search(seq.getDescription())) + { + idMatch.addElement(seq); + hasResults = true; + if (!findAll) + { + // stop and return the match + found = true; + break; + } + } + } item = seq.getSequenceAsString(); if ((selection != null) @@ -136,7 +183,7 @@ public class Finder for (int j = 0; j < item.length(); j++) { - if (!jalview.util.Comparison.isGap(item.charAt(j))) + if (!Comparison.isGap(item.charAt(j))) { noGapsSB.append(item.charAt(j)); spaces.addElement(new Integer(insertCount)); @@ -156,13 +203,13 @@ public class Finder { resIndex = regex.matchedFrom(); - if ((selection != null && selection.getSize()>0) + if ((selection != null && selection.getSize() > 0) && ((resIndex + Integer.parseInt(spaces.elementAt( resIndex).toString())) < selection.getStartRes())) { continue; } - +// if invalid string used, then regex has no matched to/from int sres = seq .findPosition(resIndex + Integer.parseInt(spaces.elementAt(resIndex) @@ -194,18 +241,16 @@ public class Finder if (!found) { seqIndex++; - resIndex = 0; + resIndex = -1; } } - for (int id = 0; id < alignment.getHeight(); id++) - { - if (regex.search(alignment.getSequenceAt(id).getName())) - { - idMatch.addElement(alignment.getSequenceAt(id)); - hasResults = true; - } - } + /** + * We now search the Id string in the main search loop. for (int id = 0; id + * < alignment.getHeight(); id++) { if + * (regex.search(alignment.getSequenceAt(id).getName())) { + * idMatch.addElement(alignment.getSequenceAt(id)); hasResults = true; } } + */ return hasResults; } @@ -219,7 +264,7 @@ public class Finder /** * @param alignment - * the alignment to set + * the alignment to set */ public void setAlignment(AlignmentI alignment) { @@ -236,7 +281,7 @@ public class Finder /** * @param caseSensitive - * the caseSensitive to set + * the caseSensitive to set */ public void setCaseSensitive(boolean caseSensitive) { @@ -253,7 +298,7 @@ public class Finder /** * @param findAll - * the findAll to set + * the findAll to set */ public void setFindAll(boolean findAll) { @@ -263,16 +308,16 @@ public class Finder /** * @return the selection */ - public jalview.datamodel.SequenceGroup getSelection() + public SequenceGroup getSelection() { return selection; } /** * @param selection - * the selection to set + * the selection to set */ - public void setSelection(jalview.datamodel.SequenceGroup selection) + public void setSelection(SequenceGroup selection) { this.selection = selection; } @@ -288,7 +333,7 @@ public class Finder /** * @return the regex */ - public com.stevesoft.pat.Regex getRegex() + public Regex getRegex() { return regex; } @@ -311,7 +356,7 @@ public class Finder /** * @param resIndex - * the resIndex to set + * the resIndex to set */ public void setResIndex(int resIndex) { @@ -328,10 +373,20 @@ public class Finder /** * @param seqIndex - * the seqIndex to set + * the seqIndex to set */ public void setSeqIndex(int seqIndex) { this.seqIndex = seqIndex; } + + public boolean isIncludeDescription() + { + return includeDescription; + } + + public void setIncludeDescription(boolean includeDescription) + { + this.includeDescription = includeDescription; + } }