| 
					
				 | 
			
			
				@@ -85,6 +85,7 @@ function tripal_feature_perm(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       'create chado_feature content', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       'delete chado_feature content', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       'edit chado_feature content', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      'manage chado_feature aggregator', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -139,6 +140,31 @@ function tripal_feature_menu() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      'type' => MENU_NORMAL_ITEM, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // managing relationship aggregates 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $items['admin/tripal/tripal_feature/aggregate'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'title' => 'Feature Relationship Aggegators', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'description' => t('Features have relationships with other features and it may be desirable to aggregate the content from one ore more child or parent feature.'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'page callback' => 'tripal_feature_aggregator_page', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'access arguments' => array('manage chado_feature aggregator'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'type' => MENU_NORMAL_ITEM, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $items['admin/tripal/tripal_feature/aggregate/new'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'title' => 'Add an Aggregator', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'page callback' => 'drupal_get_form', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'page arguments' => array('tripal_feature_aggregator_form'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'access arguments' => array('manage chado_feature aggregator'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'type' => MENU_NORMAL_ITEM, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $items['admin/tripal/tripal_feature/aggregate/edit/js'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'title' => 'Edit an Aggegator', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'page callback' => 'tripal_feature_aggregator_ajax_edit', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'access arguments' => array('manage chado_feature aggregator'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     'type' => MENU_CALLBACK, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  // Adding Secondary Properties----------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $items['node/%tripal_feature_node/properties'] = array(        
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     'title' => t('Add Properties & Synonyms'),                          
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -681,8 +707,6 @@ function chado_feature_validate($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       form_set_error('gbaccession',t("Contigs cannot have a genbank accession number.  Please change the feature type or remove the accession number")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  When a node is requested by the user this function is called to allow us 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -691,8 +715,8 @@ function chado_feature_validate($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function chado_feature_load($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // add the feature_id for this node: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $sql = 'SELECT feature_id FROM {chado_feature} WHERE vid = %d'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $map = db_fetch_object(db_query($sql, $node->vid)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $feature = db_fetch_object(db_query($sql, $node->vid)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $feature_id = $feature->feature_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // get information about this feature and add it to the items in this node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $sql = "SELECT F.feature_id, F.name as featurename, F.uniquename, ". 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -703,10 +727,11 @@ function chado_feature_load($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "  INNER JOIN CVterm CVT ON F.type_id = CVT.cvterm_id ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "WHERE F.feature_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $feature = db_fetch_object(db_query($sql,$map->feature_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $feature = db_fetch_object(db_query($sql,$feature_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $additions->feature = $feature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $additions->seqlen = $feature->seqlen; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $organism_id = $feature->organism_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // add organism node nid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $sql = "SELECT nid FROM {chado_organism} WHERE organism_id = %d"; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -714,102 +739,198 @@ function chado_feature_load($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $additions->org_nid = $org_nid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $additions->accession =  variable_get('chado_feature_accession_prefix','ID') . $feature->feature_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // add the relationships for which this feature is the subject 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $additions->subject_relationships = tripal_feature_load_relationships($feature_id,'as_subject'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // add the relationships for which this feature is the object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $additions->object_relationships = tripal_feature_get_aggregate_relationships($feature_id,0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // add details about the organism 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $additions->organism = tripal_feature_load_organism($organism_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // add the list of synomyms 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $additions->synonyms = tripal_feature_load_synonyms($feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // add the list of refernces 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $additions->references = tripal_feature_load_references($feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // add the list of children located on this feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $additions->myfeaturelocs = tripal_feature_load_featurelocs($feature_id,'as_parent'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // add the list of features on which this feature is located 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $additions->featurelocs = tripal_feature_load_featurelocs($feature_id,'as_child',0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // add the formatted featureloc sequence with highlighting from relationship sequences 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $additions->floc_sequences = tripal_feature_load_featureloc_sequence ($feature_id,$additions->featurelocs);    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return $additions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_load_organism ($organism_id){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // add organism details 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $sql = "SELECT * FROM {organism} WHERE organism_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $organism = db_fetch_object(db_query($sql, $additions->feature->organism_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $organism = db_fetch_object(db_query($sql,$organism_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $additions->organism = $organism; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // add the feature synonyms 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return $organism; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_load_synonyms ($feature_id){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $sql = "SELECT S.name ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "FROM {Feature_Synonym} FS ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "  INNER JOIN Synonym S ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "    ON FS.synonym_id = S.Synonym_id ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "WHERE FS.feature_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $results = db_query($sql,$map->feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $results = db_query($sql,$feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $synonyms = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $i=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    while($synonym = db_fetch_object($results)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $synonyms[$i++] = $synonym; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $additions->synonyms = $synonyms; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return $synonyms; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_load_references ($feature_id){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // add feature references in external databases 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $sql = "SELECT F.uniquename,F.Feature_id,DBX.accession,DB.description as dbdesc, ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "   DB.db_id, DB.name as db_name, DB.urlprefix,DBX.dbxref_id ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          "FROM {Feature} F ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          "FROM {feature} F ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "  INNER JOIN Feature_dbxref FDBX on F.feature_id = FDBX.feature_id ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "  INNER JOIN Dbxref DBX on DBX.dbxref_id = FDBX.dbxref_id ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "  INNER JOIN DB on DB.db_id = DBX.db_id ". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           "WHERE F.feature_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $results = db_query($sql,$map->feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $results = db_query($sql,$feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $references = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $i=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    while($accession = db_fetch_object($results)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $references[$i++] = $accession; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $additions->references = $references; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return $references; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_load_featurelocs ($feature_id,$side = 'as_parent',$aggregate = 1){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $sql = "SELECT  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             F.name, F.feature_id, F.uniquename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             FS.name as src_name,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             FS.feature_id as src_feature_id,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             FS.uniquename as src_uniquename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             CVT.name as cvname, CVT.cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             CVTS.name as src_cvname, CVTS.cvterm_id as src_cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             FL.fmin, FL.fmax, FL.is_fmin_partial, FL.is_fmax_partial,FL.strand,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             FL.phase 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           FROM {featureloc} FL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              INNER JOIN {feature} F on FL.feature_id = F.feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              INNER JOIN {feature} FS on FS.feature_id = FL.srcfeature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              INNER JOIN {cvterm} CVT on F.type_id = CVT.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              INNER JOIN {cvterm} CVTS on FS.type_id = CVTS.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   if(strcmp($side,'as_parent')==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql .= "WHERE FL.srcfeature_id = %d "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   if(strcmp($side,'as_child')==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql .= "WHERE FL.feature_id = %d "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $flresults = db_query($sql, $feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   tripal_db_set_active($previous_db);  // now use drupal database  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // add the feature relationsips 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // copy the results into an array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $i=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $featurelocs = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   while($loc = db_fetch_object($flresults)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // if a drupal node exists for this feature then add the nid to the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // results object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql = 'SELECT nid FROM {chado_feature} WHERE feature_id = %d'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if(strcmp($side,'as_parent')==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $feature = db_fetch_object(db_query($sql, $loc->feature_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if(strcmp($side,'as_child')==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $feature = db_fetch_object(db_query($sql, $loc->src_feature_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $loc->nid = $feature->nid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // add the result to the array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $featurelocs[$i++] = $loc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // Add the relationship feature locs if aggregate is turned on 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   if($aggregate and strcmp($side,'as_parent')==0){  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // get the relationships for this feature without substituting any children 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // for the parent. We want all relationships 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $relationships = tripal_feature_get_aggregate_relationships($feature_id,0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      foreach($relationships as $rindex => $rel){  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // get the featurelocs for each of the relationship features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel_featurelocs = tripal_feature_load_featurelocs ($rel->subject_id,'as_child',0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         foreach($rel_featurelocs as $findex => $rfloc){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $featurelocs[$i++] = $rfloc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   }       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   usort($featurelocs,'tripal_feature_sort_locations'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return $featurelocs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  used to sort the feature locs by start position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_sort_locations($a,$b){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return strnatcmp($a->fmin, $b->fmin);  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_load_relationships ($feature_id,$side = 'as_subject'){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // get the relationships for this feature.  The query below is used for both 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // querying the object and subject relationships 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $sql = "SELECT  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              FS.name as subject_name,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              FS.uniquename as subject_uniquename,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FS.residues as subject_residues, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              CVTS.name as subject_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             CVTS.cvterm_id as subject_type_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              FR.subject_id,           
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              FR.type_id as relationship_type_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              CVT.name as rel_type,      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              FO.name as object_name,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              FO.uniquename as object_uniquename,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              CVTO.name as object_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FR.object_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FLS.name as src_name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FLS.uniquename as src_uniquename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FLS.feature_id as src_featureid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             CVTR.name as src_cvname,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             CVTR.cvterm_id as src_type_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.fmin,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.fmax,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.is_fmin_partial,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.is_fmax_partial, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.strand,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.phase,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.residue_info 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             CVTO.cvterm_id as object_type_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             FR.object_id,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             FR.rank 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            FROM {feature_relationship} FR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              INNER JOIN {cvterm} CVT ON FR.type_id = CVT.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              INNER JOIN {feature} FS ON FS.feature_id = FR.subject_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              INNER JOIN {feature} FO ON FO.feature_id = FR.object_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              INNER JOIN {cvterm} CVTO ON FO.type_id = CVTO.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              INNER JOIN {cvterm} CVTS ON FS.type_id = CVTS.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             LEFT JOIN {featureloc} FL on FL.feature_id = FS.feature_id  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             LEFT JOIN {feature} FLS on FLS.feature_id = FL.srcfeature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             LEFT JOIN {cvterm} CVTR on FLS.type_id = CVTR.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $osql = "$sql  WHERE FR.object_id = %d ORDER BY FLS.name, FL.fmin ASC"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $ssql = "$sql  WHERE FR.subject_id = %d ORDER BY FLS.name, FL.fmin ASC"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   if(strcmp($side,'as_object')==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql .= " WHERE FR.object_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   if(strcmp($side,'as_subject')==0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql .= " WHERE FR.subject_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $sql .= " ORDER BY FR.rank"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // first get the relationships where this feature is the object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // then where it is the subject  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // get the relationships  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $oresults = db_query($osql, $map->feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $sresults = db_query($ssql, $map->feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $results = db_query($sql, $feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // identify the drupal node for each feature and add that to the  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // relationship records 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $srelationships = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $orelationships = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // iterate through the relationships, put these in an array and add 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // in the Drupal node id if one exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $i=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $nodesql = "SELECT nid FROM {chado_feature} WHERE feature_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $rel_locs;  // holds relationship locations 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $rel_loc;   // a single relationship location 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   while($rel = db_fetch_object($oresults)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $relationships = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   while($rel = db_fetch_object($results)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      $node = db_fetch_object(db_query($nodesql,$rel->subject_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      if($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $rel->subject_nid = $node->nid; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -818,113 +939,173 @@ function chado_feature_load($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      if($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $rel->object_nid = $node->nid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      }   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     $orelationships[$i] = $rel;  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     if($rel->src_uniquename){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rel_loc = $rel->src_uniquename ."|".$rel->src_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rel_locs[$rel_loc]['uname'] = $rel->src_uniquename; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rel_locs[$rel_loc]['type'] = $rel->src_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(!$rel_locs[$rel_loc]['source_min']){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           $rel_locs[$rel_loc]['source_min'] = 99999999999; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if($rel->fmin < $rel_locs[$rel_loc]['source_min']){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           $rel_locs[$rel_loc]['source_min'] = $rel->fmin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if($rel->fmax > $rel_locs[$rel_loc]['source_max']){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           $rel_locs[$rel_loc]['source_max'] = $rel->fmax; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     $i++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // build the parts array needed for coloring the relationsihps in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // reference sequence 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   foreach($orelationships as $index => $rel){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if($rel->src_uniquename){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $rel_loc = $rel->src_uniquename ."|".$rel->src_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $rel_locs[$rel_loc]['parts'][$index]['type'] = $rel->subject_type; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $rel_locs[$rel_loc]['parts'][$index]['start'] = $rel->fmin - $rel_locs[$rel_loc]['source_min']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $rel_locs[$rel_loc]['parts'][$index]['end'] = $rel->fmax - $rel_locs[$rel_loc]['source_min']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $i=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   while($rel = db_fetch_object($sresults)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     $node = db_fetch_object(db_query($nodesql,$rel->subject_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     if($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rel->subject_nid = $node->nid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     }   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     $node = db_fetch_object(db_query($nodesql,$rel->object_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     if($node){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rel->object_nid = $node->nid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     }   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     $srelationships[$i++] = $rel;       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     $relationships[$i++] = $rel;       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $additions->object_relationships = $orelationships; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $additions->subject_relationships = $srelationships; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return $relationships; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_get_aggregate_types($feature_id){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // get the feature details 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $sql = 'SELECT type_id FROM {feature} WHERE feature_id = %d'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $feature = db_fetch_object(db_query($sql, $feature_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // now get the sequence from the reference for those feature as a  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // subject relationship to this feature. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $object_context = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $i=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   foreach ($rel_locs as $rel_loc => $attrs){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if($attrs['uname']){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $sql = "SELECT residues  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                 FROM feature  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                 WHERE uniquename = '%s' AND organism_id = %d and type_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $context = db_fetch_object(db_query($sql,$attrs['uname'],$additions->feature->organism_id,$attrs['type'])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $context->residues = substr($context->residues,$attrs['source_min'],$attrs['source_max'] - $attrs['source_min']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $context->source = $attrs['uname']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $context->fmin = $attrs['source_min']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $context->fmax = $attrs['source_max']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $context->residues = tripal_feature_color_sequence ($context->residues,$attrs['parts']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $object_context[$i] = $context; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // check to see if this feature is of a type with an aggregate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $sql = "SELECT * FROM {tripal_feature_relagg} WHERE type_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $types = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $results = db_query($sql,$feature->type_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   while($agg = db_fetch_object($results)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $types[] = $agg->rel_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return $types; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_get_aggregate_relationships($feature_id, $substitute=1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $levels=0, $base_type_id=NULL, $depth=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // we only want to recurse to as many levels deep as indicated by the  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // $levels variable, but only if this variable is > 0. If 0 then we  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // recurse until we reach the end of the relationships tree. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   if($levels > 0 and $levels == $depth){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $additions->relationship_object_info = $object_context; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // get the locations for this feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $sql = "SELECT F.name,F.feature_id, F.uniquename,CVT.name as cvname, CVT.cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.fmin, FL.fmax, FL.is_fmin_partial, FL.is_fmax_partial,FL.strand,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.phase, FL.residue_info 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           FROM featureloc FL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              INNER JOIN feature F on FL.srcfeature_id = F.feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              INNER JOIN cvterm CVT on F.type_id = CVT.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           WHERE FL.feature_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $flresults = db_query($sql, $map->feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   tripal_db_set_active($previous_db);  // now use drupal database  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // first get the relationships for this feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $relationships = tripal_feature_load_relationships($feature_id,'as_object'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // next, iterate through these relationships and descend, adding in those 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // that are specified by the aggregator. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $i=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $featurelocs = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   while($loc = db_fetch_object($flresults)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $featurelocs[$i++] = $loc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $new_relationships = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   foreach($relationships as $rindex => $rel){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // set the base type id  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if(!$base_type_id){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $base_type_id = $rel->object_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // check to see if we have an aggregator for this base type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql = "SELECT * FROM {tripal_feature_relagg} WHERE type_id = %d and rel_type_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $agg = db_fetch_object(db_query($sql,$base_type_id,$rel->subject_type_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if($agg){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // if we're not going to substitute the resulting relationships for the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // parent then we need to add the parent to our list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         if(!$substitute){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $new_relationships[$i++] = $rel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // recurse all relationships  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $agg_relationships = tripal_feature_get_aggregate_relationships( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $rel->subject_id,$levels,$base_type_id,$depth++); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // if we have an aggregate defined but we have no relationships beyond 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // this point then there's nothing we can substitute  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         if(!$agg_relationships and $substitute){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $new_relationships[$i++] = $rel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // merge all relationships into one array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         foreach($agg_relationships as $aindex => $arel){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $new_relationships[$i++] = $arel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         }   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // if we don't have an aggregate then keep the current relationship 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $new_relationships[$i++] = $rel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return $new_relationships; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_load_featureloc_sequence($feature_id,$featurelocs){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $floc_sequences = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // if we don't have any featurelocs then no point in continuing 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   if(!$featurelocs){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $additions->featurelocs = $featurelocs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // get features that are aligned to this feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $sql = "SELECT F.name,F.feature_id, F.uniquename,CVT.name as cvname, CVT.cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.fmin, FL.fmax, FL.is_fmin_partial, FL.is_fmax_partial,FL.strand,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             FL.phase, FL.residue_info 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           FROM featureloc FL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              INNER JOIN feature F on FL.feature_id = F.feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              INNER JOIN cvterm CVT on F.type_id = CVT.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           WHERE FL.srcfeature_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $flresults = db_query($sql, $map->feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   tripal_db_set_active($previous_db);  // now use drupal database  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $i=0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $myfeaturelocs = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   while($loc = db_fetch_object($flresults)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $myfeaturelocs[$i++] = $loc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // get the list of relationships (including any aggregators) and iterate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // through each one to find information needed to color-code the reference sequence 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $relationships = tripal_feature_get_aggregate_relationships($feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   if(!$relationships){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   foreach($relationships as $rindex => $rel){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // get the featurelocs for each of the relationship features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $rel_featurelocs = tripal_feature_load_featurelocs ($rel->subject_id,'as_child',0);    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      foreach($rel_featurelocs as $rfindex => $rel_featureloc){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // keep track of this unique source feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $src = $rel_featureloc->src_feature_id ."-". $rel_featureloc->src_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // copy over the results to the relationship object.  Since there can 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // be more than one feature location for each relationship feature we  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // use the '$src' variable to keep track of these. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel->featurelocs->$src->src_uniquename = $rel_featureloc->src_uniquename; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel->featurelocs->$src->src_type_id    = $rel_featureloc->src_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel->featurelocs->$src->src_cvname     = $rel_featureloc->src_cvname; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel->featurelocs->$src->fmin           = $rel_featureloc->fmin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel->featurelocs->$src->fmax           = $rel_featureloc->fmax; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel->featurelocs->$src->src_name       = $rel_featureloc->src_name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // keep track of the individual parts for each relationship  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $start = $rel->featurelocs->$src->fmin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $end   = $rel->featurelocs->$src->fmax; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel_locs[$src]['parts'][$start]['type']  = $rel->subject_type; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel_locs[$src]['parts'][$start]['start'] = $start; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $rel_locs[$src]['parts'][$start]['end']   = $end; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   $additions->myfeaturelocs = $myfeaturelocs;    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   return $additions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // now get the sequence for each featureloc and highlight the different  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   // relationships 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   $sql = "SELECT residues FROM {feature} WHERE feature_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   foreach ($featurelocs as $findex => $featureloc){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // get the residues for this feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $feature = db_fetch_object(db_query($sql,$featureloc->src_feature_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $src = $featureloc->src_feature_id ."-". $featureloc->src_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // orient the parts to the beginning of the feature sequence 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $parts = $rel_locs[$src]['parts']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      usort($parts, 'tripal_feature_sort_rel_parts'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      foreach ($parts as $start => $attrs){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $parts[$start]['start'] = $parts[$start]['start'] - $featureloc->fmin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $parts[$start]['end']   = $parts[$start]['end'] - $featureloc->fmin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $floc_sequences[$src]['src'] = $src; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $floc_sequences[$src]['type'] = $featureloc->cvname; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sequence = substr($feature->residues,$featureloc->fmin,$featureloc->fmax - $featureloc->fmin); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $floc_sequences[$src]['formatted_seq'] =  tripal_feature_color_sequence ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $sequence,$parts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return $floc_sequences; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  used to sort the list of relationship objects by start position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_sort_rel_objects($a,$b){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return strnatcmp($a->fmin, $b->fmin); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  used to sort the list of relationship parts by start position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_feature_sort_rel_parts($a,$b){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return strnatcmp($a['start'], $b['start']);  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /************************************************************************ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function tripal_feature_color_sequence ($sequence,$parts){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-watchdog('tripal_feature',print_r($parts,1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    $types = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // first get the list of types so we can create a color legend 
			 |