package outputter.process; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.xpath.XPath; /* * * This class identifies related entities. If a quality is identified to be a relational quality, * then other structures which contain the same quality can be related entities * else * If the structure that contains the relational Q is "whole_organism" then all key entities except the first one can be related entities * else * the structure can be a bilateral structure then all the key entities will be bilateral * * */ import outputter.XML2EQ; import outputter.data.CompositeEntity; import outputter.data.Entity; import outputter.data.EntityProposals; import outputter.data.FormalRelation; import outputter.data.REntity; import outputter.data.SimpleEntity; import outputter.knowledge.Dictionary; public class RelationalEntityStrategy implements AnnotationStrategy{ private static final Logger LOGGER = Logger.getLogger(RelationalEntityStrategy.class); ArrayList<EntityProposals> relatedentities; ArrayList<EntityProposals> primaryentities; ArrayList<EntityProposals> keyentities; private Hashtable<String,ArrayList<EntityProposals>> entities = new Hashtable<String,ArrayList<EntityProposals>>(); private Entity bilateralentity; public Hashtable<String, ArrayList<EntityProposals>> getEntities() { return entities; } public RelationalEntityStrategy(Entity bilateral) { // TODO Auto-generated constructor stub this.bilateralentity = bilateral; this.relatedentities= new ArrayList<EntityProposals>(); this.primaryentities = new ArrayList<EntityProposals>(); } /* * Makes a call to Structureswithsamecharacters() to identify the entities of the relational quality */ public void handle() { bilateralstructures(); } /* It checks, if the structure belongs to lateralsides classes and * if true, it creates "in a right side of" classes on key entities */ private void bilateralstructures() { EntityProposals RelatedEP = new EntityProposals(); EntityProposals PrimaryEP = new EntityProposals(); //Cloning to modify this object and create new related and primary entities //If it is a simple entity add part of multicellular organism if(this.bilateralentity instanceof SimpleEntity)// define { //Related Entity: right SimpleEntity bilateralclone1 = ((SimpleEntity)this.bilateralentity).clone(); REntity related1 = this.multicellularrelatedentity("in right side of"); CompositeEntity centity = new CompositeEntity(); centity.addEntity((SimpleEntity)bilateralclone1); centity.addEntity(related1); RelatedEP.add(centity); //Primary Entities: left related1 = this.multicellularrelatedentity("in left side of"); CompositeEntity centity1 = new CompositeEntity(); centity1.addEntity((SimpleEntity)bilateralclone1); centity1.addEntity(related1); PrimaryEP.add(centity1); } if(this.bilateralentity instanceof CompositeEntity)//In the composite structure, it identifies the bilateral entity and makes it to be located in a multicellular organism { //Cloning to prevent the original entity from being modified CompositeEntity bilateralclone1 = ((CompositeEntity)this.bilateralentity).clone(); CompositeEntity bilateralclone2 = ((CompositeEntity)this.bilateralentity).clone(); //Creating related entities by appending 'in right side of' relation to the bilateral structure //for(Entity e:((CompositeEntity) bilateralclone1).getEntities()) ArrayList<Entity> entities = ((CompositeEntity) bilateralclone1).getEntities(); for(int i = 0; i < entities.size(); i++ ) { Entity e = entities.get(i); if(XML2EQ.elk.lateralsidescache.get(e.getPrimaryEntityLabel())!=null) { if(e instanceof REntity) { Entity RelatedE = ((REntity)e).getEntity();//bilateralentity REntity entity1 = this.multicellularrelatedentity("in right side of"); CompositeEntity centity1 = new CompositeEntity(); centity1.addEntity(RelatedE); centity1.addEntity(entity1); ((REntity) e).setEntity(centity1); RelatedEP.add(bilateralclone1); }else if(e instanceof SimpleEntity && i ==0) { //A (part of B) => A (part of (C part of B)): replace the RE following the SE //C = 'dorsal region' REntity re = (REntity) entities.get(i+1); CompositeEntity centity1 = new CompositeEntity(); //C part of B Entity dr = Dictionary.ventralregion; dr.setConfidenceScore(0.5f); centity1.addEntity(dr); centity1.addEntity(re.clone()); re.setEntity(centity1); entities.set(i+1, re); RelatedEP.add(bilateralclone1); } } } //Creating primary entities by appending in right side of relation to the bilateral structure //for(Entity e:((CompositeEntity) bilateralclone2).getEntities()) entities = ((CompositeEntity) bilateralclone2).getEntities(); for(int i = 0; i < entities.size(); i++ ) { Entity e = entities.get(i); if(XML2EQ.elk.lateralsidescache.get(e.getPrimaryEntityLabel())!=null) { if(e instanceof REntity) { Entity RelatedE = ((REntity)e).getEntity();//bilateralentity //Primary Entities REntity entity2 = this.multicellularrelatedentity("in left side of"); CompositeEntity centity2 = new CompositeEntity(); centity2.addEntity(RelatedE); centity2.addEntity(entity2); ((REntity) e).setEntity(centity2); PrimaryEP.add(bilateralclone2); }else if(e instanceof SimpleEntity && i ==0) { //A (part of B) => A (part of (C part of B)): replace the RE following the SE //C = 'ventral region' REntity re = (REntity) entities.get(i+1); CompositeEntity centity1 = new CompositeEntity(); //C part of B Entity vr = Dictionary.dorsalregion; vr.setConfidenceScore(0.5f); centity1.addEntity(vr); centity1.addEntity(re.clone()); re.setEntity(centity1); entities.set(i+1, re); PrimaryEP.add(bilateralclone2); } } } } if(RelatedEP.getProposals().size()>0) { this.relatedentities.add(RelatedEP); this.primaryentities.add(PrimaryEP); } //This will contain all the identified related and primary entities this.entities.put("Related Entities",this.relatedentities); this.entities.put("Primary Entity", this.primaryentities); } public REntity multicellularrelatedentity(String relation) { String id; if(relation.equals("in right side of")) id="BSPO:0000121"; else id="BSPO:0000120"; FormalRelation rel = new FormalRelation(); rel.setSearchString(""); rel.setString(relation); rel.setLabel(Dictionary.resrelationQ.get(id)); rel.setId(id); rel.setConfidenceScore((float)1.0); SimpleEntity entity = new SimpleEntity(); entity.setLabel("multicellular organism"); entity.setSearchString(""); entity.setString("multicellular organism"); entity.setId("UBERON:0000468"); entity.setConfidenceScore((float)1.0); REntity relatedentity = new REntity(rel,entity); return relatedentity; } public ArrayList<EntityProposals> getrelatedEntities() { return relatedentities; } public ArrayList<EntityProposals> getPrimaryentities() { return primaryentities; } public static void main(String[] args) { // TODO Auto-generated method stub } }