package outputter.output;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Set;
import org.apache.log4j.Logger;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import outputter.ApplicationUtilities;
import outputter.XML2EQ;
import outputter.evaluation.EQHolder;
import outputter.knowledge.ELKReasoner;
import owlaccessor.OWLAccessorImpl;
public class HTMLOutput {
public static Connection conn;
private static final Logger LOGGER = Logger.getLogger(HTMLOutput.class);
static ELKReasoner elkentity;
static ELKReasoner elkquality;
static ELKReasoner elkspatial=null;
static String relation ="inheres_in|adjacent_to|distal_to|OBO_REL_part_of|part of|inheres in|adjacent to|distal to|PHENOSCAPE_complement_of|complement of|and|some|bearer_of|anterior_to|anteriorly_connected_to|attaches_to|extends_from|connected_to|decreased_in_magnitude_relative_to|deep_to|develops_from|distal_to|distally_connected_to|dorsal_to|encloses|extends_to|has_cross_section|has_muscle_insertion|has_muscle_origin|has_part|in_anterior_side_of|in_distal_side_of|in_lateral_side_of|in_left_side_of|in_median_plane_of|in_posterior_side_of|in_proximal_side_of|in_right_side_of|increased_in_magnitude_relative_to|located_in|overlaps|part_of|passes_through|posterior_to|posteriorly_connected_to|proximal_to|proximally connected to|similar_in_magnitude_relative_to|surrounded by|surrounds|ventral_to|vicinity_of|serves_as_attachment_site_for|inheres_in|not";
static String relationid = relation+ "|BFO_0000050|BFO_0000052|BFO_0000053|BFO:0000053|RO:0002220|BSPO:0000096|UBERON:anteriorly_connected_to|UBERON:attaches_to|PHENOSCAPE:extends_from|RO:0002150|PATO:decreased_in_magnitude_relative_to|BSPO:0000107|RO:0002202|BSPO:0000097|UBERON:distally_connected_to|BSPO:0000098|UBERON:encloses|PHENOSCAPE:extends_to|PATO:has_cross_section|UBERON:has_muscle_insertion|UBERON:has_muscle_origin|BFO:0000051|BSPO:0000123|BSPO:0000125|UBERON:in_lateral_side_of|BSPO:0000120|UBERON:in_median_plane_of|BSPO:0000122|BSPO:0000124|BSPO:0000121|PATO:increased_in_magnitude_relative_to|OBO_REL:located_in|RO:0002131|BFO:0000050|BSPO:passes_through|BSPO:0000099|UBERON:posteriorly_connected_to|BSPO:0000100|UBERON:proximally_connected_to|PATO:similar_in_magnitude_relative_to|RO:0002219|RO:0002221|BSPO:0000102|BSPO:0000103|PHENOSCAPE:serves_as_attachment_site_for|PHENOSCAPE:complement_of";
/**
* @param args
*/
/*
* Creates new DB connection
*
*/
public static void GetDBConnection()
{
try {
Class.forName(ApplicationUtilities.getProperty("database.driverPath"));
conn = DriverManager.getConnection(ApplicationUtilities.getProperty("database.url"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/*
* Fetches all the character,state eq statements from the database.
*
* @param character_state contains all the character,state information
* @param characters holds all the EQ statements belonging a state,character combination
* @param outputtable contains the output from the previous step
* @param curatortablename contains the curatortable names which should be outputted along with original input
* @param number of curators contains the number of curator result against which charparser output is being compared to
*
*/
public static void fetchFromDB(ArrayList<String> character_state, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, ArrayList<EQHolder>>>> characters, String outputtable, String curatortablename, int numberofcurators) throws SQLException
{
ResultSet rs;
String sql;
Statement stmt = conn.createStatement();
for(int i=0;i<character_state.size();i++)
{
LinkedHashMap<String,LinkedHashMap<String,ArrayList<EQHolder>>> stateeqs = new LinkedHashMap<String,LinkedHashMap<String,ArrayList<EQHolder>>>();
LinkedHashMap<String,ArrayList<EQHolder>> individualstateeqs = new LinkedHashMap<String,ArrayList<EQHolder>>();
String characterid = character_state.get(i).split("\\|\\|\\|")[0];
String stateid = character_state.get(i).split("\\|\\|\\|")[1];
String characteridlabel="";
String stateidlabel="";
sql = "select characterlabel,statelabel,entitylabel,entityid,qualitylabel,qualityid,relatedentitylabel,relatedentityid,unontologizedentity, unontologizedquality, unontologizedrelatedentity from "+ApplicationUtilities.getProperty("database.name")+"."+outputtable+
" where characterid = '"+characterid +"' and stateid='"+stateid+"'";
rs = stmt.executeQuery(sql);
ArrayList<EQHolder> charparserstate = new ArrayList<EQHolder>();
while(rs.next())
{
EQHolder eq = new EQHolder();
characteridlabel=characterid+"|||"+rs.getString("characterlabel");
stateidlabel=stateid+"|||"+rs.getString("statelabel");
eq.setEntityid(rs.getString("entityid"));
eq.setEntitylabel(rs.getString("entitylabel"));
eq.setQualityid(rs.getString("qualityid"));
eq.setQualitylabel(rs.getString("qualitylabel"));
eq.setRelatedentityid(rs.getString("relatedentityid"));
eq.setRelatedentitylabel(rs.getString("relatedentitylabel"));
eq.setUnontologizedentity(rs.getString("unontologizedentity")!=null?rs.getString("unontologizedentity"):"");
eq.setUnontologizedquality(rs.getString("unontologizedquality")!=null?rs.getString("unontologizedquality"):"");
eq.setUnontologizedrelatedentity(rs.getString("unontologizedrelatedentity")!=null?rs.getString("unontologizedrelatedentity"):"");
eq.setGsunontologizedentity("");
eq.setGsunontologizedquality("");
eq.setGsunontologizedrelatedentity("");
charparserstate.add(eq);
}
individualstateeqs.put("Charaparser", charparserstate);
//curator1
for(int count=0;count<numberofcurators;count++)
{
sql = "select entitylabel,entityid,qualitylabel,qualityid,relatedentitylabel,relatedentityid from "+ApplicationUtilities.getProperty("database.name")+"."+curatortablename+(count+1)+
" where characterid = '"+characterid +"' and stateid='"+stateid+"'";
rs = stmt.executeQuery(sql);
ArrayList<EQHolder> curator1state = new ArrayList<EQHolder>();
while(rs.next())
{
EQHolder eq = new EQHolder();
eq.setEntityid(rs.getString("entityid"));
eq.setEntitylabel(rs.getString("entitylabel"));
eq.setQualityid(rs.getString("qualityid"));
eq.setQualitylabel(rs.getString("qualitylabel"));
eq.setRelatedentityid(rs.getString("relatedentityid"));
eq.setRelatedentitylabel(rs.getString("relatedentitylabel"));
eq.setGsunontologizedentity(retrieveunontologized(rs.getString("entityid"),rs.getString("entitylabel")));
eq.setGsunontologizedquality(retrieveunontologized(rs.getString("qualityid"),rs.getString("qualitylabel")));
eq.setGsunontologizedrelatedentity(retrieveunontologized(rs.getString("relatedentityid"),rs.getString("relatedentitylabel")));
eq.setUnontologizedentity("");
eq.setUnontologizedquality("");
eq.setUnontologizedrelatedentity("");
//will send each of the id,label to the checkontology function, that returns the labels of unontologized ids
curator1state.add(eq);
}
individualstateeqs.put(curatortablename+(count+1), curator1state);
}
stateeqs.put(stateidlabel, individualstateeqs);
if(characters.get(characteridlabel)==null)
{
characters.put(characteridlabel, stateeqs);
}
else
{
LinkedHashMap<String,LinkedHashMap<String,ArrayList<EQHolder>>> character = characters.get(characteridlabel);
character.putAll(stateeqs);
}
}
}
private static String retrieveunontologized(String id, String label) {
int count=0;
System.out.println();
String ids[] = extractids(id);
ELKReasoner tempelk=null;
String unontologized ="";
id = id.toUpperCase().trim();
for(String tempid:ids)
{
if(tempid.contains("BSPO"))
{
tempelk = elkspatial;
} else if(tempid.contains("PATO"))
{
tempelk = elkquality;
} else
{
tempelk = elkentity;
}
if(tempelk.CheckClassExistence(tempid)==false)
{
unontologized+=extractLabel(label,count)+"#";
}
count++;
}
unontologized = unontologized.replaceAll("(#)$", "");
return unontologized;
}
private static String extractLabel(String label,int index)
{
String labels[]=null,final_labels[] = null;
int count=0;
label= label.replaceAll("(\\(|\\))", "");
labels = label.split(relation);
final_labels = new String[labels.length];
for(String temp:labels)
{
if(temp.equals(" ")==false)
{
final_labels[count++] = temp;
}
}
System.out.println(final_labels[index].trim());
return final_labels[index].trim();
}
//Extracts ids from the string
private static String[] extractids(String value) {
value=value.replaceAll("(\\(|\\))", "");
String[] temp = value.split("\\s");
String id ="";
for(String t:temp)
{
if(t.matches("[A-Z]+[_:][0-9]+")==true)
{
id+=t+" ";
}
}
id=id.trim();
return id.split(" ");
}
/*
* Prints the ontology and charparser versions in the output HTML
*
*
*/
public static void version(PrintWriter output,String version) throws IOException, OWLOntologyCreationException
{
//OWLOntology temp=null;
output.println("<CENTER> <TABLE border = 2> <TR> <TH COLSPAN =\"2\">");
output.println("<B>Ontology Versions</B>");
output.println("</TH></TR>");
for(OWLAccessorImpl api: XML2EQ.ontoutil.OWLqualityOntoAPIs)
{
OWLOntology temp=null;
String S[]=api.getSource().split("[\\\\.]");
output.println("<TR> <TD>");
output.println((S[S.length-2].toUpperCase()));
output.println("</TD> <TD>");
temp = api.getManager().getOntologies().iterator().next();
output.println((temp.getOntologyID().getVersionIRI()));
output.println("</TD> </TR>");
}
for(OWLAccessorImpl api1: XML2EQ.ontoutil.OWLentityOntoAPIs)
{
OWLOntology temp=null;
String S[]=api1.getSource().split("[\\\\.]");
output.println("<TR> <TD>");
output.println((S[S.length-2].toUpperCase()));
output.println("</TD> <TD>");
Set<OWLOntology> ontologies = api1.getManager().getOntologies();
for(OWLOntology ontology:ontologies)
{
if(ontology.getOntologyID().getVersionIRI()!=null){
temp = ontology;
break;
}
/*if(ontology.toString().contains(S[S.length-2]))
{
temp = ontology;
break;
}*/
}
output.println(temp!=null?(temp.getOntologyID().getVersionIRI()):"");
output.println("</TD> </TR>");
}
output.println("<TR><TD>charparser version</TD><TD>"+ version+"</TD></TR>");
output.println("</TABLE>");
output.println("</CENTER>");
//output.close();
}
/*
* output's the EQ statement in HTML format
*
* @param filename prefix will be the output filename
* @param tablename contains the name of the table which contains goldstandard or curators results
* @param numberofcurators holds the number of curators result compared with the charparser output
*
* @output: Prints an HTML output with charparser and curators result for a characterid and stateid combination
*/
public static void outputHTML(String outputtable,String curatortablename, int numberofcurators, String htmloutputfilename)
{
String columns[] = {"CharacterID","CharacterLabel","StateID","StateLabel","Source of EQ","EntityID",
"EntityLabel","QualityID","QualityLabel","RelatedEntityID","RelatedEntityLabel","UnontologizedEntity","UnontologizedQuality","UnontologizedRelatedEntity",
"GSunontologizedEntity","GSunontologizedQuality","GSunontologizedRelatedEntity"};
Statement stmt;
ArrayList<String> character_state = new ArrayList<String>();
try {
elkentity = new ELKReasoner(new File(ApplicationUtilities.getProperty("ontology.dir")+System.getProperty("file.separator")+ApplicationUtilities.getProperty("ontology.uberon")+".owl"), false);
elkquality = new ELKReasoner(new File(ApplicationUtilities.getProperty("ontology.dir")+System.getProperty("file.separator")+ApplicationUtilities.getProperty("ontology.pato")+".owl"), false);
elkspatial = new ELKReasoner(new File(ApplicationUtilities.getProperty("ontology.dir")+System.getProperty("file.separator")+ApplicationUtilities.getProperty("ontology.bspo")+".owl"), false);
//elkentity = new ELKReasoner(new File(XML2EQ.uberon), false);
//elkquality = new ELKReasoner(new File(XML2EQ.pato), false);
//elkspatial = new ELKReasoner(new File(XML2EQ.bspo), false);
} catch (OWLOntologyCreationException e1) {
e1.printStackTrace();
}
try {
PrintWriter output = new PrintWriter(new FileWriter(ApplicationUtilities.getProperty("output.dir")+htmloutputfilename+".html"));
LOGGER.debug("output saved in "+ApplicationUtilities.getProperty("output.dir")+htmloutputfilename+".html");
output.println("<HTML>");
output.println("<HEAD>");
output.println("<TITLE>");
output.println("Charparser Output");
output.println(" </TITLE></HEAD>");
output.println("<BODY>");
output.println("<CENTER>");
output.println("<H1>");
output.println("Charparser Output");
output.println("</H1>");
if(XML2EQ.ontoutil!=null)
{
try {
version(output,ApplicationUtilities.getProperty("charparser.version"));
} catch (OWLOntologyCreationException e) {
e.printStackTrace();
}
}
output.println("</CENTER><BR><BR>");
output.println("<CENTER>");
output.println("<TABLE BORDER=\"1\" width=\"250%\">");
output.println("<col width=\"5%\"/>");
output.println("<col width=\"5%\"/>");
output.println("<col width=\"5%\"/>");
output.println("<col width=\"5%\"/>");
output.println("<col width=\"5%\"/>");
output.println("<col width=\"5%\"/>");
output.println("<col width=\"20%\"/>");
output.println("<col width=\"5%\"/>");
output.println("<col width=\"20%\"/>");
output.println("<col width=\"5%\"/>");
output.println("<col width=\"20%\"/>");
output.println("<TR>");
for(int i=0;i<columns.length;i++)
{
output.println("<TH>");
output.println(columns[i]);
output.println("</TH>");
}
output.println("</TR>");
GetDBConnection();
stmt = conn.createStatement();
//sql= "create table if not exists htmloutput(characterid varchar(300), characterlabel varchar(500), ";
String sql = "select distinct characterid, stateid from "+ApplicationUtilities.getProperty("database.name")+"."+outputtable;
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
String characterid = rs.getString("characterid");
String stateid = rs.getString("stateid");
if(characterid.length() > 0 && stateid.length() > 0){
character_state.add(characterid+"|||"+stateid);
}
}
LinkedHashMap<String,LinkedHashMap<String,LinkedHashMap<String,ArrayList<EQHolder>>>> characters = new LinkedHashMap<String,LinkedHashMap<String,LinkedHashMap<String,ArrayList<EQHolder>>>>();
fetchFromDB(character_state,characters,outputtable,curatortablename,numberofcurators);
for(String characteridlabel:characters.keySet())//Iterates through all the characters
{
Set<String> states = characters.get(characteridlabel).keySet();//gets all the states
for(String stateidlabel:states)//Iterate through all the states
{
LinkedHashMap<String,ArrayList<EQHolder>> statedescription = characters.get(characteridlabel).get(stateidlabel);
Set<String> sources = statedescription.keySet();
for(String source:sources)//Iterate through each sources
{
ArrayList<EQHolder> eqs = statedescription.get(source);
String entityid="";
String entitylabel="";
String qualityid="";
String qualitylabel="";
String relatedentityid="";
String relatedentitylabel="";
String unontologizedentity="";
String unontologizedquality="";
String unontologizedrelatedentity="";
String gsunontologizedentity="";
String gsunontologizedquality="";
String gsunontologizedrelatedentity="";
output.println("<TR>");
output.println("<TD>");
output.println(characteridlabel.split("\\|\\|\\|")[0]);
output.println("</TD>");
output.println("<TD>");
output.println(characteridlabel.split("\\|\\|\\|")[1]);
output.println("</TD>");
output.println("<TD>");
output.println(stateidlabel.split("\\|\\|\\|")[0]);
output.println("</TD>");
output.println("<TD>");
output.println(stateidlabel.split("\\|\\|\\|")[1]);
output.println("</TD>");
output.println("<TD>");
output.println(source);
output.println("</TD>");
int eqcount=1;
for(EQHolder eq:eqs)
{
entityid += eqcount+". *"+eq.getEntityid().replaceAll("(Score:)","").replaceAll("@,", "<BR>*")+"<BR>";
entitylabel += eqcount+". *"+eq.getEntitylabel().replaceAll("(Score:)","").replaceAll("@,", "<BR>*")+"<BR>";
if((eq.getRelatedentityid()!=null)&&(eq.getRelatedentityid().equals("")==false))
{
relatedentityid += eqcount+". *"+eq.getRelatedentityid().replaceAll("(Score:)","").replaceAll("@,", "<BR>*")+"<BR>";
relatedentitylabel += eqcount+". *"+eq.getRelatedentitylabel().replaceAll("(Score:)","").replaceAll("@,", "<BR>*")+"<BR>";
}
qualityid += eqcount+". *"+eq.getQualityid().replaceAll("(Score:)","").replaceAll("@,", "<BR>*")+"<BR>";
qualitylabel += eqcount+". *"+eq.getQualitylabel().replaceAll("(Score:)","").replaceAll("@,", "<BR>*")+"<BR>";
unontologizedentity += eqcount+". *"+eq.getUnontologizedentity().replaceAll("@,", "<BR>*")+"<BR>";
unontologizedquality += eqcount+". *"+eq.getUnontologizedquality().replaceAll("@,", "<BR>*")+"<BR>";
unontologizedrelatedentity += eqcount+". *"+eq.getUnontologizedrelatedentity().replaceAll("@,", "<BR>*")+"<BR>";
gsunontologizedentity += eqcount+". *"+eq.getGsunontologizedentity().replaceAll("#", "<BR>*")+"<BR>";
gsunontologizedquality += eqcount+". *"+eq.getGsunontologizedquality().replaceAll("#", "<BR>*")+"<BR>";
gsunontologizedrelatedentity += eqcount+". *"+eq.getGsunontologizedrelatedentity().replaceAll("#", "<BR>*")+"<BR>";
eqcount++;
}
output.println("<TD>");
output.println(entityid.equals("")?" ":entityid);
output.println("</TD>");
output.println("<TD>");
output.println(entitylabel.equals("")?" ":entitylabel);
output.println("</TD>");
output.println("<TD>");
output.println(qualityid.equals("")?" ":qualityid);
output.println("</TD>");
output.println("<TD>");
output.println(qualitylabel.equals("")?" ":qualitylabel);
output.println("</TD>");
output.println("<TD>");
output.println(relatedentityid.equals("")?" ":relatedentityid);
output.println("</TD>");
output.println("<TD>");
output.println(relatedentitylabel.equals("")?" ":relatedentitylabel);
output.println("</TD>");
output.println("<TD>");
output.println(unontologizedentity.equals("")?" ":unontologizedentity);
output.println("</TD>");
output.println("<TD>");
output.println(unontologizedquality.equals("")?" ":unontologizedquality);
output.println("</TD>");
output.println("<TD>");
output.println(unontologizedrelatedentity.equals("")?" ":unontologizedrelatedentity);
output.println("</TD>");
output.println("<TD>");
output.println(gsunontologizedentity.equals("")?" ":gsunontologizedentity);
output.println("</TD>");
output.println("<TD>");
output.println(gsunontologizedquality.equals("")?" ":gsunontologizedquality);
output.println("</TD>");
output.println("<TD>");
output.println(gsunontologizedrelatedentity.equals("")?" ":gsunontologizedrelatedentity);
output.println("</TD>");
output.println("</TR>");
}
}
}
output.println("</TABLE>");
output.println("</CENTER>");
output.println("</BODY>");
output.println("</HTML>");
output.close();
conn.close();
} catch (IOException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//String choutput = "xml2eq_best";
String choutput ="naive_40674";
String cuoutput = "knowledge";
String htmloutput = "naive_40674_to_3_knoweldge";
int numberofcurators = 3;
outputHTML(choutput,cuoutput,numberofcurators, htmloutput);
}
}