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;
030
031 import java.util.Collection;
032 import java.util.HashMap;
033 import java.util.HashSet;
034 import java.util.List;
035 import java.util.Map;
036 import java.util.Set;
037
038 /**
039 * This class creates an index on a collection of annotations based on the
040 * proximity of the spans of the annotations.
041 *
042 */
043
044 public class AnnotationSpanIndex {
045
046 Map<Integer, Set<Annotation>> window2AnnotationsMap;
047
048 int windowSize;
049
050 public AnnotationSpanIndex(Collection<Annotation> annotations) {
051 this(annotations, 20);
052 }
053
054 public AnnotationSpanIndex(Collection<Annotation> annotations, int windowSize) {
055 this.windowSize = windowSize;
056 window2AnnotationsMap = new HashMap<Integer, Set<Annotation>>();
057 for (Annotation annotation : annotations) {
058 List<Span> spans = annotation.getSpans();
059 for (Span span : spans) {
060 int startKey = span.getStart() / windowSize;
061 int endKey = span.getEnd() / windowSize;
062 for (int key = startKey; key <= endKey; key++) {
063 addToMap(key, annotation);
064 }
065 }
066 }
067
068 // for(Integer window : window2AnnotationsMap.keySet())
069 // {
070 // Set<Annotation> windowAnnotations =
071 // window2AnnotationsMap.get(window);
072 // for(Annotation windowAnnotation : windowAnnotations)
073 // {
074 // Collection<Span> spans = windowAnnotation.getSpans();
075 // }
076 // }
077 }
078
079 private void addToMap(int key, Annotation annotation) {
080 if (!window2AnnotationsMap.containsKey(key)) {
081 window2AnnotationsMap.put(key, new HashSet<Annotation>());
082 }
083 window2AnnotationsMap.get(key).add(annotation);
084 }
085
086 public Set<Annotation> getNearbyAnnotations(Annotation annotation) {
087 Collection<Span> spans = annotation.getSpans();
088 HashSet<Integer> windows = new HashSet<Integer>();
089 for (Span span : spans) {
090 windows.add(new Integer(span.getStart() / windowSize));
091 windows.add(new Integer(span.getEnd() / windowSize));
092 }
093
094 HashSet<Annotation> returnValues = new HashSet<Annotation>();
095 for (Integer window : windows) {
096 Set<Annotation> windowAnnotations = window2AnnotationsMap.get(window);
097 if (windowAnnotations != null)
098 returnValues.addAll(windowAnnotations);
099 }
100
101 returnValues.remove(annotation);
102 return returnValues;
103 }
104
105 public Set<Annotation> getOverlappingAnnotations(Annotation annotation) {
106 Set<Annotation> nearbyAnnotations = getNearbyAnnotations(annotation);
107 Set<Annotation> returnValues = new HashSet<Annotation>();
108 for (Annotation nearbyAnnotation : nearbyAnnotations) {
109 if (Annotation.spansOverlap(annotation, nearbyAnnotation)) {
110 returnValues.add(nearbyAnnotation);
111 }
112 }
113 return returnValues;
114 }
115
116 public Set<Annotation> getExactlyOverlappingAnnotations(Annotation annotation) {
117 Set<Annotation> nearbyAnnotations = getNearbyAnnotations(annotation);
118 Set<Annotation> returnValues = new HashSet<Annotation>();
119 for (Annotation nearbyAnnotation : nearbyAnnotations) {
120 if (Annotation.spansMatch(annotation, nearbyAnnotation)) {
121 returnValues.add(nearbyAnnotation);
122 }
123 }
124 return returnValues;
125 }
126
127 }