public void process()

in ctakes-temporal/src/main/java/org/apache/ctakes/temporal/ae/EventDischargeTimeAnnotator.java [137:248]


	public void process(JCas jCas) throws AnalysisEngineProcessException {
		//get discharge Time id: T1:
		TimeMention dischargeTime = null;
		//TODO
		//may need better way to identify Discharge Time other than relative span information:
		for(TimeMention time: JCasUtil.selectCovered(jCas, TimeMention.class, 40, 60)){
			if(time.getTimeClass().equals("DATE")){
				dischargeTime = time;
				break;
			}
		}

		//2. identify the Hospital Course section:
		List<Segment> courses = Lists.newArrayList();
		Collection<Segment> segments = JCasUtil.select(jCas, Segment.class);
		for(Segment seg: segments){
			if (seg.getId().equals("course")){//find the right segment
				if(JCasUtil.selectCovered(jCas,Sentence.class,seg).size()>0){//ignore empty section
					courses.add(seg);
				}
			}
		}


		//get event-time1 relations:
		Map<List<Annotation>, TemporalTextRelation> dischargeTimeRelationLookup;
		dischargeTimeRelationLookup = new HashMap<>();
		if (this.isTraining()) {
			dischargeTimeRelationLookup = new HashMap<>();
			for (TemporalTextRelation relation : JCasUtil.select(jCas, TemporalTextRelation.class)) {
				Annotation arg1 = relation.getArg1().getArgument();
				Annotation arg2 = relation.getArg2().getArgument();
				// The key is a list of args so we can do bi-directional lookup
				if(arg1 instanceof TimeMention && arg2!=null && arg2 instanceof EventMention ){
					if( arg1==dischargeTime){
						dischargeTimeRelationLookup.put(Arrays.asList(arg1, arg2), relation);
						continue;
					}
				}else if(arg1 instanceof EventMention && ( arg2 == null || arg2 instanceof TimeMention)){
					if( arg2==dischargeTime ){
						dischargeTimeRelationLookup.put(Arrays.asList(arg1, arg2), relation);
						continue;
					}
				}

			}
		}

		Map<EventMention, List<EventMention>> coveringMap =
				  JCasUtil.indexCovering(jCas, EventMention.class, EventMention.class);
		for(Segment course: courses){
			for (EventMention eventMention : JCasUtil.selectCovered(jCas, EventMention.class, course)) {
				if (eventMention.getClass().equals(EventMention.class)) {//for every gold event
					List<Feature> features = extractFeatures(jCas,eventMention);
					if (this.isTraining()) {
						TemporalTextRelation relation = dischargeTimeRelationLookup.get(Arrays.asList(eventMention, dischargeTime));
						String category = null;
						if (relation != null) {
							category = relation.getCategory();
						} else {
							relation = dischargeTimeRelationLookup.get(Arrays.asList(dischargeTime, eventMention));
							if (relation != null) {
								if(relation.getCategory().equals("OVERLAP")){
									category = relation.getCategory();
								}else if (relation.getCategory().equals("BEFORE")){
									category = "AFTER";
								}else if (relation.getCategory().equals("AFTER")){
									category = "BEFORE";
								}
							}
						}
						if(category!=null){
							this.dataWriter.write(new Instance<>(category, features));
							//add nearby system-generated events as additional instances
//							Collection<EventMention> eventList = coveringMap.get(eventMention);
//							for(EventMention covEvent : eventList){
//								if(!covEvent.getClass().equals(EventMention.class)){
//									List<Feature> covEvfeatures = extractFeatures(jCas,covEvent);
//									this.dataWriter.write(new Instance<>(category, covEvfeatures));
//								}
//							}
//							for(EventMention covedEvent : JCasUtil.selectCovered(jCas, EventMention.class, eventMention)){//select covered events
//								List<Feature> covedEvfeatures = extractFeatures(jCas,covedEvent);
//								this.dataWriter.write(new Instance<>(category, covedEvfeatures));
//							}
						}
					} else {
						String outcome = this.classifier.classify(features);
						if(outcome!=null){
							// add the relation to the CAS
							RelationArgument relArg1 = new RelationArgument(jCas);
							relArg1.setArgument(eventMention);
							relArg1.setRole("Argument");
							relArg1.addToIndexes();
							RelationArgument relArg2 = new RelationArgument(jCas);
							relArg2.setArgument(dischargeTime);
							relArg2.setRole("Related_to");
							relArg2.addToIndexes();
							TemporalTextRelation relation = new TemporalTextRelation(jCas);
							relation.setArg1(relArg1);
							relation.setArg2(relArg2);
							relation.setCategory(outcome);
							relation.addToIndexes();
						}else{
							if (dischargeTime!=null)
								System.out.println("cannot classify "+ eventMention.getCoveredText()+" and " + dischargeTime.getCoveredText());
						}						
					}
				}
			}
		}
	}