You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by st...@apache.org on 2013/07/16 03:31:07 UTC

svn commit: r1503541 - in /ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal: ae/ eval/

Author: stevenbethard
Date: Tue Jul 16 01:31:07 2013
New Revision: 1503541

URL: http://svn.apache.org/r1503541
Log:
Adds reader for Anafora XML and updates ctakes-temporal evaluation scripts to add an option for that

Added:
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/THYMEAnaforaXMLReader.java
Modified:
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfAnnotationSpans_ImplBase.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKEventSpans.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKTimeSpans.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventRelations.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventProperties.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventSpans.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfNEPredicateEventSpans.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java
    ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java

Added: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/THYMEAnaforaXMLReader.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/THYMEAnaforaXMLReader.java?rev=1503541&view=auto
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/THYMEAnaforaXMLReader.java (added)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/THYMEAnaforaXMLReader.java Tue Jul 16 01:31:07 2013
@@ -0,0 +1,338 @@
+package org.apache.ctakes.temporal.ae;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ctakes.typesystem.type.constants.CONST;
+import org.apache.ctakes.typesystem.type.refsem.Event;
+import org.apache.ctakes.typesystem.type.refsem.EventProperties;
+import org.apache.ctakes.typesystem.type.relation.AspectualTextRelation;
+import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
+import org.apache.ctakes.typesystem.type.relation.RelationArgument;
+import org.apache.ctakes.typesystem.type.relation.TemporalTextRelation;
+import org.apache.ctakes.typesystem.type.textsem.EventMention;
+import org.apache.ctakes.typesystem.type.textsem.TimeMention;
+import org.apache.log4j.Logger;
+import org.apache.uima.analysis_engine.AnalysisEngine;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
+import org.apache.uima.collection.CollectionReader;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.cas.FSArray;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.cleartk.util.ViewURIUtil;
+import org.cleartk.util.cr.UriCollectionReader;
+import org.jdom2.Element;
+import org.jdom2.JDOMException;
+import org.jdom2.input.SAXBuilder;
+import org.uimafit.component.JCasAnnotator_ImplBase;
+import org.uimafit.descriptor.ConfigurationParameter;
+import org.uimafit.factory.AnalysisEngineFactory;
+import org.uimafit.pipeline.SimplePipeline;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+public class THYMEAnaforaXMLReader extends JCasAnnotator_ImplBase {
+  private static Logger LOGGER = Logger.getLogger(THYMEAnaforaXMLReader.class);
+
+  public static final String PARAM_ANAFORA_DIRECTORY = "anaforaDirectory";
+
+  @ConfigurationParameter(
+      name = PARAM_ANAFORA_DIRECTORY,
+      description = "root directory of the Anafora-annotated files, with one subdirectory for "
+          + "each annotated file")
+  private File anaforaDirectory;
+
+  public static final String PARAM_ANAFORA_XML_SUFFIXES = "anaforaSuffixes";
+
+  @ConfigurationParameter(
+      name = PARAM_ANAFORA_XML_SUFFIXES,
+      description = "list of suffixes that might be added to a file name to identify the Anafora "
+          + "XML annotations file; only the first suffix corresponding to a file will be used")
+  private String[] anaforaXMLSuffixes = new String[] {
+      ".temporal.Temporal-Adjudication.gold.completed.xml",
+      ".temporal.Temporal-Entities.gold.completed.xml", };
+
+  public static AnalysisEngineDescription getDescription() throws ResourceInitializationException {
+    return AnalysisEngineFactory.createPrimitiveDescription(THYMEAnaforaXMLReader.class);
+  }
+
+  public static AnalysisEngineDescription getDescription(File anaforaDirectory)
+      throws ResourceInitializationException {
+    return AnalysisEngineFactory.createPrimitiveDescription(
+        THYMEAnaforaXMLReader.class,
+        THYMEAnaforaXMLReader.PARAM_ANAFORA_DIRECTORY,
+        anaforaDirectory);
+  }
+
+  @Override
+  public void process(JCas jCas) throws AnalysisEngineProcessException {
+    // determine source text file
+    File textFile = new File(ViewURIUtil.getURI(jCas));
+    LOGGER.info("processing " + textFile);
+
+    // determine possible Anafora XML file names
+    List<File> possibleXMLFiles = Lists.newArrayList();
+    for (String anaforaXMLSuffix : this.anaforaXMLSuffixes) {
+      if (this.anaforaDirectory == null) {
+        possibleXMLFiles.add(new File(textFile + anaforaXMLSuffix));
+      } else {
+        File subDir = new File(this.anaforaDirectory, textFile.getName());
+        possibleXMLFiles.add(new File(subDir, textFile.getName() + anaforaXMLSuffix));
+      }
+    }
+
+    // find an Anafora XML file that actually exists
+    File xmlFile = null;
+    for (File possibleXMLFile : possibleXMLFiles) {
+      if (possibleXMLFile.exists()) {
+        xmlFile = possibleXMLFile;
+        break;
+      }
+    }
+    if (xmlFile == null) {
+      throw new IllegalArgumentException("no Anafora XML file found from " + possibleXMLFiles);
+    }
+
+    // load the XML
+    Element dataElem;
+    try {
+      dataElem = new SAXBuilder().build(xmlFile.toURI().toURL()).getRootElement();
+    } catch (MalformedURLException e) {
+      throw new AnalysisEngineProcessException(e);
+    } catch (JDOMException e) {
+      throw new AnalysisEngineProcessException(e);
+    } catch (IOException e) {
+      throw new AnalysisEngineProcessException(e);
+    }
+
+    for (Element annotationsElem : dataElem.getChildren("annotations")) {
+
+      Map<String, Annotation> idToAnnotation = Maps.newHashMap();
+      for (Element entityElem : annotationsElem.getChildren("entity")) {
+        String id = removeSingleChildText(entityElem, "id", null);
+        Element spanElem = removeSingleChild(entityElem, "span", id);
+        String type = removeSingleChildText(entityElem, "type", id);
+        Element propertiesElem = removeSingleChild(entityElem, "properties", id);
+
+        // UIMA doesn't support disjoint spans, so take the span enclosing
+        // everything
+        int begin = Integer.MAX_VALUE;
+        int end = Integer.MIN_VALUE;
+        for (String spanString : spanElem.getText().split(";")) {
+          String[] beginEndStrings = spanString.split(",");
+          if (beginEndStrings.length != 2) {
+            error("span not of the format 'number,number'", id);
+          }
+          int spanBegin = Integer.parseInt(beginEndStrings[0]);
+          int spanEnd = Integer.parseInt(beginEndStrings[1]);
+          if (spanBegin < begin) {
+            begin = spanBegin;
+          }
+          if (spanEnd > end) {
+            end = spanEnd;
+          }
+        }
+
+        Annotation annotation;
+        if (type.equals("EVENT")) {
+          String docTimeRel = removeSingleChildText(propertiesElem, "DocTimeRel", id);
+          if (docTimeRel == null) {
+            error("no docTimeRel, assuming OVERLAP", id);
+            docTimeRel = "OVERLAP";
+          }
+          String eventType = removeSingleChildText(propertiesElem, "Type", id);
+          String degree = removeSingleChildText(propertiesElem, "Degree", id);
+          String polarity = removeSingleChildText(propertiesElem, "Polarity", id);
+          String contextualModality = removeSingleChildText(propertiesElem, "ContextualModality", id);
+          String contextualAspect = removeSingleChildText(propertiesElem, "ContextualAspect", id);
+          String permanence = removeSingleChildText(propertiesElem, "Permanence", id);
+          EventMention eventMention = new EventMention(jCas, begin, end);
+          Event event = new Event(jCas);
+          EventProperties eventProperties = new EventProperties(jCas);
+          eventProperties.setDocTimeRel(docTimeRel);
+          eventProperties.setCategory(eventType);
+          eventProperties.setDegree(degree);
+          if (polarity.equals("POS")) {
+            eventProperties.setPolarity(CONST.NE_POLARITY_NEGATION_ABSENT);
+          } else if (polarity.equals("NEG")) {
+            eventProperties.setPolarity(CONST.NE_POLARITY_NEGATION_PRESENT);
+          } else {
+            error("polarity that was not POS or NEG", id);
+          }
+          eventProperties.setContextualModality(contextualModality);
+          eventProperties.setContextualAspect(contextualAspect);
+          eventProperties.setPermanence(permanence);
+          eventProperties.addToIndexes();
+          event.setConfidence(1.0f);
+          event.setDiscoveryTechnique(CONST.NE_DISCOVERY_TECH_GOLD_ANNOTATION);
+          event.setProperties(eventProperties);
+          event.setMentions(new FSArray(jCas, 1));
+          event.setMentions(0, eventMention);
+          event.addToIndexes();
+          eventMention.setConfidence(1.0f);
+          eventMention.setDiscoveryTechnique(CONST.NE_DISCOVERY_TECH_GOLD_ANNOTATION);
+          eventMention.setEvent(event);
+          eventMention.addToIndexes();
+          annotation = eventMention;
+
+        } else if (type.equals("TIMEX3")) {
+          String timeClass = removeSingleChildText(propertiesElem, "Class", id);
+          TimeMention timeMention = new TimeMention(jCas, begin, end);
+          timeMention.setTimeClass(timeClass);
+          timeMention.addToIndexes();
+          annotation = timeMention;
+
+        } else if (type.equals("DOCTIME")) {
+          TimeMention timeMention = new TimeMention(jCas, begin, end);
+          timeMention.setTimeClass(type);
+          timeMention.addToIndexes();
+          annotation = timeMention;
+
+        } else if (type.equals("SECTIONTIME")) {
+          TimeMention timeMention = new TimeMention(jCas, begin, end);
+          timeMention.setTimeClass(type);
+          timeMention.addToIndexes();
+          annotation = timeMention;
+
+        } else {
+          throw new UnsupportedOperationException("unsupported entity type: " + type);
+        }
+
+        // match the annotation to it's ID for later use
+        idToAnnotation.put(id, annotation);
+
+        // make sure all XML has been consumed
+        removeSingleChild(entityElem, "parentsType", id);
+        if (!propertiesElem.getChildren().isEmpty() || !entityElem.getChildren().isEmpty()) {
+          List<String> children = Lists.newArrayList();
+          for (Element child : propertiesElem.getChildren()) {
+            children.add(child.getName());
+          }
+          for (Element child : entityElem.getChildren()) {
+            children.add(child.getName());
+          }
+          error("unprocessed children " + children, id);
+        }
+      }
+
+      for (Element relationElem : annotationsElem.getChildren("relation")) {
+        String id = removeSingleChildText(relationElem, "id", null);
+        String type = removeSingleChildText(relationElem, "type", id);
+        Element propertiesElem = removeSingleChild(relationElem, "properties", id);
+
+        if (type.equals("TLINK")) {
+          String sourceID = removeSingleChildText(propertiesElem, "Source", id);
+          String targetID = removeSingleChildText(propertiesElem, "Target", id);
+          String tlinkType = removeSingleChildText(propertiesElem, "Type", id);
+          TemporalTextRelation relation = new TemporalTextRelation(jCas);
+          addRelation(jCas, relation, sourceID, targetID, tlinkType, idToAnnotation, id);
+
+        } else if (type.equals("ALINK")) {
+          String sourceID = removeSingleChildText(propertiesElem, "Source", id);
+          String targetID = removeSingleChildText(propertiesElem, "Target", id);
+          String alinkType = removeSingleChildText(propertiesElem, "Type", id);
+          AspectualTextRelation relation = new AspectualTextRelation(jCas);
+          addRelation(jCas, relation, sourceID, targetID, alinkType, idToAnnotation, id);
+
+        } else {
+          throw new UnsupportedOperationException("unsupported relation type: " + type);
+        }
+
+        // make sure all XML has been consumed
+        removeSingleChild(relationElem, "parentsType", id);
+        if (!propertiesElem.getChildren().isEmpty() || !relationElem.getChildren().isEmpty()) {
+          List<String> children = Lists.newArrayList();
+          for (Element child : propertiesElem.getChildren()) {
+            children.add(child.getName());
+          }
+          for (Element child : relationElem.getChildren()) {
+            children.add(child.getName());
+          }
+          error("unprocessed children " + children, id);
+        }
+      }
+    }
+  }
+
+  private static Element getSingleChild(Element elem, String elemName, String causeID) {
+    List<Element> children = elem.getChildren(elemName);
+    if (children.size() != 1) {
+      error(String.format("not exactly one '%s' child", elemName), causeID);
+    }
+    return children.size() > 0 ? children.get(0) : null;
+  }
+
+  private static Element removeSingleChild(Element elem, String elemName, String causeID) {
+    Element child = getSingleChild(elem, elemName, causeID);
+    elem.removeChildren(elemName);
+    return child;
+  }
+
+  private static String removeSingleChildText(Element elem, String elemName, String causeID) {
+    Element child = getSingleChild(elem, elemName, causeID);
+    String text = child.getText();
+    if (text.isEmpty()) {
+      error(String.format("an empty '%s' child", elemName), causeID);
+      text = null;
+    }
+    elem.removeChildren(elemName);
+    return text;
+  }
+
+  private static void addRelation(
+      JCas jCas,
+      BinaryTextRelation relation,
+      String sourceID,
+      String targetID,
+      String category,
+      Map<String, Annotation> idToAnnotation,
+      String causeID) {
+    if (sourceID != null && targetID != null) {
+      Annotation source = getArgument(sourceID, idToAnnotation, causeID);
+      Annotation target = getArgument(targetID, idToAnnotation, causeID);
+      if (source != null && target != null) {
+        RelationArgument sourceArg = new RelationArgument(jCas);
+        sourceArg.setArgument(source);
+        sourceArg.addToIndexes();
+        RelationArgument targetArg = new RelationArgument(jCas);
+        targetArg.setArgument(target);
+        targetArg.addToIndexes();
+        relation.setCategory(category);
+        relation.setArg1(sourceArg);
+        relation.setArg2(targetArg);
+        relation.addToIndexes();
+      }
+    }
+  }
+
+  private static Annotation getArgument(
+      String id,
+      Map<String, Annotation> idToAnnotation,
+      String causeID) {
+    Annotation annotation = idToAnnotation.get(id);
+    if (annotation == null) {
+      error("no annotation with id " + id, causeID);
+    }
+    return annotation;
+  }
+
+  private static void error(String found, String id) {
+    LOGGER.error(String.format("found %s in annotation with ID %s", found, id));
+  }
+
+  public static void main(String[] args) throws Exception {
+    List<File> files = Lists.newArrayList();
+    for (String path : args) {
+      files.add(new File(path));
+    }
+    CollectionReader reader = UriCollectionReader.getCollectionReaderFromFiles(files);
+    AnalysisEngine engine = AnalysisEngineFactory.createPrimitive(THYMEAnaforaXMLReader.class);
+    SimplePipeline.runPipeline(reader, engine);
+  }
+}

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfAnnotationSpans_ImplBase.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfAnnotationSpans_ImplBase.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfAnnotationSpans_ImplBase.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfAnnotationSpans_ImplBase.java Tue Jul 16 01:31:07 2013
@@ -73,21 +73,23 @@ public abstract class EvaluationOfAnnota
   public EvaluationOfAnnotationSpans_ImplBase(
       File baseDirectory,
       File rawTextDirectory,
-      File knowtatorXMLDirectory,
+      File xmlDirectory,
+      XMLFormat xmlFormat,
       File xmiDirectory,
       File treebankDirectory,
       Class<? extends Annotation> annotationClass) {
-    super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory, xmiDirectory, treebankDirectory);
+    super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat, xmiDirectory, treebankDirectory);
     this.annotationClass = annotationClass;
   }
   
   public EvaluationOfAnnotationSpans_ImplBase(
 		File baseDirectory,
 		File rawTextDirectory, 
-		File knowtatorXMLDirectory, 
+		File xmlDirectory,
+		XMLFormat xmlFormat,
 		File xmiDirectory,
 		Class<? extends Annotation> annotationClass) {
-	  this(baseDirectory,rawTextDirectory, knowtatorXMLDirectory, xmiDirectory, null, annotationClass);
+	  this(baseDirectory,rawTextDirectory, xmlDirectory, xmlFormat, xmiDirectory, null, annotationClass);
   }
 
 protected abstract AnalysisEngineDescription getDataWriterDescription(File directory)

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKEventSpans.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKEventSpans.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKEventSpans.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKEventSpans.java Tue Jul 16 01:31:07 2013
@@ -54,7 +54,8 @@ public class EvaluationOfClearTKEventSpa
     EvaluationOfClearTKEventSpans evaluation = new EvaluationOfClearTKEventSpans(
         new File("target/eval/cleartk-event-spans"),
         options.getRawTextDirectory(),
-        options.getKnowtatorXMLDirectory(),
+        options.getXMLDirectory(),
+        options.getXMLFormat(),
         options.getXMIDirectory());
     evaluation.prepareXMIsFor(patientSets);
     evaluation.setLogging(Level.FINE, new File("target/eval/cleartk-event-errors.log"));
