public DirectedGraph<String, DefaultEdge > parseHPO(BlastProtein Protein) throws Exception  {
		
		// Query Hashtable for geneID
		String GeneID = ProtGeneMap.get(Protein.getId());
		
		// Graph Data structures
		DirectedGraph<String, DefaultEdge > Graph = null;
		Graph = new SimpleDirectedGraph<String, DefaultEdge>(DefaultEdge.class);

		if(GeneID == null)
		{
			System.out.print("wait");
			throw new Exception("ProteinID is null for Protein "+Protein.getId() );
		}
		if(!GeneID.isEmpty())
		{
			///get the HPO(s) of the Gene 
			HPO Hpoobject = new HPO(); 
			ArrayList<String> HPOofGene = Hpoobject.getHPOfromGeneID(GeneID);
			
			/// make sure that we have a collection to put the terms in
			ArrayList<HPOTerm> mycol = new ArrayList<HPOTerm>();
			if(HPOofGene == null)
				try {
					throw new Exception("Error: Can not find HPOTerms of ProteinId:"+Protein.getId()+" GeneID="+GeneID);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			for (String HPOstring : HPOofGene) {
								
				/// get the related terms 
					
					HPOTerms(HPOstring, mycol);
							
				
			}
						
			/// print out the collection
			for (HPOTerm item : mycol) {
				
				if( ! Graph.containsVertex(item.ParentID ))
				{
					Graph.addVertex(item.ParentID);
				}
				
				if( ! Graph.containsVertex(item.ID) )
				{
					Graph.addVertex(item.ID);
				}
				
				if( ! Graph.containsEdge(item.ParentID, item.ID))
				{
					Graph.addEdge(item.ParentID, item.ID);
				}
			}		
			
//			System.out.println("Graph To String : ");
//			System.out.println(Graph.toString() );			
		}
		return Graph;
	}