001 /* 002 * The contents of this file are subject to the Mozilla Public 003 * License Version 1.1 (the "License"); you may not use this file 004 * except in compliance with the License. You may obtain a copy of 005 * the License at http://www.mozilla.org/MPL/ 006 * 007 * Software distributed under the License is distributed on an "AS 008 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 009 * implied. See the License for the specific language governing 010 * rights and limitations under the License. 011 * 012 * The Original Code is Knowtator. 013 * 014 * The Initial Developer of the Original Code is University of Colorado. 015 * Copyright (C) 2005 - 2008. All Rights Reserved. 016 * 017 * Knowtator was developed by the Center for Computational Pharmacology 018 * (http://compbio.uchcs.edu) at the University of Colorado Health 019 * Sciences Center School of Medicine with support from the National 020 * Library of Medicine. 021 * 022 * Current information about Knowtator can be obtained at 023 * http://knowtator.sourceforge.net/ 024 * 025 * Contributor(s): 026 * Philip V. Ogren <philip@ogren.info> (Original Author) 027 */ 028 029 package edu.uchsc.ccp.iaa.matcher; 030 031 import java.util.Collections; 032 import java.util.HashSet; 033 import java.util.Set; 034 035 import edu.uchsc.ccp.iaa.Annotation; 036 import edu.uchsc.ccp.iaa.IAA; 037 038 public class ClassAndSpanMatcher implements Matcher { 039 040 /** 041 * @param annotation 042 * @param compareSetName 043 * @param excludeAnnotations 044 * @param iaa 045 * @param matchResult 046 * will be set to NONTRIVIAL_MATCH or NONTRIVIAL_NONMATCH. 047 * Trivial matches and non-matches are not defined for this 048 * matcher. 049 * @see edu.uchsc.ccp.iaa.matcher.Matcher#match(Annotation, String, Set, 050 * IAA, MatchResult) 051 * @see edu.uchsc.ccp.iaa.matcher.MatchResult#NONTRIVIAL_MATCH 052 * @see edu.uchsc.ccp.iaa.matcher.MatchResult#NONTRIVIAL_NONMATCH 053 */ 054 public Annotation match(Annotation annotation, String compareSetName, Set<Annotation> excludeAnnotations, IAA iaa, 055 MatchResult matchResult) { 056 Annotation match = match(annotation, compareSetName, iaa, excludeAnnotations); 057 if (match != null) { 058 matchResult.setResult(MatchResult.NONTRIVIAL_MATCH); 059 return match; 060 } else { 061 matchResult.setResult(MatchResult.NONTRIVIAL_NONMATCH); 062 return null; 063 } 064 } 065 066 /** 067 * This is a static version of the above match method that can be called by 068 * other matcher implementations. 069 * 070 * @param annotation 071 * @param compareSetName 072 * @param iaa 073 * @param excludeAnnotations 074 * @return an annotation that matches or null. 075 */ 076 public static Annotation match(Annotation annotation, String compareSetName, IAA iaa, 077 Set<Annotation> excludeAnnotations) { 078 Set<Annotation> singleMatchSet = matches(annotation, compareSetName, iaa, excludeAnnotations, true); 079 if (singleMatchSet.size() == 1) { 080 return singleMatchSet.iterator().next(); 081 } else 082 return null; 083 084 } 085 086 /** 087 * 088 * @param annotation 089 * @param compareSetName 090 * @param iaa 091 * @param excludeAnnotations 092 * @param returnFirst 093 * if true then a set of size 1 will be returned as soon as a 094 * match is found. If false then all matches will be returned. 095 * @return this method will not return null - but rather an empty set of no 096 * matches are found. 097 */ 098 099 public static Set<Annotation> matches(Annotation annotation, String compareSetName, IAA iaa, 100 Set<Annotation> excludeAnnotations, boolean returnFirst) { 101 String type = annotation.getAnnotationClass(); 102 Set<Annotation> candidateAnnotations = new HashSet<Annotation>(iaa.getExactlyOverlappingAnnotations(annotation, 103 compareSetName)); 104 candidateAnnotations.removeAll(excludeAnnotations); 105 if (candidateAnnotations.size() == 0) 106 return Collections.emptySet(); 107 108 Set<Annotation> returnValues = new HashSet<Annotation>(); 109 for (Annotation candidateAnnotation : candidateAnnotations) { 110 if (!excludeAnnotations.contains(candidateAnnotation) 111 && candidateAnnotation.getAnnotationClass().equals(type)) { 112 returnValues.add(candidateAnnotation); 113 if (returnFirst) 114 return returnValues; 115 } 116 } 117 return returnValues; 118 } 119 120 public String getName() { 121 return "Class and span matcher"; 122 } 123 124 public String getDescription() { 125 126 return "Annotations match if they have the same class assignment and the same spans."; 127 } 128 129 public boolean returnsTrivials() { 130 return false; 131 } 132 133 }