public synchronized void buildCache() {
		cache = new TreeSet<Annotation>(new AnnotationFilter.AnnotationComparatorByStartNode());
		
		List<List<Annotation>> childFilterAnnotListList = new ArrayList<List<Annotation>>(children.size());
		List<Integer> currentCur = new ArrayList<Integer>(children.size());
		
		parent.setScenario(scenario);
		
		for (AnnotationFilter c : children) {
			c.setScenario(scenario);
			Set<Annotation> as;
			as = c.findAll();
			List<Annotation> annots = new ArrayList<Annotation>(as.size());
			for (Annotation a : as) {
				annots.add(a);
			}
			childFilterAnnotListList.add(annots);
			currentCur.add((Integer) 0);
		}
		
		for (Annotation p : parent.findAll()) {
			Long start, end;
			FilterTree tree = ttt;
			
			start = p.getStartNode().getOffset();
			end = p.getEndNode().getOffset();
			
			for (int i = 0; i < childFilterAnnotListList.size(); i++) {
				boolean has = false;
				int cCurCopy;
				List<Annotation> annotListOfChildFilter = childFilterAnnotListList.get(i);
				cCurCopy = currentCur.get(i);
				while (cCurCopy < annotListOfChildFilter.size() && annotListOfChildFilter.get(cCurCopy).getEndNode().getOffset() <= end) {
					if (annotListOfChildFilter.get(cCurCopy).getStartNode().getOffset() >= start) {
						has = true;
						cCurCopy ++;
						break;
					}
					cCurCopy ++;
				}
				currentCur.set(i, cCurCopy);
				tree = tree.subtree(has);
				if (tree.getResult() != null) {
					break;
				}
			}
			
			assert tree.getResult() != null : "assertion failed: Error found in Structure of Truth Table Tree";
			
			if (tree.getResult()) {
				cache.add(p);
			}
		}
	}