package org.nextprot.api.core.utils.annot.merge.impl; import org.nextprot.api.commons.exception.NextProtException; import org.nextprot.api.core.domain.annotation.AnnotationIsoformSpecificity; import org.nextprot.api.core.utils.annot.merge.ObjectMatcher; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; public class VariantPositionMatcher implements ObjectMatcher<Map<String, AnnotationIsoformSpecificity>> { @Override public boolean match(Map<String, AnnotationIsoformSpecificity> m1, Map<String, AnnotationIsoformSpecificity> m2) { Set<String> isoNames = (m1.size() > m2.size()) ? m1.keySet() : m2.keySet(); for (String name : isoNames) { if (m1.containsKey(name) && m2.containsKey(name) && m1.get(name).hasSameIsoformPositions(m2.get(name))) { // get other isoforms Set<String> otherIsoNames = isoNames.stream().filter(isoName -> !isoName.equals(name)).collect(Collectors.toSet()); // other isoforms should have same variant at same locations otherIsoformPositionsShouldBeValid(m1, m2, otherIsoNames); return true; } } return false; } private void otherIsoformPositionsShouldBeValid(Map<String, AnnotationIsoformSpecificity> m1, Map<String, AnnotationIsoformSpecificity> m2, Set<String> others) { for (String isoName : others) { if (!m1.containsKey(isoName) || !m2.containsKey(isoName)) { throw new NextProtException("missing isoform positions for "+isoName+": map1: "+m1.containsKey(isoName)+", map2: "+m2.containsKey(isoName)); } else if (!m1.get(isoName).hasSameIsoformPositions(m2.get(isoName))) { throw new NextProtException("conflicting propagation for "+isoName+": map1: "+ m1.get(isoName).getFirstPosition()+ "-" + m1.get(isoName).getLastPosition() +" vs map2: " + m2.get(isoName).getFirstPosition()+ "-" + m2.get(isoName).getLastPosition()); } } } }