public void process()

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


	public void process(JCas jCas) throws AnalysisEngineProcessException {
		//get discharge Time id: T1:
		TimeMention admissionTime = null;
		//TODO
		//may need better way to identify Discharge Time other than relative span information:
		for (TimeMention time : JCasUtil.selectCovered(jCas, TimeMention.class, 15, 30)) {
			if(time.getTimeClass().equals("DATE")){
				admissionTime = 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);
				}
			}
		}

		if (admissionTime != null){
			//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 instanceof EventMention ){
						if( arg1==admissionTime){
							dischargeTimeRelationLookup.put(Arrays.asList(arg1, arg2), relation);
							continue;
						}
					}else if(arg1 instanceof EventMention && arg2 instanceof TimeMention){
						if( arg2==admissionTime ){
							dischargeTimeRelationLookup.put(Arrays.asList(arg1, arg2), relation);
							continue;
						}
					}

				}
			}

			Map<EventMention, List<EventMention>> coveringMap =
					JCasUtil.indexCovering(jCas, EventMention.class, EventMention.class);
			for (EventMention eventMention : JCasUtil.select(jCas, EventMention.class)) {
				if (eventMention.getClass().equals(EventMention.class) && !isDischarge(eventMention) && !isAdmission(eventMention) && !inCourseSection(eventMention,courses)) {//for every gold event, not discharge, not admission, not in course section
					List<Feature> features = extractFeatures(jCas,eventMention);
					if (this.isTraining()) {
						TemporalTextRelation relation = dischargeTimeRelationLookup.get(Arrays.asList(eventMention, admissionTime));
						String category = null;
						if (relation != null) {
							category = relation.getCategory();
						} else {
							relation = dischargeTimeRelationLookup.get(Arrays.asList(admissionTime, 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(admissionTime);
							relArg2.setRole("Related_to");
							relArg2.addToIndexes();
							TemporalTextRelation relation = new TemporalTextRelation(jCas);
							relation.setArg1(relArg1);
							relation.setArg2(relArg2);
							relation.setCategory(outcome);
							relation.addToIndexes();
						}else{
							System.out.println("cannot classify "+ eventMention.getCoveredText()+" and " + admissionTime.getCoveredText());
						}
					}
				}
			}
		}

	}