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    package edu.uchsc.ccp.knowtator.util;
029    
030    import java.util.Collection;
031    import java.util.HashMap;
032    import java.util.HashSet;
033    import java.util.Map;
034    import java.util.Set;
035    
036    import edu.stanford.smi.protege.model.Cls;
037    import edu.stanford.smi.protege.model.KnowledgeBase;
038    import edu.stanford.smi.protege.model.SimpleInstance;
039    import edu.stanford.smi.protege.util.CollectionUtilities;
040    import edu.uchsc.ccp.knowtator.AnnotationUtil;
041    import edu.uchsc.ccp.knowtator.FilterUtil;
042    import edu.uchsc.ccp.knowtator.InvalidSpanException;
043    import edu.uchsc.ccp.knowtator.KnowtatorManager;
044    import edu.uchsc.ccp.knowtator.KnowtatorProjectUtil;
045    import edu.uchsc.ccp.knowtator.MentionUtil;
046    import edu.uchsc.ccp.knowtator.textsource.TextSourceAccessException;
047    
048    public class ConsensusAnnotations {
049    
050            public static ConsensusSet recreateConsensusAnnotations(SimpleInstance textSource, SimpleInstance consensusSet,
051                            KnowtatorManager manager) throws ConsensusException {
052                    KnowledgeBase kb = manager.getKnowledgeBase();
053                    KnowtatorProjectUtil kpu = manager.getKnowtatorProjectUtil();
054                    AnnotationUtil annotationUtil = manager.getAnnotationUtil();
055                    MentionUtil mentionUtil = manager.getMentionUtil();
056                    FilterUtil filterUtil = manager.getFilterUtil();
057    
058                    SimpleInstance consensusFilter = (SimpleInstance) consensusSet.getOwnSlotValue(kpu
059                                    .getConsensusSetConsensusFilterSlot());
060    
061                    Collection<SimpleInstance> annotations = annotationUtil.getAnnotations(textSource);
062                    if (annotations != null) {
063                            Collection<SimpleInstance> oldConsensusAnnotations = filterUtil.filterAnnotations(annotations,
064                                            consensusFilter);
065                            for (SimpleInstance oldAnnotation : oldConsensusAnnotations) {
066                                    SimpleInstance mention = annotationUtil.getMention(oldAnnotation);
067                                    Set<SimpleInstance> mentions = mentionUtil.getAllConnectedMentions(mention);
068                                    for (SimpleInstance oldMention : mentions) {
069                                            kb.deleteFrame(oldMention);
070                                    }
071                                    kb.deleteFrame(oldAnnotation);
072                            }
073                    }
074    
075                    return createConsensusSet(textSource, manager, consensusSet);
076            }
077    
078            public static void createConsensusAnnotations(KnowtatorManager manager, SimpleInstance filter,
079                            String consensusSetName, Collection<SimpleInstance> textSources) throws ConsensusException {
080                    KnowledgeBase kb = manager.getKnowledgeBase();
081                    KnowtatorProjectUtil kpu = manager.getKnowtatorProjectUtil();
082    
083                    // need to document the fact that we are relying on the passed in filter
084                    // to have the annotators specified.
085                    // Or we need to throw an appropriate exception and display an error
086                    // message.
087                    Set<SimpleInstance> annotators = new HashSet<SimpleInstance>(FilterUtil.getAnnotators(filter));
088    
089                    SimpleInstance teamAnnotator = kb.createSimpleInstance(null, null, CollectionUtilities.createCollection(kpu
090                                    .getTeamAnnotatorCls()), true);
091                    teamAnnotator.setDirectOwnSlotValues(kpu.getAnnotatorTeamMembersSlot(), annotators);
092                    teamAnnotator.setDirectOwnSlotValue(kpu.getAnnotatorTeamNameSlot(), consensusSetName + " annotator team");
093    
094                    SimpleInstance consensusSet = kb.createSimpleInstance(null, null, CollectionUtilities.createCollection(kpu
095                                    .getConsensusSetCls()), true);
096                    consensusSet.setDirectOwnSlotValue(kpu.getSetNameSlot(), consensusSetName);
097                    consensusSet.setDirectOwnSlotValue(kpu.getSetDescriptionSlot(),
098                                    "This set corresponds to a consensus set of annotations generated by Knowtator.");
099                    consensusSet.setDirectOwnSlotValue(kpu.getConsensusSetIndividualFilterSlot(), filter);
100                    consensusSet.setDirectOwnSlotValue(kpu.getConsensusSetTeamAnnotatorSlot(), teamAnnotator);
101    
102                    SimpleInstance consensusFilter = kb.createSimpleInstance(null, null, CollectionUtilities.createCollection(kpu
103                                    .getConsensusFilterCls()), true);
104                    consensusFilter.setDirectOwnSlotValue(kpu.getFilterNameSlot(), consensusSetName + " filter");
105                    consensusFilter.setDirectOwnSlotValue(kpu.getFilterSetSlot(), consensusSet);
106                    consensusFilter.setDirectOwnSlotValues(kpu.getFilterAnnotatorSlot(), annotators);
107                    consensusFilter.addOwnSlotValue(kpu.getFilterAnnotatorSlot(), teamAnnotator);
108                    consensusSet.setDirectOwnSlotValue(kpu.getConsensusSetConsensusFilterSlot(), consensusFilter);
109    
110                    Set<Cls> filterTypes = FilterUtil.getTypes(filter);
111                    if (filterTypes.size() > 0)
112                            consensusFilter.setDirectOwnSlotValues(kpu.getFilterTypeSlot(), filterTypes);
113                    else {
114                            // we need to add a root cls so that IAA will not throw an
115                            // exception.
116                            consensusFilter.setDirectOwnSlotValues(kpu.getFilterTypeSlot(), manager.getRootClses());
117                    }
118    
119                    for (SimpleInstance textSource : textSources) {
120                            ConsensusSet textSourceConsensusSet = createConsensusSet(textSource, manager, consensusSet);
121                            textSourceConsensusSet.destroy();
122                    }
123    
124                    manager.addActiveFilter(consensusFilter);
125                    manager.setSelectedFilter(consensusFilter);
126                    manager.setSelectedAnnotator(teamAnnotator);
127                    manager.setSelectedAnnotationSet(consensusSet);
128            }
129    
130            public static ConsensusSet createConsensusSet(SimpleInstance textSource, KnowtatorManager manager,
131                            SimpleInstance consensusSet) throws ConsensusException {
132                    KnowtatorProjectUtil kpu = manager.getKnowtatorProjectUtil();
133                    AnnotationUtil annotationUtil = manager.getAnnotationUtil();
134                    FilterUtil filterUtil = manager.getFilterUtil();
135                    MentionUtil mentionUtil = manager.getMentionUtil();
136                    SimpleInstance individualFilter = (SimpleInstance) consensusSet.getOwnSlotValue(kpu
137                                    .getConsensusSetIndividualFilterSlot());
138                    Set<SimpleInstance> annotators = new HashSet<SimpleInstance>(FilterUtil.getAnnotators(individualFilter));
139                    if (annotators.size() < 2)
140                            throw new ConsensusException("The filter corresponding to the individually annotated "
141                                            + "\nannotations for the selected consensus set does not "
142                                            + "\nhave two or more annotators specified.");
143    
144                    // The key is an original mention, and the value is a copied mention
145                    // created for the consensus set.
146                    Map<SimpleInstance, SimpleInstance> mentionCopies = new HashMap<SimpleInstance, SimpleInstance>();
147    
148                    java.util.Set<SimpleInstance> consensusAnnotations = new HashSet<SimpleInstance>();
149                    // java.util.Set<SimpleInstance> consensusMentions = new
150                    // HashSet<SimpleInstance>();
151    
152                    Collection<SimpleInstance> annotations = annotationUtil.getAnnotations(textSource);
153                    annotations = filterUtil.filterAnnotations(annotations, individualFilter);
154    
155                    for (SimpleInstance annotation : annotations) {
156                            SimpleInstance mention = annotationUtil.getMention(annotation);
157                            SimpleInstance mentionCopy = mentionCopies.get(mention);
158                            if (mentionCopy == null) {
159                                    mentionCopy = mentionUtil.copyMention(mention, mentionCopies);
160                                    mentionCopies.put(mention, mentionCopy);
161                            }
162    
163                            SimpleInstance annotator = annotationUtil.getAnnotator(annotation);
164                            try {
165                                    SimpleInstance consensusAnnotation = annotationUtil.createAnnotation(mentionCopy, annotator,
166                                                    annotationUtil.getSpans(annotation), textSource, consensusSet);
167                                    // collect all of the annotations created for the consensus set.
168                                    consensusAnnotations.add(consensusAnnotation);
169                            } catch (TextSourceAccessException tsae) {
170                                    tsae.printStackTrace();
171                            } catch (InvalidSpanException ise) {
172                                    ise.printStackTrace();
173                            }
174                    }
175                    ConsensusSet textSourceConsensusSet = new ConsensusSet(consensusAnnotations, consensusSet, manager);
176                    textSourceConsensusSet.consolidateAnnotations();
177                    return textSourceConsensusSet;
178            }
179    }