/** * @param inputAS input annotation set * @param outputAS output annotation set * @param term String matched * @param startOffset match start offset * @param endOffset match end offset */ private void addLookup( AnnotationSet inputAS, AnnotationSet outputAS, String term, String outputASType, Long startOffset, Long endOffset, boolean useNounChunk) { if (useNounChunk && nounChunkType != null && !nounChunkType.isEmpty()) { AnnotationSet nounChunkAS = inputAS.getCovering(nounChunkType, startOffset, endOffset); if (!nounChunkAS.isEmpty()) { startOffset = nounChunkAS.firstNode().getOffset(); endOffset = nounChunkAS.lastNode().getOffset(); } } try { AnnotationSet diseaseAS = inputAS.get(outputASType, startOffset, endOffset); if (diseaseAS.isEmpty()) { FeatureMap fm = Factory.newFeatureMap(); fm.put("match", term); outputAS.add(startOffset, endOffset, outputASType, fm); } else { Annotation disease = diseaseAS.iterator().next(); FeatureMap fm = disease.getFeatures(); String meta = (String) fm.get("match"); if (meta != null) { meta = meta + " " + term; } fm.put("match", meta); } } catch (InvalidOffsetException ie) { // shouldn't happen gate.util.Err.println(ie); } }
/** * Rename annotation * * @param outputAS output annotation set * @param oldType old annotation name * @param newType new annotation name */ private void renameAnnotations(AnnotationSet outputAS, String oldType, String newType) { AnnotationSet tmpAnatomyAS = outputAS.get(oldType); for (Annotation tmpAnn : tmpAnatomyAS) { Long startOffset = tmpAnn.getStartNode().getOffset(); Long endOffset = tmpAnn.getEndNode().getOffset(); AnnotationSet existingAS = outputAS.getCovering(newType, startOffset, endOffset); // If we've already got an annotation of the same name in the same place, don't add a new one // just delete the old one if (existingAS.isEmpty()) { FeatureMap tmpFm = tmpAnn.getFeatures(); FeatureMap fm = Factory.newFeatureMap(); fm.putAll(tmpFm); try { outputAS.add(startOffset, endOffset, newType, fm); outputAS.remove(tmpAnn); } catch (InvalidOffsetException ie) { // shouldn't happen } } else { outputAS.remove(tmpAnn); } } }
@Override public void execute() throws ExecutionException { AnnotationSet inputAS = document.getAnnotations(inputASName); AnnotationSet outputAS = document.getAnnotations(outputASName); AnnotationSet tagAS = document.getAnnotations(tagASName); AnnotationSet annotsToTransfer = null; boolean newID = copyAnnotations && inputAS.equals(outputAS); mappings.clear(); // TODO clean this up so we don't have to repeat ourselves if (configURL != null) { BufferedReader in = null; try { in = new BomStrippingInputStreamReader(configURL.openStream()); String line = in.readLine(); while (line != null) { if (!line.trim().equals("")) { String[] data = line.split("=", 2); String oldName = data[0].trim(); String newName = data.length == 2 ? data[1].trim() : null; mappings.put(oldName, new Mapping(oldName, newName)); } line = in.readLine(); } } catch (IOException ioe) { ioe.printStackTrace(); } finally { IOUtils.closeQuietly(in); } } else if (annotationTypes != null) { for (String type : annotationTypes) { String[] data = type.split("=", 2); String oldName = data[0].trim(); String newName = data.length == 2 ? data[1].trim() : null; mappings.put(oldName, new Mapping(oldName, newName)); } } // else // throw new // ExecutionException("The annotation list and URL cannot both be null"); if (mappings.size() > 0) { annotsToTransfer = inputAS.get(mappings.keySet()); } else { // transfer everything annotsToTransfer = inputAS.get(); } // in case of no one annotation from some of annotationTypes if (annotsToTransfer == null || annotsToTransfer.size() == 0) return; // check if we have a BODY annotation // if not, just copy all if (textTagName == null || textTagName.equals("")) { // remove from input set unless we copy only if (!copyAnnotations) inputAS.removeAll(annotsToTransfer); transferAnnotations(new ArrayList<Annotation>(annotsToTransfer), outputAS, newID); return; } // get the BODY annotation bodyAnnotations = tagAS.get(textTagName); if (bodyAnnotations == null || bodyAnnotations.isEmpty()) { // outputAS.addAll(inputAS); if (transferAllUnlessFound) { // remove from input set unless we copy only if (!copyAnnotations) inputAS.removeAll(annotsToTransfer); transferAnnotations(new ArrayList<Annotation>(annotsToTransfer), outputAS, newID); } return; } List<Annotation> annots2Move = new ArrayList<Annotation>(); Iterator<Annotation> bodyIter = bodyAnnotations.iterator(); while (bodyIter.hasNext()) { Annotation bodyAnn = bodyIter.next(); Long start = bodyAnn.getStartNode().getOffset(); Long end = bodyAnn.getEndNode().getOffset(); // get all annotations we want transferred AnnotationSet annots2Copy = annotsToTransfer.getContained(start, end); // copy them to the new set and delete them from the old one annots2Move.addAll(annots2Copy); } if (!copyAnnotations) inputAS.removeAll(annots2Move); transferAnnotations(annots2Move, outputAS, newID); }