@@ -65,9 +66,10 @@ public class EvaluationOfClearTKEventSpa
   public EvaluationOfClearTKEventSpans(
       File baseDirectory,
       File rawTextDirectory,
-      File knowtatorXMLDirectory,
+      File xmlDirectory,
+      XMLFormat xmlFormat,
       File xmiDirectory) {
-    super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory, xmiDirectory, EventMention.class);
+    super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat, xmiDirectory, EventMention.class);
   }
 
   @Override

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKTimeSpans.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKTimeSpans.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKTimeSpans.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfClearTKTimeSpans.java Tue Jul 16 01:31:07 2013
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.logging.Level;
 
+import org.apache.ctakes.typesystem.type.textsem.EventMention;
 import org.apache.ctakes.typesystem.type.textsem.TimeMention;
 import org.apache.ctakes.typesystem.type.textspan.Segment;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
@@ -53,7 +54,8 @@ public class EvaluationOfClearTKTimeSpan
     EvaluationOfClearTKTimeSpans evaluation = new EvaluationOfClearTKTimeSpans(
         new File("target/eval/cleartk-time-spans"),
         options.getRawTextDirectory(),
-        options.getKnowtatorXMLDirectory(),
+        options.getXMLDirectory(),
+        options.getXMLFormat(),
         options.getXMIDirectory());
     evaluation.prepareXMIsFor(patientSets);
     evaluation.setLogging(Level.FINE, new File("target/eval/cleartk-time-errors.log"));
@@ -64,9 +66,10 @@ public class EvaluationOfClearTKTimeSpan
   public EvaluationOfClearTKTimeSpans(
       File baseDirectory,
       File rawTextDirectory,
-      File knowtatorXMLDirectory,
+      File xmlDirectory,
+      XMLFormat xmlFormat,
       File xmiDirectory) {
-    super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory, xmiDirectory, TimeMention.class);
+    super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat, xmiDirectory, EventMention.class);
   }
 
   @Override

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventRelations.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventRelations.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventRelations.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventEventRelations.java Tue Jul 16 01:31:07 2013
@@ -44,14 +44,15 @@ EvaluationOfTemporalRelations_ImplBase {
   public EvaluationOfEventEventRelations(      
       File baseDirectory,
       File rawTextDirectory,
-      File knowtatorXMLDirectory,
+      File xmlDirectory,
+      XMLFormat xmlFormat,
       File xmiDirectory,
       File treebankDirectory,
       boolean printErrors,
       boolean printRelations,
       boolean baseline,
       ParameterSettings params){
-    super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory, xmiDirectory,
+    super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat, xmiDirectory,
         treebankDirectory, printErrors, printRelations, params);
     this.baseline = baseline;
   }
@@ -188,7 +189,8 @@ EvaluationOfTemporalRelations_ImplBase {
     EvaluationOfEventEventRelations evaluation = new EvaluationOfEventEventRelations(
         workingDir,
         options.getRawTextDirectory(),
-        options.getKnowtatorXMLDirectory(),
+        options.getXMLDirectory(),
+        options.getXMLFormat(),
         options.getXMIDirectory(),
         options.getTreebankDirectory(),
         options.getPrintErrors(),

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventProperties.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventProperties.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventProperties.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventProperties.java Tue Jul 16 01:31:07 2013
@@ -70,7 +70,8 @@ public class EvaluationOfEventProperties
     EvaluationOfEventProperties evaluation = new EvaluationOfEventProperties(
         new File("target/eval/event-properties"),
         options.getRawTextDirectory(),
-        options.getKnowtatorXMLDirectory(),
+        options.getXMLDirectory(),
+        options.getXMLFormat(),
         options.getXMIDirectory());
     evaluation.prepareXMIsFor(patientSets);
     evaluation.logClassificationErrors(new File("target/eval"), "ctakes-event-property-errors");
@@ -88,9 +89,10 @@ public class EvaluationOfEventProperties
   public EvaluationOfEventProperties(
       File baseDirectory,
       File rawTextDirectory,
-      File knowtatorXMLDirectory,
+      File xmlDirectory,
+      XMLFormat xmlFormat,
       File xmiDirectory) {
-    super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory, xmiDirectory, null);
+    super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat, xmiDirectory, null);
     for (String name : PROPERTY_NAMES) {
       this.loggers.put(name, Logger.getLogger(String.format("%s.%s", this.getClass().getName(), name)));
     }

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventSpans.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventSpans.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventSpans.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventSpans.java Tue Jul 16 01:31:07 2013
@@ -63,7 +63,8 @@ public class EvaluationOfEventSpans exte
     EvaluationOfEventSpans evaluation = new EvaluationOfEventSpans(
         new File("target/eval/event-spans"),
         options.getRawTextDirectory(),
-        options.getKnowtatorXMLDirectory(),
+        options.getXMLDirectory(),
+        options.getXMLFormat(),
         options.getXMIDirectory(),
         options.getProbabilityOfKeepingANegativeExample(),
         options.getFeatureSelectionThreshold(),
@@ -83,12 +84,13 @@ public class EvaluationOfEventSpans exte
   public EvaluationOfEventSpans(
       File baseDirectory,
       File rawTextDirectory,
-      File knowtatorXMLDirectory,
+      File xmlDirectory,
+      XMLFormat xmlFormat,
       File xmiDirectory,
       float probabilityOfKeepingANegativeExample,
       float featureSelectionThreshold,
       float numOfSmoteNeighbors) {
-    super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory, xmiDirectory, EventMention.class);
+    super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat, xmiDirectory, EventMention.class);
     this.probabilityOfKeepingANegativeExample = probabilityOfKeepingANegativeExample;
     this.featureSelectionThreshold = featureSelectionThreshold;
     this.smoteNeighborNumber = numOfSmoteNeighbors;

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfEventTimeRelations.java Tue Jul 16 01:31:07 2013
@@ -33,7 +33,6 @@ import java.util.Set;
 import org.apache.ctakes.relationextractor.eval.RelationExtractorEvaluation.HashableArguments;
 import org.apache.ctakes.temporal.ae.EventTimeRelationAnnotator;
 import org.apache.ctakes.temporal.ae.baselines.RecallBaselineEventTimeRelationAnnotator;
-import org.apache.ctakes.temporal.eval.Evaluation_ImplBase.CopyFromGold;
 import org.apache.ctakes.typesystem.type.relation.BinaryTextRelation;
 import org.apache.ctakes.typesystem.type.relation.RelationArgument;
 import org.apache.ctakes.typesystem.type.textsem.EventMention;
@@ -129,7 +128,8 @@ public class EvaluationOfEventTimeRelati
       EvaluationOfEventTimeRelations evaluation = new EvaluationOfEventTimeRelations(
           tempModelDir,
           options.getRawTextDirectory(),
-          options.getKnowtatorXMLDirectory(),
+          options.getXMLDirectory(),
+          options.getXMLFormat(),
           options.getXMIDirectory(),
           options.getTreebankDirectory(),
           options.getClosure(),
@@ -165,7 +165,8 @@ public class EvaluationOfEventTimeRelati
   public EvaluationOfEventTimeRelations(
       File baseDirectory,
       File rawTextDirectory,
-      File knowtatorXMLDirectory,
+      File xmlDirectory,
+      XMLFormat xmlFormat,
       File xmiDirectory,
       File treebankDirectory,
       boolean useClosure,
@@ -177,7 +178,8 @@ public class EvaluationOfEventTimeRelati
     super(
         baseDirectory,
         rawTextDirectory,
-        knowtatorXMLDirectory,
+        xmlDirectory,
+        xmlFormat,
         xmiDirectory,
         treebankDirectory,
         printErrors,

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfNEPredicateEventSpans.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfNEPredicateEventSpans.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfNEPredicateEventSpans.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfNEPredicateEventSpans.java Tue Jul 16 01:31:07 2013
@@ -22,18 +22,18 @@ public class EvaluationOfNEPredicateEven
 		EvaluationOfAnnotationSpans_ImplBase {
 
 	public EvaluationOfNEPredicateEventSpans(File baseDirectory,
-			File rawTextDirectory, File knowtatorXMLDirectory,
+			File rawTextDirectory, File xmlDirectory, XMLFormat xmlFormat,
 			File xmiDirectory, File treebankDirectory,
 			Class<? extends Annotation> annotationClass) {
-		super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory,
+		super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat,
 				xmiDirectory, treebankDirectory, annotationClass);
 		// TODO Auto-generated constructor stub
 	}
 
 	public EvaluationOfNEPredicateEventSpans(File baseDirectory,
-			File rawTextDirectory, File knowtatorXMLDirectory,
+			File rawTextDirectory, File xmlDirectory, XMLFormat xmlFormat,
 			File xmiDirectory) {
-		super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory,
+		super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat,
 				xmiDirectory, EventMention.class);
 		// TODO Auto-generated constructor stub
 	}
@@ -80,7 +80,8 @@ public class EvaluationOfNEPredicateEven
 	    EvaluationOfNEPredicateEventSpans evaluation = new EvaluationOfNEPredicateEventSpans(
 	        new File("target/eval/event-spans"),
 	        options.getRawTextDirectory(),
-	        options.getKnowtatorXMLDirectory(),
+	        options.getXMLDirectory(),
+	        options.getXMLFormat(),
 	        options.getXMIDirectory());
 	    evaluation.prepareXMIsFor(patientSets);
 	    evaluation.setLogging(Level.FINE, new File("target/eval/ctakes-event-errors.log"));

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTemporalRelations_ImplBase.java Tue Jul 16 01:31:07 2013
@@ -53,9 +53,9 @@ public abstract class EvaluationOfTempor
 	  protected boolean printRelations = false;
 
 	public EvaluationOfTemporalRelations_ImplBase(File baseDirectory,
-			File rawTextDirectory, File knowtatorXMLDirectory,
+			File rawTextDirectory, File xmlDirectory, XMLFormat xmlFormat,
 			File xmiDirectory, File treebankDirectory, boolean printErrors, boolean printRelations, ParameterSettings params) {
-		super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory, xmiDirectory,
+		super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat, xmiDirectory,
 				treebankDirectory);
 		this.params = params;
 		this.printRelations = printRelations;

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/EvaluationOfTimeSpans.java Tue Jul 16 01:31:07 2013
@@ -82,7 +82,8 @@ public class EvaluationOfTimeSpans exten
       EvaluationOfTimeSpans evaluation = new EvaluationOfTimeSpans(
           new File("target/eval/time-spans"),
           options.getRawTextDirectory(),
-          options.getKnowtatorXMLDirectory(),
+          options.getXMLDirectory(),
+          options.getXMLFormat(),
           options.getXMIDirectory(),
           options.getTreebankDirectory(),
           annotatorClass,
@@ -119,13 +120,14 @@ public class EvaluationOfTimeSpans exten
   public EvaluationOfTimeSpans(
       File baseDirectory,
       File rawTextDirectory,
-      File knowtatorXMLDirectory,
+      File xmlDirectory,
+      XMLFormat xmlFormat,
       File xmiDirectory,
       File treebankDirectory,
       Class<? extends JCasAnnotator_ImplBase> annotatorClass,
       boolean printOverlapping,
       String[] trainingArguments) {
-    super(baseDirectory, rawTextDirectory, knowtatorXMLDirectory, xmiDirectory, treebankDirectory, TimeMention.class);
+    super(baseDirectory, rawTextDirectory, xmlDirectory, xmlFormat, xmiDirectory, treebankDirectory, TimeMention.class);
     this.annotatorClass = annotatorClass;
     this.trainingArguments = trainingArguments;
     this.printOverlapping = printOverlapping;

Modified: ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java
URL: http://svn.apache.org/viewvc/ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java?rev=1503541&r1=1503540&r2=1503541&view=diff
==============================================================================
--- ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java (original)
+++ ctakes/trunk/ctakes-temporal/src/main/java/org/apache/ctakes/temporal/eval/Evaluation_ImplBase.java Tue Jul 16 01:31:07 2013
@@ -47,6 +47,7 @@ import org.apache.ctakes.dictionary.look
 import org.apache.ctakes.lvg.ae.LvgAnnotator;
 import org.apache.ctakes.lvg.resource.LvgCmdApiResourceImpl;
 import org.apache.ctakes.postagger.POSTagger;
+import org.apache.ctakes.temporal.ae.THYMEAnaforaXMLReader;
 import org.apache.ctakes.temporal.ae.THYMEKnowtatorXMLReader;
 import org.apache.ctakes.temporal.ae.THYMETreebankReader;
 import org.apache.ctakes.typesystem.type.syntax.BaseToken;
@@ -99,6 +100,8 @@ public abstract class Evaluation_ImplBas
     org.cleartk.eval.Evaluation_ImplBase<Integer, STATISTICS_TYPE> {
 
   public static final String GOLD_VIEW_NAME = "GoldView";
+  
+  enum XMLFormat { Knowtator, Anafora }
 
   static interface Options {
 
@@ -106,7 +109,10 @@ public abstract class Evaluation_ImplBas
     public File getRawTextDirectory();
 
     @Option(longName = "xml")
-    public File getKnowtatorXMLDirectory();
+    public File getXMLDirectory();
+
+    @Option(longName = "format")
+    public XMLFormat getXMLFormat();
 
     @Option(longName = "xmi")
     public File getXMIDirectory();
@@ -132,7 +138,9 @@ public abstract class Evaluation_ImplBas
 
   protected File rawTextDirectory;
 
-  protected File knowtatorXMLDirectory;
+  protected File xmlDirectory;
+  
+  protected XMLFormat xmlFormat;
 
   protected File xmiDirectory;
 
@@ -149,12 +157,14 @@ public abstract class Evaluation_ImplBas
   public Evaluation_ImplBase(
       File baseDirectory,
       File rawTextDirectory,
-      File knowtatorXMLDirectory,
+      File xmlDirectory,
+      XMLFormat xmlFormat,
       File xmiDirectory,
       File treebankDirectory) {
     super(baseDirectory);
     this.rawTextDirectory = rawTextDirectory;
-    this.knowtatorXMLDirectory = knowtatorXMLDirectory;
+    this.xmlDirectory = xmlDirectory;
+    this.xmlFormat = xmlFormat;
     this.xmiDirectory = xmiDirectory;
     this.xmiExists = this.xmiDirectory.exists() && this.xmiDirectory.listFiles().length > 0;
     this.treebankDirectory = treebankDirectory;
@@ -233,10 +243,20 @@ public abstract class Evaluation_ImplBas
         CAS.NAME_DEFAULT_SOFA,
         ViewTextCopierAnnotator.PARAM_DESTINATION_VIEW_NAME,
         GOLD_VIEW_NAME));
-    aggregateBuilder.add(
-        THYMEKnowtatorXMLReader.getDescription(this.knowtatorXMLDirectory),
-        CAS.NAME_DEFAULT_SOFA,
-        GOLD_VIEW_NAME);
+    switch (this.xmlFormat) {
+    case Anafora:
+      aggregateBuilder.add(
+          THYMEAnaforaXMLReader.getDescription(this.xmlDirectory),
+          CAS.NAME_DEFAULT_SOFA,
+          GOLD_VIEW_NAME);
+      break;
+    case Knowtator:
+      aggregateBuilder.add(
+          THYMEKnowtatorXMLReader.getDescription(this.xmlDirectory),
+          CAS.NAME_DEFAULT_SOFA,
+          GOLD_VIEW_NAME);
+      break;
+    }
 
     // identify segments
     aggregateBuilder.add(AnalysisEngineFactory.createPrimitiveDescription(SegmentsFromBracketedSectionTagsAnnotator.class));