| 
					
				 | 
			
			
				@@ -1,2319 +0,0 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-<?php 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Provides gff3 loading functionality. Creates features based on their specification 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * in a GFF3 file. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @defgroup gff3_loader GFF3 Feature Loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup tripal_chado 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Provides gff3 loading functionality. Creates features based on their specification in a GFF3 file. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * The form to submit a GFF3 loading job 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_gff3_load_form() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['gff_file']= array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type'          => 'textfield', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title'         => t('GFF3 File'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description'   => t('Please enter the full system path for the GFF file, or a path within the Drupal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                           installation (e.g. /sites/default/files/xyz.gff).  The path must be accessible to the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                           server on which this Drupal instance is running.'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#required' => TRUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // get the list of organisms 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $sql = "SELECT * FROM {organism} ORDER BY genus, species"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $org_rset = chado_query($sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $organisms = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $organisms[''] = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  while ($organism = $org_rset->fetchObject()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $organisms[$organism->organism_id] = "$organism->genus $organism->species ($organism->common_name)"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['organism_id'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title'       => t('Organism'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type'        => t('select'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t("Choose the organism to which these sequences are associated"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#required'    => TRUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#options'     => $organisms, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // get the list of analyses 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $sql = "SELECT * FROM {analysis} ORDER BY name"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $org_rset = chado_query($sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $analyses = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $analyses[''] = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  while ($analysis = $org_rset->fetchObject()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $analyses[$analysis->analysis_id] = "$analysis->name ($analysis->program $analysis->programversion, $analysis->sourcename)"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['analysis_id'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   '#title'       => t('Analysis'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   '#type'        => t('select'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   '#description' => t("Choose the analysis to which these features are associated. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       Why specify an analysis for a data load?  All data comes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       from some place, even if downloaded from Genbank. By specifying 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       analysis details for all data imports it allows an end user to reproduce the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       data set, but at least indicates the source of the data."), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   '#required'    => TRUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   '#options'     => $analyses, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['line_number']= array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type'          => 'textfield', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title'         => t('Start Line Number'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description'   => t('Enter the line number in the GFF file where you would like to begin processing.  The 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      first line is line number 1.  This option is useful for examining loading problems with large GFF files.'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#size' => 10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['landmark_type'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title'       => t('Landmark Type'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type'        => t('textfield'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t("Optional. Use this field to specify a Sequence Ontology type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       for the landmark sequences in the GFF fie (e.g. 'chromosome'). If the GFF file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       contains a '##sequence-region' line that describes the landmark sequences to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       which all others are aligned and a type is provided here then the features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       will be created if they do not already exist.  If they do exist then this 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       field is not used."), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['alt_id_attr'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title'       => t('ID Attribute'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type'        => t('textfield'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t("Optional. Sometimes lines in the GFF file are missing the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      required ID attribute that specifies the unique name of the feature, but there 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      may be another attribute that can uniquely identify the feature.  If so, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      you may specify the name of the attribute to use for the name."), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Advanced Options 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'fieldset', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Advanced Options'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#collapsible' => TRUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#collapsed' => TRUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['protein_names'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'fieldset', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Protein Names'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#collapsible' => TRUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#collapsed' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#weight' => 5, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['protein_names']['re_help'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'item', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#markup' => t('A regular expression is an advanced method for extracting information from a string of text. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   If your GFF3 file does not contain polypeptide (or protein) features, but contains CDS features, proteins will be automatically created. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   By default the loader will give each protein a name based on the name of the corresponding mRNA followed by the "-protein" suffix. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   If you want to customize the name of the created protein, you can use the following regex.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['protein_names']['re_mrna'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'textfield', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Regular expression for the mRNA name'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#required' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t('Enter the regular expression that will extract portions of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       the mRNA unique name. For example, for a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       mRNA with a unique name finishing by -RX (e.g. SPECIES0000001-RA), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       the regular expression would be, "^(.*?)-R([A-Z]+)$".') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['protein_names']['re_protein'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'textfield', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Replacement string for the protein name'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#required' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t('Enter the replacement string that will be used to create 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       the protein name based on the mRNA regular expression. For example, for a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       mRNA regular expression "^(.*?)-R()[A-Z]+)$", the corresponding protein regular 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       expression would be "$1-P$2".') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['import_options'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'fieldset', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Import Options'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#collapsible' => TRUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#collapsed' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#weight' => 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['import_options']['use_transaction']= array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'checkbox', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Use a transaction'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#required' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t('Use a database transaction when loading the GFF file.  If an error occurs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      the entire datset loaded prior to the failure will be rolled back and will not be available 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      in the database.  If this option is unchecked and failure occurs all records up to the point 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      of failure will be present in the database.'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#default_value' => 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['import_options']['add_only']= array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'checkbox', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Import only new features'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#required' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t('The job will skip features in the GFF file that already 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                         exist in the database and import only new features.'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['import_options']['update']= array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'checkbox', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Import all and update'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#required' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#default_value' => 'checked', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t('Existing features will be updated and new features will be added.  Attributes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                         for a feature that are not present in the GFF but which are present in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                         database will not be altered.'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#default_value' => 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// SPF: there are bugs in refreshing and removing features.  The bugs arise 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//      if a feature in the GFF does not have a uniquename. GenSAS will auto 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//      generate this uniquename and it will not be the same as a previous 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//      load because it uses the date.  This causes orphaned CDS/exons, UTRs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//      to be left behind during a delete or refresh.  So, the short term 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//      fix is to remove these options. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//   $form['import_options']['refresh']= array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//     '#type' => 'checkbox', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//     '#title' => t('Import all and replace'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//     '#required' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//     '#description' => t('Existing features will be updated and feature properties not 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                          present in the GFF file will be removed.'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//   ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//   $form['import_options']['remove']= array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//     '#type' => 'checkbox', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//     '#title' => t('Delete features'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//     '#required' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//     '#description' => t('Features present in the GFF file that exist in the database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                          will be removed rather than imported'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//   ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['import_options']['create_organism']= array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'checkbox', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Create organism'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#required' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t('The Tripal GFF loader supports the "organism" attribute. This allows features of a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       different organism to be aligned to the landmark sequence of another species.  The format of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       attribute is "organism=[genus]:[species]", where [genus] is the organism\'s genus and [species] is the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       species name. Check this box to automatically add the organism to the database if it does not already exists. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       Otherwise lines with an oraganism attribute where the organism is not present in the database will be skipped.'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['targets'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'fieldset', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Targets'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#collapsible' => TRUE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#collapsed' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#weight' => 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['targets']['adesc'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#markup' => t("When alignments are represented in the GFF file (e.g. such as 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       alignments of cDNA sequences to a whole genome, or blast matches), they are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       represented using two feature types: 'match' (or cDNA_match, EST_match, etc.) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       and 'match_part'.  These features may also have a 'Target' attribute to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       specify the sequence that is being aligned. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       However, the organism to which the aligned sequence belongs may not be present in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       GFF file.  Here you can specify the organism and feature type of the target sequences. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       The options here will apply to all targets unless the organism and type are explicity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       set in the GFF file using the 'target_organism' and 'target_type' attributes."), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['targets']['target_organism_id'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title'       => t('Target Organism'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type'        => t('select'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t("Optional. Choose the organism to which target sequences belong. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      Select this only if target sequences belong to a different organism than the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      one specified above. And only choose an organism here if all of the target sequences 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      belong to the same species.  If the targets in the GFF file belong to multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      different species then the organism must be specified using the 'target_organism=genus:species' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      attribute in the GFF file."), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#options'     => $organisms, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['targets']['target_type'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title'       => t('Target Type'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type'        => t('textfield'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t("Optional. If the unique name for a target sequence is not unique (e.g. a protein 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       and an mRNA have the same name) then you must specify the type for all targets in the GFF file. If 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       the targets are of different types then the type must be specified using the 'target_type=type' attribute 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       in the GFF file. This must be a valid Sequence Ontology (SO) term."), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['advanced']['targets']['create_target']= array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'checkbox', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#title' => t('Create Target'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#required' => FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#description' => t("If the target feature cannot be found, create one using the organism and type specified above, or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       using the 'target_organism' and 'target_type' fields specified in the GFF file.  Values specified in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       GFF file take precedence over those specified above."), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form['button'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#type' => 'submit', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#value' => t('Import GFF3 file'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#weight' => 10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return $form; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Validate the GFF3 loading job form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_gff3_load_form_validate($form, &$form_state) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $gff_file = trim($form_state['values']['gff_file']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $organism_id = $form_state['values']['organism_id']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $target_organism_id = $form_state['values']['target_organism_id']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $target_type = trim($form_state['values']['target_type']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $create_target = $form_state['values']['create_target']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $create_organism = $form_state['values']['create_organism']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $add_only = $form_state['values']['add_only']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $update   = $form_state['values']['update']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $refresh  = 0; //$form_state['values']['refresh']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $remove   = 0; //$form_state['values']['remove']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $use_transaction   = $form_state['values']['use_transaction']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $line_number   = trim($form_state['values']['line_number']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $landmark_type   = trim($form_state['values']['landmark_type']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $alt_id_attr   = trim($form_state['values']['alt_id_attr']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $re_mrna = trim($form_state['values']['re_mrna']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $re_protein = trim($form_state['values']['re_protein']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // check to see if the file is located local to Drupal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $gff_file = trim($gff_file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $dfile = $_SERVER['DOCUMENT_ROOT'] . base_path() . $gff_file; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!file_exists($dfile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if not local to Drupal, the file must be someplace else, just use 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // the full path provided 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $dfile = $gff_file; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!file_exists($dfile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    form_set_error('gff_file', t("Cannot find the file on the system. Check that the file exists or that the web server has permissions to read the file.")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // @coder-ignore: there are no functions being called here 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (($add_only AND ($update   OR $refresh  OR $remove)) OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ($update   AND ($add_only OR $refresh  OR $remove)) OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ($refresh  AND ($update   OR $add_only OR $remove)) OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ($remove   AND ($update   OR $refresh  OR $add_only))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    form_set_error('add_only', t("Please select only one checkbox from the import options section")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($line_number and !is_numeric($line_number) or $line_number < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    form_set_error('line_number', t("Please provide an integer line number greater than zero.")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!($re_mrna and $re_protein) and ($re_mrna or $re_protein)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    form_set_error('re_uname', t("You must provide both a regular expression for mRNA and a replacement string for protein")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // check the regular expression to make sure it is valid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  set_error_handler(function() {}, E_WARNING); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result_re = preg_match("/" . $re_mrna . "/", null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result = preg_replace("/" . $re_mrna . "/", $re_protein, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  restore_error_handler(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($result_re === FALSE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    form_set_error('re_mrna', 'Invalid regular expression.'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } else if ($result === FALSE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    form_set_error('re_protein', 'Invalid replacement string.'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Submit the GFF3 loading job 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_gff3_load_form_submit($form, &$form_state) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  global $user; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $gff_file = trim($form_state['values']['gff_file']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $organism_id = $form_state['values']['organism_id']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $add_only = $form_state['values']['add_only']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $update   = $form_state['values']['update']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $refresh  = 0; //$form_state['values']['refresh']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $remove   = 0; //$form_state['values']['remove']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $analysis_id = $form_state['values']['analysis_id']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $use_transaction   = $form_state['values']['use_transaction']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $target_organism_id = $form_state['values']['target_organism_id']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $target_type = trim($form_state['values']['target_type']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $create_target = $form_state['values']['create_target']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $line_number   = trim($form_state['values']['line_number']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $landmark_type   = trim($form_state['values']['landmark_type']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $alt_id_attr   = trim($form_state['values']['alt_id_attr']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $create_organism = $form_state['values']['create_organism']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $re_mrna = trim($form_state['values']['re_mrna']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $re_protein = trim($form_state['values']['re_protein']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $args = array($gff_file, $organism_id, $analysis_id, $add_only, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $update, $refresh, $remove, $use_transaction, $target_organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $target_type, $create_target, $line_number, $landmark_type, $alt_id_attr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $create_organism, $re_mrna, $re_protein); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $type = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($add_only) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $type = 'import only new features'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($update) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $type = 'import all and update'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($refresh) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $type = 'import all and replace'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($remove) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $type = 'delete features'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $fname = preg_replace("/.*\/(.*)/", "$1", $gff_file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $includes = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    module_load_include('inc', 'tripal_chado', 'includes/loaders/tripal_chado.gff_loader'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tripal_add_job("$type GFF3 file: $fname", 'tripal_chado', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'tripal_feature_load_gff3', $args, $user->uid, 10, $includes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Actually load a GFF3 file. This is the function called by tripal jobs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $gff_file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   The full path to the GFF file on the filesystem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $organism_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   The organism_id of the organism to which the features in the GFF belong 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $analysis_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   The anlaysis_id of the analysis from which the features in the GFF were generated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $add_only 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Set to 1 if feature should be added only.  In the case where a feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   already exists, it will not be updated.  Default is 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $update 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Set to 1 to update existing features. New features will be added. Attributes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   for a feature that are not present in the GFF but which are present in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   database will not be altered. Default is 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $refresh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Set to 1 to update existing features. New features will be added. Attributes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   for a feature that are not present in the GFF but which are present in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   database will be removed. Default is 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $remove 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Set to 1 to remove features present in the GFF file that exist in the database. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Default is 0. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $use_transaction 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Set to 1 to use a transaction when loading the GFF. Any failure during 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   loading will result in the rollback of any changes. Default is 1. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $target_organism_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   If the GFF file contains a 'Target' attribute then the feature and the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   target will have an alignment created, but to find the proper target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   feature the target organism must also be known.  If different from the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   organism specified for the GFF file, then use  this argument to specify 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   the target organism.  Only use this argument if all target sequences belong 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   to the same species. If the targets in the GFF file belong to multiple 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   different species then the organism must be specified using the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   'target_organism=genus:species' attribute in the GFF file. Default is NULL. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $target_type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   If the GFF file contains a 'Target' attribute then the feature and the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   target will have an alignment created, but to find the proper target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   feature the target organism must also be known.  This can be used to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   specify the target feature type to help with identification of the target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   feature.  Only use this argument if all target sequences types are the same. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   If the targets are of different types then the type must be specified using 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   the 'target_type=type' attribute in the GFF file. This must be a valid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Sequence Ontology (SO) term. Default is NULL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $create_target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Set to 1 to create the target feature if it cannot be found in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   database. Default is 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $start_line 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Set this to the line in the GFF file where importing should start. This 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   is useful for testing and debugging GFF files that may have problems and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   you want to start at a particular line to speed testing.  Default = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $landmark_type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Use this argument to specify a Sequence Ontology term name for the landmark 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   sequences in the GFF fie (e.g. 'chromosome'), if the GFF file contains a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   '##sequence-region' line that describes the landmark sequences. Default = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $alt_id_attr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Sometimes lines in the GFF file are missing the required ID attribute that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   specifies the unique name of the feature. If so, you may specify the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   name of an existing attribute to use for the ID. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $create_organism 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   The Tripal GFF loader supports the "organism" attribute. This allows 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   features of a different organism to be aligned to the landmark sequence of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   another species. The format of the attribute is "organism=[genus]:[species]", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   where [genus] is the organism's genus and [species] is the species name. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   Check this box to automatically add the organism to the database if it does 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   not already exists. Otherwise lines with an oraganism attribute where the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   organism is not present in the database will be skipped. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $re_mrna A 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *          regular expression to extract portions from mRNA id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $re_protein A 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *          replacement string to generate the protein id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $job 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *  The tripal job_id.  Only used by the Tripal Jobs subsystem. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3($gff_file, $organism_id, $analysis_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $add_only = 0, $update = 1, $refresh = 0, $remove = 0, $use_transaction = 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $target_organism_id = NULL, $target_type = NULL,  $create_target = 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $start_line = 1, $landmark_type = '', $alt_id_attr = '',  $create_organism = FALSE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $re_mrna = '', $re_protein = '', $job = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $ret = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $date = getdate(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // An array that stores CVterms that have been looked up so we don't have 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // to do the database query every time. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $cvterm_lookup = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // An array that stores Landmarks that have been looked up so we don't have 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // to do the database query every time. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $landmark_lookup = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // empty the temp tables 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $sql = "DELETE FROM {tripal_gff_temp}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  chado_query($sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $sql = "DELETE FROM {tripal_gffcds_temp}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  chado_query($sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $sql = "DELETE FROM {tripal_gffprotein_temp}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  chado_query($sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // begin the transaction 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $transaction = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($use_transaction) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $transaction = db_transaction(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    print "\nNOTE: Loading of this GFF file is performed using a database transaction. \n" . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         "If the load fails or is terminated prematurely then the entire set of \n" . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         "insertions/updates is rolled back and will not be found in the database\n\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // check to see if the file is located local to Drupal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $dfile = $_SERVER['DOCUMENT_ROOT'] . base_path() . $gff_file; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!file_exists($dfile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // if not local to Drupal, the file must be someplace else, just use 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // the full path provided 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $dfile = $gff_file; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!file_exists($dfile)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error('tripal_chado', TRIPAL_ERROR, "Cannot find the file: %dfile", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        array('%dfile' => $dfile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    print "Opening $gff_file\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    //$lines = file($dfile,FILE_SKIP_EMPTY_LINES); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $fh = fopen($dfile, 'r'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$fh) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error('tripal_chado', TRIPAL_ERROR, "cannot open file: %dfile", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        array('%dfile' => $dfile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $filesize = filesize($dfile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // get the controlled vocaubulary that we'll be using.  The 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // default is the 'sequence' ontology 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $sql = "SELECT * FROM {cv} WHERE name = :cvname"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $cv = chado_query($sql, array(':cvname' => 'sequence'))->fetchObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$cv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error('tripal_chado', TRIPAL_ERROR, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        "Cannot find the 'sequence' ontology", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // get the organism for which this GFF3 file belongs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $sql = "SELECT * FROM {organism} WHERE organism_id = :organism_id"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $organism = chado_query($sql, array(':organism_id' => $organism_id))->fetchObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $interval = intval($filesize * 0.0001); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($interval == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $interval = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $in_fasta = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $line_num = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $num_read = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $intv_read = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // prepare the statement used to get the cvterm for each feature. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $sel_cvterm_sql = " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      SELECT CVT.cvterm_id, CVT.cv_id, CVT.name, CVT.definition, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        CVT.dbxref_id, CVT.is_obsolete, CVT.is_relationshiptype 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      FROM {cvterm} CVT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        INNER JOIN {cv} CV on CVT.cv_id = CV.cv_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        LEFT JOIN {cvtermsynonym} CVTS on CVTS.cvterm_id = CVT.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      WHERE CV.cv_id = :cv_id and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       (lower(CVT.name) = lower(:name) or lower(CVTS.synonym) = lower(:synonym)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // If a landmark type was provided then pre-retrieve that. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($landmark_type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $query = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ':cv_id' => $cv->cv_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ':name' => $landmark_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ':synonym' => $landmark_type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $result = chado_query($sel_cvterm_sql, $query); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $landmark_cvterm = $result->fetchObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$landmark_cvterm) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error('tripal_chado', TRIPAL_ERROR, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'cannot find landmark feature type \'%landmark_type\'.', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          array('%landmark_type' => $landmark_type)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // iterate through each line of the GFF file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    print "Parsing Line $line_num (0.00%). Memory: " . number_format(memory_get_usage()) . " bytes\r"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    while ($line = fgets($fh)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $line_num++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $size = drupal_strlen($line); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $num_read += $size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $intv_read += $size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($line_num < $start_line) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // update the job status every 1% features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($job and $intv_read >= $interval) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $intv_read = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $percent = sprintf("%.2f", ($num_read / $filesize) * 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        print "Parsing Line $line_num (" . $percent . "%). Memory: " . number_format(memory_get_usage()) . " bytes.\r"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_set_job_progress($job, intval(($num_read / $filesize) * 100)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // check to see if we have FASTA section, if so then set the variable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // to start parsing 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (preg_match('/^##FASTA/i', $line)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        print "Parsing FASTA portion...\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($remove) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // we're done because this is a delete operation so break out of the loop. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_feature_load_gff3_fasta($fh, $interval, $num_read, $intv_read, $line_num, $filesize, $job); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // if the ##sequence-region line is present then we want to add a new feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (preg_match('/^##sequence-region (.*?) (\d+) (\d+)$/i', $line, $region_matches)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rid = $region_matches[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rstart = $region_matches[2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rend = $region_matches[3]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($landmark_type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_feature_load_gff3_feature($organism, $analysis_id, $landmark_cvterm, $rid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $rid, '', 'f', 'f', 1, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // skip comments 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (preg_match('/^#/', $line)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // skip empty lines 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (preg_match('/^\s*$/', $line)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // get the columns 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $cols = explode("\t", $line); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (sizeof($cols) != 9) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error('tripal_chado', TRIPAL_ERROR, 'improper number of columns on line %line_num', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          array('%line_num' => $line_num)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // get the column values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $landmark = $cols[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $source   = $cols[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $type     = $cols[2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $start    = $cols[3]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $end      = $cols[4]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $score    = $cols[5]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $strand   = $cols[6]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $phase    = $cols[7]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attrs    = explode(";", $cols[8]);  // split by a semicolon 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // ready the start and stop for chado.  Chado expects these positions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // to be zero-based, so we substract 1 from the fmin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $fmin = $start - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $fmax = $end; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($end < $start) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $fmin = $end - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $fmax = $start; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // format the strand for chado 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (strcmp($strand, '.') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $strand = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      elseif (strcmp($strand, '+') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $strand = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      elseif (strcmp($strand, '-') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $strand = -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (strcmp($phase, '.') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $phase = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (array_key_exists($type, $cvterm_lookup)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $cvterm = $cvterm_lookup[$type]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $result = chado_query($sel_cvterm_sql, array(':cv_id' => $cv->cv_id, ':name' => $type, ':synonym' => $type)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $cvterm = $result->fetchObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $cvterm_lookup[$type] = $cvterm; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!$cvterm) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_report_error('tripal_chado', TRIPAL_ERROR, 'cannot find feature term \'%type\' on line %line_num of the GFF file', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            array('%type' => $type, '%line_num' => $line_num)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // break apart each of the attributes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $tags = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_name = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_uniquename = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_residue_info = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_locgroup = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_fmin_partial = 'f'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_fmax_partial = 'f'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_is_obsolete = 'f'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_is_analysis = 'f'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_others = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $residues = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // the organism to which a feature belongs can be set in the GFF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // file using the 'organism' attribute.  By default we 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // set the $feature_organism variable to the default organism for the landmark 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_organism = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $feature_organism = $organism; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      foreach ($attrs as $attr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $attr = rtrim($attr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $attr = ltrim($attr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (strcmp($attr, '')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!preg_match('/^[^\=]+\=.+$/', $attr)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_report_error('tripal_chado', TRIPAL_ERROR, 'Attribute is not correctly formatted on line %line_num: %attr', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            array('%line_num' => $line_num, '%attr' => $attr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // break apart each tag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $tag = preg_split("/=/", $attr, 2);  // split by equals sign 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // multiple instances of an attribute are separated by commas 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $tag_name = $tag[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!array_key_exists($tag_name, $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $tags[$tag_name] = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $tags[$tag_name] = array_merge($tags[$tag_name], explode(",", $tag[1]));  // split by comma 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // replace the URL escape codes for each tag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for ($i = 0; $i < count($tags[$tag_name]); $i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $tags[$tag_name][$i] = urldecode($tags[$tag_name][$i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // get the name and ID tags 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $skip_feature = 0;  // if there is a problem with any of the attributes this variable gets set 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (strcmp($tag_name, 'ID') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_uniquename =  urldecode($tag[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elseif (strcmp($tag_name, 'Name') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_name =  urldecode($tag[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elseif (strcmp($tag_name, 'organism') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_organism = urldecode($tag[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $org_matches = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (preg_match('/^(.*?):(.*?)$/', $attr_organism, $org_matches)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'genus' => $org_matches[1], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'species' => $org_matches[2], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $org = chado_select_record('organism', array("*"), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (count($org) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              if ($create_organism) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                $feature_organism = (object) chado_insert_record('organism', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!$feature_organism) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  tripal_report_error('tripal_chado', TRIPAL_ERROR, "Could not add the organism, '%org', from line %line. Skipping this line. ", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    array('%org' => $attr_organism, '%line' => $line_num)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  $skip_feature = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                tripal_report_error('tripal_chado', TRIPAL_ERROR, "The organism attribute '%org' on line %line does not exist. Skipping this line. ", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  array('%org' => $attr_organism, '%line' => $line_num)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                $skip_feature = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              // We found the organism in the database so use it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $feature_organism = $org[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_report_error('tripal_chado', TRIPAL_ERROR, "The organism attribute '%org' on line %line is not properly formated. It " . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              "should be of the form: organism=Genus:species.  Skipping this line.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              array('%org' => $attr_organism, '%line' => $line_num)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $skip_feature = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Get the list of non-reserved attributes. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elseif (strcmp($tag_name, 'Alias') != 0        and strcmp($tag_name, 'Parent') != 0 and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                strcmp($tag_name, 'Target') != 0       and strcmp($tag_name, 'Gap') != 0 and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                strcmp($tag_name, 'Derives_from') != 0 and strcmp($tag_name, 'Note') != 0 and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                strcmp($tag_name, 'Dbxref') != 0       and strcmp($tag_name, 'Ontology_term') != 0 and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                strcmp($tag_name, 'Is_circular') != 0  and strcmp($tag_name, 'target_organism') != 0 and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                strcmp($tag_name, 'target_type') != 0  and strcmp($tag_name, 'organism' != 0)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          foreach ($tags[$tag_name] as $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $attr_others[$tag_name][] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // If neither name nor uniquename are provided then generate one. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$attr_uniquename and !$attr_name) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Check if an alternate ID field is suggested, if so, then use 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // that for the name. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (array_key_exists($alt_id_attr, $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_uniquename = $tags[$alt_id_attr][0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_name = $attr_uniquename; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // If the row has a parent then generate a uniquename using the parent name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // add the date to the name in the event there are more than one child with 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // the same parent. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elseif (array_key_exists('Parent', $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_uniquename = $tags['Parent'][0] . "-$type-$landmark-" . $date[0] . ":" . ($fmin + 1) . ".." . $fmax; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_name = $attr_uniquename; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Generate a unique name based on the date, type and location 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // and set the name to simply be the type. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_uniquename = $date[0] . "-$type-$landmark:" . ($fmin + 1) . ".." . $fmax; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_name = $type; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // If a name is not specified then use the unique name as the name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (strcmp($attr_name, '') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $attr_name = $attr_uniquename; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // If an ID attribute is not specified then we must generate a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // unique ID. Do this by combining the attribute name with the date 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // and line number. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$attr_uniquename) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $attr_uniquename = $attr_name . '-' . $date[0] . '-' . $line_num; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // Make sure the landmark sequence exists in the database.  If the user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // has not specified a landmark type (and it's not required in the GFF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // format) then we don't know the type of the landmark so we'll hope 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // that it's unique across all types for the organism. Only do this 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // test if the landmark and the feature are different. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$remove and !(strcmp($landmark, $attr_uniquename) == 0 or strcmp($landmark, $attr_name) == 0) and !in_array($landmark, $landmark_lookup)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $select = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'organism_id' => $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'uniquename'  => $landmark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $columns = array('count(*) as num_landmarks'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($landmark_type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $select['type_id'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'name' => $landmark_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $count = chado_select_record('feature', $columns, $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!$count or count($count) == 0 or $count[0]->num_landmarks == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // now look for the landmark using the name rather than uniquename. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $select = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'organism_id' => $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'name'  => $landmark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $columns = array('count(*) as num_landmarks'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if ($landmark_type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $select['type_id'] = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'name' => $landmark_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $count = chado_select_record('feature', $columns, $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (!$count or count($count) == 0 or $count[0]->num_landmarks == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_report_error('tripal_chado', TRIPAL_ERROR, "The landmark '%landmark' cannot be found for this organism (%species) " . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  "Please add the landmark and then retry the import of this GFF3 " . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  "file", array('%landmark' => $landmark, '%species' => $organism->genus . " " . $organism->species)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          elseif ($count[0]->num_landmarks > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_report_error('tripal_chado', TRIPAL_ERROR, "The landmark '%landmark' has more than one entry for this organism (%species) " . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  "Cannot continue", array('%landmark' => $landmark, '%species' => $organism->genus . " " . $organism->species)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($count[0]->num_landmarks > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_report_error('tripal_chado', TRIPAL_ERROR, "The landmark '%landmark' is not unique for this organism. " . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                "The features cannot be associated", array('%landmark' => $landmark)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // The landmark was found, remember it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $landmark_lookup[] = $landmark; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // If the option is to remove or refresh then we want to remove 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // the feature from the database. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($remove or $refresh) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Next remove the feature itself. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $sql = "DELETE FROM {feature} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                WHERE organism_id = %d and uniquename = '%s' and type_id = %d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $match = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'organism_id' => $feature_organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'uniquename'  => $attr_uniquename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'type_id'     => $cvterm->cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $result = chado_delete_record('feature', $match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!$result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_report_error('tripal_chado', TRIPAL_ERROR, "cannot delete feature %attr_uniquename", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            array('%attr_uniquename' => $attr_uniquename)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $feature = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        unset($result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // Add or update the feature and all properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($update or $refresh or $add_only) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Add/update the feature. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $feature = tripal_feature_load_gff3_feature($feature_organism, $analysis_id, $cvterm, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_uniquename, $attr_name, $residues, $attr_is_analysis, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $attr_is_obsolete, $add_only, $score); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($feature) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // Add a record for this feature to the tripal_gff_temp table for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // later lookup. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'feature_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'organism_id' => $feature->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'type_name' => $type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'uniquename' => $feature->uniquename 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // make sure this record doesn't already exist in our temp table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $results = chado_select_record('tripal_gff_temp', array('*'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (count($results) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $result = chado_insert_record('tripal_gff_temp', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (!$result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              tripal_report_error('tripal_chado', TRIPAL_ERROR, "Cound not save record in temporary table, Cannot continue.", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              exit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add/update the featureloc if the landmark and the ID are not the same 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // if they are the same then this entry in the GFF is probably a landmark identifier 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (strcmp($landmark, $attr_uniquename) !=0 ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_feature_load_gff3_featureloc($feature, $organism, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $landmark, $fmin, $fmax, $strand, $phase, $attr_fmin_partial, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $attr_fmax_partial, $attr_residue_info, $attr_locgroup); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add any aliases for this feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (array_key_exists('Alias', $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_feature_load_gff3_alias($feature, $tags['Alias']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add any dbxrefs for this feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (array_key_exists('Dbxref', $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_feature_load_gff3_dbxref($feature, $tags['Dbxref']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add any ontology terms for this feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (array_key_exists('Ontology_term', $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_feature_load_gff3_ontology($feature, $tags['Ontology_term']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add parent relationships 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (array_key_exists('Parent', $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_feature_load_gff3_parents($feature, $cvterm, $tags['Parent'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $feature_organism->organism_id, $strand, $phase, $fmin, $fmax); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add target relationships 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (array_key_exists('Target', $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_feature_load_gff3_target($feature, $tags, $target_organism_id, $target_type, $create_target, $attr_locgroup); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add gap information.  This goes in simply as a property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (array_key_exists('Gap', $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            foreach ($tags['Gap'] as $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              tripal_feature_load_gff3_property($feature, 'Gap', $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add notes. This goes in simply as a property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (array_key_exists('Note', $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            foreach ($tags['Note'] as $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                tripal_feature_load_gff3_property($feature, 'Note', $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add the Derives_from relationship (e.g. polycistronic genes). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (array_key_exists('Derives_from', $tags)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_feature_load_gff3_derives_from($feature, $cvterm, $tags['Derives_from'][0], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $feature_organism, $fmin, $fmax); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add in the GFF3_source dbxref so that GBrowse can find the feature using the source column 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $source_ref = array('GFF_source:' . $source); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_feature_load_gff3_dbxref($feature, $source_ref); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // add any additional attributes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if ($attr_others) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            foreach ($attr_others as $tag_name => $values) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              foreach ($values as $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                tripal_feature_load_gff3_property($feature, $tag_name, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // Do some last bit of processing. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$remove) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // First, add any protein sequences if needed. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sql = "SELECT feature_id FROM {tripal_gffcds_temp} LIMIT 1 OFFSET 1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $has_cds = chado_query($sql)->fetchField(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($has_cds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        print "\nAdding protein sequences if CDS exist and no proteins in GFF...\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $sql = " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          SELECT F.feature_id, F.name, F.uniquename, TGCT.strand, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            CVT.cvterm_id, CVT.name as feature_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            min(TGCT.fmin) as fmin, max(TGCT.fmax) as fmax, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            TGPT.feature_id as protein_id, TGPT.fmin as protein_fmin, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            TGPT.fmax as protein_fmax, FLM.uniquename as landmark 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          FROM {tripal_gffcds_temp} TGCT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            INNER JOIN {feature} F on F.feature_id = TGCT.parent_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            INNER JOIN {cvterm} CVT on CVT.cvterm_id = F.type_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            INNER JOIN {featureloc} L on F.feature_id = L.feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            INNER JOIN {feature} FLM on L.srcfeature_id = FLM.feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            LEFT JOIN {tripal_gffprotein_temp} TGPT on TGPT.parent_id = F.feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          GROUP BY F.feature_id, F.name, F.uniquename, CVT.cvterm_id, CVT.name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            TGPT.feature_id, TGPT.fmin, TGPT.fmax, TGCT.strand, FLM.uniquename 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $results = chado_query($sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $protein_cvterm = tripal_get_cvterm(array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'name' => 'polypeptide', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'cv_id' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'name' => 'sequence' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        while ($result = $results->fetchObject()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // If a protein exists with this same parent then don't add a new 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // protein. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (!$result->protein_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // Get details about this protein 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if ($re_mrna and $re_protein) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              // We use a regex to generate protein name from mRNA name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $uname = preg_replace("/$re_mrna/", $re_protein, $result->uniquename); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $name =  $result->name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              // No regex, use the default '-protein' suffix 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $uname = $result->uniquename . '-protein'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $name =  $result->name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'parent_id' => $result->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'fmin' => $result->fmin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $min_phase = chado_select_record('tripal_gffcds_temp', array('phase'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'parent_id' => $result->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'fmax' => $result->fmax 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $max_phase = chado_select_record('tripal_gffcds_temp', array('phase'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $pfmin = $result->fmin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $pfmax = $result->fmax; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if ($result->strand == '-1') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $pfmax -= $max_phase[0]->phase; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $pfmin += $min_phase[0]->phase; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // Add the new protein record. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $feature = tripal_feature_load_gff3_feature($organism, $analysis_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $protein_cvterm, $uname, $name, '', 'f', 'f', 1, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // Add the derives_from relationship. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $cvterm = tripal_get_cvterm(array('cvterm_id' => $result->cvterm_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_feature_load_gff3_derives_from($feature, $cvterm, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $result->uniquename, $organism, $pfmin, $pfmax); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // Add the featureloc record. Set the start of the protein to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // be the start of the coding sequence minus the phase. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tripal_feature_load_gff3_featureloc($feature, $organism, $result->landmark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              $pfmin, $pfmax, $result->strand, '', 'f', 'f', '', 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      print "\nSetting ranks of children...\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // Get features in a relationship that are also children of an alignment. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sql = " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        SELECT DISTINCT F.feature_id, F.organism_id, F.type_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          F.uniquename, FL.strand 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        FROM {tripal_gff_temp} TGT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          INNER JOIN {feature} F                ON TGT.feature_id = F.feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          INNER JOIN {feature_relationship} FR  ON FR.object_id   = TGT.feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          INNER JOIN {cvterm} CVT               ON CVT.cvterm_id  = FR.type_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          INNER JOIN {featureloc} FL            ON FL.feature_id  = F.feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        WHERE CVT.name = 'part_of' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $parents = chado_query($sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // Build and prepare the SQL for selecting the children relationship. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sel_gffchildren_sql = " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        SELECT DISTINCT FR.feature_relationship_id, FL.fmin, FR.rank 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        FROM {feature_relationship} FR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          INNER JOIN {featureloc} FL on FL.feature_id = FR.subject_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          INNER JOIN {cvterm} CVT on CVT.cvterm_id = FR.type_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        WHERE FR.object_id = :feature_id AND CVT.name = 'part_of' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ORDER BY FL.fmin ASC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // Now set the rank of any parent/child relationships.  The order is based 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // on the fmin.  The start rank is 1.  This allows features with other 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // relationships to be '0' (the default), and doesn't interfer with the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // ordering defined here. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $num_recs = $parents->rowCount(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $i = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $interval = intval($num_recs * 0.0001); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($interval == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $interval = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $percent = sprintf("%.2f", ($i / $num_recs) * 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      print "Setting $i of $num_recs (" . $percent . "%). Memory: " . number_format(memory_get_usage()) . " bytes.\r"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      while ($parent = $parents->fetchObject()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($i % $interval == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $percent = sprintf("%.2f", ($i / $num_recs) * 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          print "Setting $i of $num_recs (" . $percent . "%). Memory: " . number_format(memory_get_usage()) . " bytes.\r"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // get the children 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $result = chado_query($sel_gffchildren_sql, array(':feature_id' => $parent->feature_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // build an array of the children 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $children = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        while ($child = $result->fetchObject()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           $children[] = $child; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // the children list comes sorted in ascending fmin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // but if the parent is on the reverse strand we need to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // reverse the order of the children. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($parent->strand == -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          arsort($children); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // first set the ranks to a negative number so that we don't 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // get a duplicate error message when we try to change any of them 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rank = -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        foreach ($children as $child) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $match = array('feature_relationship_id' => $child->feature_relationship_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $values = array('rank' => $rank); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          chado_update_record('feature_relationship', $match, $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $rank--; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // now set the rank correctly. The rank should start at 0. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $rank = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        foreach ($children as $child) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $match = array('feature_relationship_id' => $child->feature_relationship_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $values = array('rank' => $rank); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          //print "Was: " . $child->rank . " now $rank ($parent->strand)\n"     ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          chado_update_record('feature_relationship', $match, $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $rank++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $i++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  catch (Exception $e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    print "\n"; // make sure we start errors on new line 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($use_transaction) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $transaction->rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      print "FAILED: Rolling back database changes...\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      print "FAILED\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    watchdog_exception('tripal_chado', $e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  print "\nDone\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Load the derives from attribute for a gff3 feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $subject 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $organism 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_derives_from($feature, $cvterm, $object, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $organism, $fmin, $fmax) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $type = $cvterm->name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // First look for the object feature in the temp table to get it's type. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'organism_id' => $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'uniquename' => $object, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result = chado_select_record('tripal_gff_temp', array('type_name'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $type_id = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($result) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $otype = tripal_get_cvterm(array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'name' => $result[0]->type_name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'cv_id' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'name' => 'sequence' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    )); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($otype) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $type_id = $otype->cvterm_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // If the object wasn't in the temp table then look for it in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // feature table and get it's type. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!$type_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $result = chado_select_record('feature', array('type_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($result) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      watchdog("tripal_chado", "Cannot find feature type for, '%subject' , in 'derives_from' relationship. Multiple matching features exist with this uniquename.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        array('%subject' => $object), WATCHDOG_WARNING); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else if (count($result) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      watchdog("tripal_chado", "Cannot find feature type for, '%subject' , in 'derives_from' relationship.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        array('%subject' => $object), WATCHDOG_WARNING); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $type_id = $result->type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Get the object feature. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $match = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'organism_id' => $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'uniquename' => $object, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'type_id' => $type_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $ofeature = chado_select_record('feature', array('feature_id'), $match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($ofeature) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tripal_report_error('tripal_chado', TRIPAL_ERROR, "Could not add 'Derives_from' relationship " . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "for %uniquename and %subject.  Subject feature, '%subject', " . 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "cannot be found", array('%uniquename' => $feature->uniquename, '%subject' => $subject)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // If this feature is a protein then add it to the tripal_gffprotein_temp. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($type == 'protein' or $type == 'polypeptide') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'feature_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'parent_id' => $ofeature[0]->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'fmin' => $fmin, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'fmax' => $fmax 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $result = chado_insert_record('tripal_gffprotein_temp', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error('tripal_chado', TRIPAL_ERROR, "Cound not save record in temporary protein table, Cannot continue.", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      exit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // Now check to see if the relationship already exists. If it does 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // then just return. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'object_id' => $ofeature[0]->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'subject_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'type_id' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'cv_id' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'name' => 'sequence' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'name' => 'derives_from', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'rank' => 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $rel = chado_select_record('feature_relationship', array('*'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($rel) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // finally insert the relationship if it doesn't exist 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $ret = chado_insert_record('feature_relationship', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!$ret) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tripal_report_error("tripal_chado", TRIPAL_WARNING, "Could not add 'Derives_from' relationship for $feature->uniquename and $subject", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Load the parents for a gff3 feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $cvterm 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $parents 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $organism_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $fmin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_parents($feature, $cvterm, $parents, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $organism_id, $strand, $phase, $fmin, $fmax) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $uname = $feature->uniquename; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $type = $cvterm->name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $rel_type = 'part_of'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Prepare these SQL statements that will be used repeatedly. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $cvterm_sql = " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    SELECT CVT.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    FROM {cvterm} CVT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      INNER JOIN {cv} CV on CVT.cv_id = CV.cv_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      LEFT JOIN {cvtermsynonym} CVTS on CVTS.cvterm_id = CVT.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    WHERE cv.name = :cvname and (CVT.name = :name or CVTS.synonym = :synonym) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Iterate through the parents in the list. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($parents as $parent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // Get the parent cvterm. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'organism_id' => $organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'uniquename' => $parent, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $result = chado_select_record('tripal_gff_temp', array('type_name'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($result) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot find parent: %parent", array('%parent' => $parent)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       return ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $parent_type = $result[0]->type_name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // try to find the parent 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $parentcvterm = chado_query($cvterm_sql, array(':cvname' => 'sequence', ':name' => $parent_type, ':synonym' => $parent_type))->fetchObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $relcvterm = chado_query($cvterm_sql, array(':cvname' => 'sequence', ':name' => $rel_type, ':synonym' => $rel_type))->fetchObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$relcvterm) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_feature", TRIPAL_WARNING, "Cannot find the term, 'part_of', from the sequence ontology. This term is used for associating parent and children features. Please check that the ontology is fully imported."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      exit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'organism_id' => $organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'uniquename' => $parent, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'type_id' => $parentcvterm->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $result = chado_select_record('feature', array('feature_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $parent_feature = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if the parent exists then add the relationship otherwise print error and skip 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($parent_feature) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // check to see if the relationship already exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'object_id' => $parent_feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'subject_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'type_id' => $relcvterm->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $rel = chado_select_record('feature_relationship', array('*'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (count($rel) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // the relationship doesn't already exist, so add it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'subject_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'object_id'  => $parent_feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'type_id' => $relcvterm->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $result = chado_insert_record('feature_relationship', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!$result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_report_error("tripal_chado", TRIPAL_WARNING, "Failed to insert feature relationship '$uname' ($type) $rel_type '$parent' ($parent_type)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // If this feature is a CDS and now that we know the parent we can 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // add it to the tripal_gffcds_temp table for later lookup. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($type == 'CDS') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'feature_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'parent_id' => $parent_feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'fmin' => $fmin, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'fmax' => $fmax, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'strand' => $strand, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($phase) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $values['phase'] = $phase; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $result = chado_insert_record('tripal_gffcds_temp', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!$result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_report_error('tripal_chado', TRIPAL_ERROR, "Cound not save record in temporary CDS table, Cannot continue.", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          exit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot establish relationship '$uname' ($type) $rel_type '$parent' ($parent_type): Cannot find the parent", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Load the dbxref attribute for a feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $dbxrefs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_dbxref($feature, $dbxrefs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // iterate through each of the dbxrefs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($dbxrefs as $dbxref) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // get the database name from the reference.  If it doesn't exist then create one. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $ref = explode(":", $dbxref); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $dbname = trim($ref[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $accession = trim($ref[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // first look for the database name if it doesn't exist then create one. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // first check for the fully qualified URI (e.g. DB:<dbname>. If that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // can't be found then look for the name as is.  If it still can't be found 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // the create the database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array('name' => "DB:$dbname"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $db = chado_select_record('db', array('db_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($db) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array('name' => "$dbname"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $db = chado_select_record('db', array('db_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($db) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'name' => $dbname, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'description' => 'Added automatically by the GFF loader' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $success = chado_insert_record('db', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $values = array('name' => "$dbname"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $db = chado_select_record('db', array('db_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot find or add the database $dbname", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $db = $db[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // now check to see if the accession exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'accession' => $accession, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'db_id' => $db->db_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $dbxref = chado_select_record('dbxref', array('dbxref_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if the accession doesn't exist then we want to add it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (sizeof($dbxref) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'db_id' => $db->db_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'accession' => $accession, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'version' => '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $ret = chado_insert_record('dbxref', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'accession' => $accession, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'db_id' => $db->db_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $dbxref = chado_select_record('dbxref', array('dbxref_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $dbxref = $dbxref[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // check to see if this feature dbxref already exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'dbxref_id' => $dbxref->dbxref_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'feature_id' => $feature->feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $fdbx = chado_select_record('feature_dbxref', array('feature_dbxref_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // now associate this feature with the database reference if it doesn't 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // already exist 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (sizeof($fdbx) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'dbxref_id' => $dbxref->dbxref_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'feature_id' => $feature->feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $success = chado_insert_record('feature_dbxref', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "Failed to insert Dbxref: $dbname:$accession", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Load the cvterms for a feature. Assumes there is a dbxref.accession matching a cvterm.name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $dbxrefs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_ontology($feature, $dbxrefs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   // iterate through each of the dbxrefs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($dbxrefs as $dbxref) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // get the database name from the reference.  If it doesn't exist then create one. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $ref = explode(":", $dbxref); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $dbname = trim($ref[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $accession = trim($ref[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // first look for the database name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $db = chado_select_record('db', array('db_id'), array('name' => "DB:$dbname")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (sizeof($db) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // now look for the name without the 'DB:' prefix. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $db = chado_select_record('db', array('db_id'), array('name' => "$dbname")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (sizeof($db) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "Database, $dbname, is not present. Cannot associate term: $dbname:$accession", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $db = $db[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // now check to see if the accession exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $dbxref = chado_select_record('dbxref', array('dbxref_id'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      array('accession' => $accession, 'db_id' => $db->db_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (sizeof($dbxref) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Accession, $accession is missing for reference: $dbname:$accession", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $dbxref = $dbxref[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // now check to see if the cvterm exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $cvterm = chado_select_record('cvterm', array('cvterm_id'), array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'dbxref_id' => $dbxref->dbxref_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if it doesn't exist in the cvterm table, look for an alternate id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (sizeof($cvterm) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $cvterm = chado_select_record('cvterm_dbxref', array('cvterm_id'), array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'dbxref_id' => $dbxref->dbxref_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (sizeof($cvterm) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "CV Term is missing for reference: $dbname:$accession", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $cvterm = $cvterm[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // check to see if this feature cvterm already exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $fcvt = chado_select_record('feature_cvterm', array('feature_cvterm_id'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      array('cvterm_id' => $cvterm->cvterm_id, 'feature_id' => $feature->feature_id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // now associate this feature with the cvterm if it doesn't already exist 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (sizeof($fcvt)==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'cvterm_id' => $cvterm->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'feature_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'pub_id' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'uniquename' => 'null', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $success = chado_insert_record('feature_cvterm', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "Failed to insert ontology term: $dbname:$accession", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Load any aliases for a feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $aliases 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_alias($feature, $aliases) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // make sure we have a 'synonym_type' vocabulary 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $select = array('name' => 'synonym_type'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $results = chado_select_record('cv', array('*'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($results) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // insert the 'synonym_type' vocabulary 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'name' => 'synonym_type', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'definition' => 'vocabulary for synonym types', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $success = chado_insert_record('cv', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Failed to add the synonyms type vocabulary", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // now that we've added the cv we need to get the record 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $results = chado_select_record('cv', array('*'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($results) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $syncv = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $syncv = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // get the 'exact' cvterm, which is the type of synonym we're adding 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $select = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     'name' => 'exact', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     'cv_id' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'name' => 'synonym_type' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result = chado_select_record('cvterm', array('*'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($result) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $term = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'name' => 'exact', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'id' => "synonym_type:exact", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'definition' => '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'is_obsolete' => 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'cv_name' => $syncv->name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'is_relationship' => FALSE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $syntype = tripal_insert_cvterm($term, array('update_existing' => TRUE)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$syntype) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot add synonym type: internal:$type", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $syntype = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // iterate through all of the aliases and add each one 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($aliases as $alias) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // check to see if the alias already exists in the synonym table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if not, then add it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $select = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'name' => $alias, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'type_id' => $syntype->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $result = chado_select_record('synonym', array('*'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($result) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         'name' => $alias, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         'type_id' => $syntype->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         'synonym_sgml' => '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $success = chado_insert_record('synonym', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot add alias $alias to synonym table", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $result = chado_select_record('synonym', array('*'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $synonym = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $synonym = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // check to see if we have a NULL publication in the pub table.  If not, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // then add one. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $select = array('uniquename' => 'null'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $result = chado_select_record('pub', array('*'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($result) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $pub_sql = " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        INSERT INTO {pub} (uniquename,type_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        VALUES (:uname, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          (SELECT cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           FROM {cvterm} CVT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             INNER JOIN {dbxref} DBX ON DBX.dbxref_id = CVT.dbxref_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             INNER JOIN {db} DB      ON DB.db_id      = DBX.db_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           WHERE CVT.name = :type_id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $status = chado_query($psql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$status) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot prepare statement 'ins_pub_uniquename_typeid", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // insert the null pub 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $result = chado_query($pub_sql, array(':uname' => 'null', ':type_id' => 'null'))->fetchObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot add null publication needed for setup of alias", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $result = chado_select_record('pub', array('*'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $pub = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $pub = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // check to see if the synonym exists in the feature_synonym table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if not, then add it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'synonym_id' => $synonym->synonym_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'feature_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'pub_id' => $pub->pub_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $columns = array('feature_synonym_id'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $result = chado_select_record('feature_synonym', $columns, $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($result) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         'synonym_id' => $synonym->synonym_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         'feature_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         'pub_id' => $pub->pub_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $success = chado_insert_record('feature_synonym', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot add alias $alias to feature synonym table", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Create the feature record & link it to it's analysis 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $organism 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $analysis_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $cvterm 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $uniquename 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $residues 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $is_analysis 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $is_obsolete 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $add_only 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $score 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_feature($organism, $analysis_id, $cvterm, $uniquename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $name, $residues, $is_analysis = 'f', $is_obsolete = 'f', $add_only, $score) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Check to see if the feature already exists. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $feature = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $fselect = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'organism_id' => $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'uniquename' => $uniquename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'type_id' => $cvterm->cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $columns = array('feature_id', 'name', 'uniquename', 'seqlen', 'organism_id', 'type_id'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result = chado_select_record('feature', $columns, $fselect); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($result) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $feature = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (strcmp($is_obsolete, 'f')==0 or $is_obsolete == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $is_obsolete = 'FALSE'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (strcmp($is_obsolete, 't')==0 or $is_obsolete == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $is_obsolete = 'TRUE'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (strcmp($is_analysis, 'f')==0 or $is_analysis == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $is_analysis = 'FALSE'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (strcmp($is_analysis, 't')==0 or $is_analysis == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $is_analysis = 'TRUE'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Insert the feature if it does not exist otherwise perform an update. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!$feature) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'organism_id' => $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'name' => $name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'uniquename' => $uniquename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'md5checksum' => md5($residues), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'type_id' => $cvterm->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'is_analysis' => $is_analysis, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'is_obsolete' => $is_obsolete, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $feature = (object) chado_insert_record('feature', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$feature) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Failed to insert feature '$uniquename' ($cvterm->name)", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  elseif (!$add_only) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'name' => $name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'md5checksum' => md5($residues), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'is_analysis' => $is_analysis, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'is_obsolete' => $is_obsolete, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $match = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'organism_id' => $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'uniquename' => $uniquename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'type_id' => $cvterm->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $result = chado_update_record('feature', $match, $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Failed to update feature '$uniquename' ($cvterm->name)", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // The feature exists and we don't want to update it so return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // a value of 0.  This will stop all downstream property additions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return $feature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Add the analysisfeature entry to the analysisfeature table if 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // it doesn't already exist. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $af_values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'analysis_id' => $analysis_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'feature_id' => $feature->feature_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $afeature = chado_select_record('analysisfeature', array('analysisfeature_id'), $af_values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($afeature)==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if a score is available then set that to be the significance field 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strcmp($score, '.') != 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $af_values['significance'] = $score; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!chado_insert_record('analysisfeature', $af_values)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Could not add analysisfeature record: $analysis_id, $feature->feature_id", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if a score is available then set that to be the significance field 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $new_vals = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strcmp($score, '.')!=0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $new_vals['significance'] = $score; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $new_vals['significance'] = '__NULL__'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$add_only) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $ret = chado_update_record('analysisfeature', $af_values, $new_vals); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (!$ret) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error("tripal_chado", TRIPAL_WARNING, "Could not update analysisfeature record: $analysis_id, $feature->feature_id", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return $feature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Insert the location of the feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $organism 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $landmark 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $fmin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $fmax 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $strand 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $phase 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $is_fmin_partial 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $is_fmax_partial 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $residue_info 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $locgroup 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $landmark_type_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $landmark_organism_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $create_landmark 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $landmark_is_target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_featureloc($feature, $organism, $landmark, $fmin, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $fmax, $strand, $phase, $is_fmin_partial, $is_fmax_partial, $residue_info, $locgroup, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $landmark_type_id = '', $landmark_organism_id = '', $create_landmark = 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $landmark_is_target = 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $select = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'organism_id' => $landmark_organism_id ? $landmark_organism_id : $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'uniquename' => $landmark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($landmark_type_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $select['type_id'] = $landmark_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $results = chado_select_record('feature', array('feature_id'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $srcfeature = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($results)==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // so we couldn't find the landmark using the uniquename. Let's try the 'name'. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if we return only a single result then we can proceed. Otherwise give an 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $select = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'organism_id' => $landmark_organism_id ? $landmark_organism_id : $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'name' => $landmark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($landmark_type_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $select['type_id'] = $landmark_type_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $results = chado_select_record('feature', array('feature_id'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($results) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       // if the landmark is the target feature in a matched alignment then try one more time to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       // find it by querying any feature with the same uniquename. If we find one then use it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       if ($landmark_is_target) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $select = array('uniquename' => $landmark); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $results = chado_select_record('feature', array('feature_id'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         if (count($results) == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           $srcfeature = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       if (!$srcfeature) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         // we couldn't find the landmark feature, so if the user has requested we create it then do so 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         // but only if we have a type id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         if ($create_landmark and $landmark_type_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'organism_id' => $landmark_organism_id ? $landmark_organism_id : $organism->organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'name' => $landmark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'uniquename' => $landmark, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              'type_id' => $landmark_type_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $results = chado_insert_record('feature', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (!$results) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot find landmark feature: '%landmark', nor could it be inserted", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                array('%landmark' => $landmark)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $srcfeature = new stdClass(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $srcfeature->feature_id = $results['feature_id']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot find unique landmark feature: '%landmark'.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             array('%landmark' => $landmark)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    elseif (count($results) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       tripal_report_error("tripal_chado", TRIPAL_WARNING, "multiple landmarks exist with the name: '%landmark'.  Cannot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         resolve which one to use. Cannot add the feature location record", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         array('%landmark' => $landmark)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $srcfeature = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  elseif (count($results) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tripal_report_error("tripal_chado", TRIPAL_WARNING, "multiple landmarks exist with the name: '%landmark'.  Cannot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      resolve which one to use. Cannot add the feature location record", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      array('%landmark' => $landmark)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $srcfeature = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // TODO: create an attribute that recognizes the residue_info,locgroup, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  //  is_fmin_partial and is_fmax_partial, right now these are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  //  hardcoded to be false and 0 below. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // check to see if this featureloc already exists, but also keep track of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // last rank value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $rank = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $exists = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $select = array('feature_id' => $feature->feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $options = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'order_by' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'rank' => 'ASC' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $locrecs = chado_select_record('featureloc', array('*'), $select, $options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($locrecs as $featureloc) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // it is possible for the featureloc->srcfeature_id to be NULL. This can happen if the srcfeature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // is not known (according to chado table field descriptions).  If it's null then just skip this entry 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$featureloc->srcfeature_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $select = array('feature_id' => $featureloc->srcfeature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $columns = array('feature_id', 'name'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $locsfeature = chado_select_record('feature', $columns, $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // the source feature name and at least the fmin and fmax must be the same 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // for an update of the featureloc, otherwise we'll insert a new record. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strcmp($locsfeature[0]->name, $landmark)==0 and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       ($featureloc->fmin == $fmin or $featureloc->fmax == $fmax)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $match = array('featureloc_id' => $featureloc->featureloc_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $exists = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($featureloc->fmin != $fmin) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $values['fmin'] = $fmin; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($featureloc->fmax != $fmax) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $values['fmax'] = $fmax; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($featureloc->strand != $strand) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         $values['strand'] = $strand; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (count($values) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        chado_update_record('featureloc', $match, $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $rank = $featureloc->rank + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!$exists) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // this feature location is new so add it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strcmp($is_fmin_partial, 'f')==0 or !$is_fmin_partial) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $is_fmin_partial = 'FALSE'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    elseif (strcmp($is_fmin_partial, 't')==0 or $is_fmin_partial = 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $is_fmin_partial = 'TRUE'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strcmp($is_fmax_partial, 'f')==0 or !$is_fmax_partial) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $is_fmax_partial = 'FALSE'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    elseif (strcmp($is_fmax_partial, 't')==0 or $is_fmax_partial = 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $is_fmax_partial = 'TRUE'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'feature_id'      => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'srcfeature_id'   => $srcfeature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'fmin'            => $fmin, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'is_fmin_partial' => $is_fmin_partial, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'fmax'            => $fmax, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'is_fmax_partial' => $is_fmax_partial, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'strand'          => $strand, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'residue_info'    => $residue_info, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'locgroup'        => $locgroup, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'rank'            => $rank 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($phase) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values['phase'] = $phase; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $success = chado_insert_record('featureloc', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Failed to insert featureloc", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      exit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Load a preoprty (featurepop) for the feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_property($feature, $property, $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // first make sure the cvterm exists.  if not, then add it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $select = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     'name' => $property, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     'cv_id' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'name' => 'feature_property', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result = chado_select_record('cvterm', array('*'), $select); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // if we don't have a property like this already, then add it otherwise, just return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($result) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $term = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'id' => "null:$property", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'name' => $property, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'namespace' => 'feature_property', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'is_obsolete' => 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'cv_name' => 'feature_property', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'is_relationship' => FALSE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $cvterm = (object) tripal_insert_cvterm($term, array('update_existing' => FALSE)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$cvterm) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "Cannot add cvterm, $property", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $cvterm = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // check to see if the property already exists for this feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // if it does but the value is unique then increment the rank and add it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // if the value is not unique then don't add it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $add = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $rank = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $select = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     'feature_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     'type_id' => $cvterm->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $options = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'order_by' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'rank' => 'ASC', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $results = chado_select_record('featureprop', array('*'), $select, $options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($results as $prop) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strcmp($prop->value, $value)==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $add = NULL; // don't add it, it already exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $rank = $prop->rank + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // add the property if we pass the check above 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($add) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'feature_id' => $feature->feature_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'type_id' => $cvterm->cvterm_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'value' => $value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       'rank' => $rank, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $result = chado_insert_record('featureprop', $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!$result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_report_error("tripal_chado", TRIPAL_WARNING, "cannot add featureprop, $property", array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Load the FASTA sequences at the bottom of a GFF3 file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $fh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $interval 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $num_read 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $intv_read 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $line_num 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $filesize 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $job 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_fasta($fh, $interval, &$num_read, &$intv_read, &$line_num, $filesize, $job) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  print "\nLoading FASTA sequences\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $residues = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $id = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $percent = sprintf("%.2f", ($num_read / $filesize) * 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  print "Parsing Line $line_num (" . $percent . "%). Memory: " . number_format(memory_get_usage()) . " bytes.\r"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // iterate through the remaining lines of the file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  while ($line = fgets($fh)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $line_num++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $size = drupal_strlen($line); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $num_read += $size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $intv_read += $size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $line = trim($line); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // update the job status every 1% features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($job and $intv_read >= $interval) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $intv_read = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $percent = sprintf("%.2f", ($num_read / $filesize) * 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      print "Parsing Line $line_num (" . $percent . "%). Memory: " . number_format(memory_get_usage()) . " bytes.\r"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      tripal_set_job_progress($job, intval(($num_read / $filesize) * 100)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if we encounter a definition line then get the name, uniquename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // accession and relationship subject from the definition line 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (preg_match('/^>/', $line)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // if we are beginning a new sequence then save to the database the last one we just finished. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $values = array('uniquename' => $id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $result = chado_select_record('tripal_gff_temp', array('*'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (count($result) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_report_error('tripal_chado', TRIPAL_WARNING, 'Cannot find feature to assign FASTA sequence: %uname', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             array('%uname' => $id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // if we have a feature then add the residues 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $feature = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'residues' => $residues, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'seqlen' => strlen($residues) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $match = array('feature_id' => $feature->feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          chado_update_record('feature', $match, $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // get the feature ID for this ID from the tripal_gff_temp table. It 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // should be the name up to the first space 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $id = preg_replace('/^>([^\s]+).*$/', '\1', $line); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $residues = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $residues .= trim($line); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // add in the last sequence 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $values = array('uniquename' => $id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result = chado_select_record('tripal_gff_temp', array('*'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (count($result) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tripal_report_error('tripal_chado', TRIPAL_WARNING, 'Cannot find feature to assign FASTA sequence: %uname', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       array('%uname' => $id)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if we have a feature then add the residues 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $feature = $result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'residues' => $residues, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      'seqlen' => strlen($residues) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $match = array('feature_id' => $feature->feature_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    chado_update_record('feature', $match, $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Load the target attribute of a gff3 record 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $feature 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $tags 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $target_organism_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $target_type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $create_target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $attr_locgroup 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @ingroup gff3_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_feature_load_gff3_target($feature, $tags, $target_organism_id, $target_type, $create_target, $attr_locgroup) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // format is: "target_id start end [strand]", where strand is optional and may be "+" or "-" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $matched = preg_match('/^(.*?)\s+(\d+)\s+(\d+)(\s+[\+|\-])*$/', trim($tags['Target'][0]), $matches); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // the organism and type of the target may also be specified as an attribute. If so, then get that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // information 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $gff_target_organism = array_key_exists('target_organism', $tags) ? $tags['target_organism'][0] : ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $gff_target_type = array_key_exists('target_type', $tags) ? $tags['target_type'][0] : ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // if we have matches and the Target is in the correct format then load the alignment 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($matched) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $target_feature = $matches[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $start = $matches[2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $end = $matches[3]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // if we have an optional strand, convert it to a numeric value. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($matches[4]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (preg_match('/^\+$/', trim($matches[4]))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $target_strand = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      elseif (preg_match('/^\-$/', trim($matches[4]))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $target_strand = -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $target_strand = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       $target_strand = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $target_fmin = $start - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $target_fmax = $end; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($end < $start) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $target_fmin = $end - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $target_fmax = $start; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // default the target organism to be the value passed into the function, but if the GFF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // file species the target organism then use that instead. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $t_organism_id = $target_organism_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($gff_target_organism) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // get the genus and species 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $success = preg_match('/^(.*?):(.*?)$/', $gff_target_organism, $matches); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if ($success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'genus' => $matches[1], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          'species' => $matches[2], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $torganism = chado_select_record('organism', array('organism_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (count($torganism) == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $t_organism_id = $torganism[0]->organism_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_report_error('tripal_chado', TRIPAL_WARNING, "Cannot find organism for target %target.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            array('%target' => $gff_target_organism)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $t_organism_id = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error('tripal_chado', TRIPAL_WARNING, "The target_organism attribute is improperly formatted: %target. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          It should be target_organism=genus:species.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          array('%target' => $gff_target_organism)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $t_organism_id = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // default the target type to be the value passed into the function, but if the GFF file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // species the target type then use that instead 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    $t_type_id = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($target_type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'name' => $target_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'cv_id' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           'name' => 'sequence', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $type = chado_select_record('cvterm', array('cvterm_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (count($type) == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $t_type_id = $type[0]->cvterm_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tripal_report_error('tripal_chado', TRIPAL_ERROR, "The target type does not exist in the sequence ontology: %type. ", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          array('%type' => $target_type)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        exit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($gff_target_type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $values = array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'name' => $gff_target_type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        'cv_id' => array( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           'name' => 'sequence', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // get the cvterm_id for the target type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $type = chado_select_record('cvterm', array('cvterm_id'), $values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (count($type) == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $t_type_id = $type[0]->cvterm_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // check to see if this is a synonym 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $sql = " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          SELECT CVTS.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          FROM {cvtermsynonym} CVTS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            INNER JOIN {cvterm} CVT ON CVT.cvterm_id = CVTS.cvterm_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            INNER JOIN {cv} CV      ON CV.cv_id = CVT.cv_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          WHERE CV.name = 'sequence' and CVTS.synonym = :synonym 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $synonym = chado_query($sql, array(':synonym' => $gff_target_type))->fetchObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($synonym) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $t_type_id = $synonym->cvterm_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          tripal_report_error('tripal_chado', TRIPAL_WARNING, "The target_type attribute does not exist in the sequence ontology: %type. ", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            array('%type' => $gff_target_type)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $t_type_id = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // we want to add a featureloc record that uses the target feature as the srcfeature (landmark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // and the landmark as the feature. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tripal_feature_load_gff3_featureloc($feature, $organism, $target_feature, $target_fmin, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $target_fmax, $target_strand, $phase, $attr_fmin_partial, $attr_fmax_partial, $attr_residue_info, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $attr_locgroup, $t_type_id, $t_organism_id, $create_target, TRUE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // the target attribute is not correctly formatted 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tripal_report_error('tripal_chado', TRIPAL_ERROR, "Could not add 'Target' alignment as it is improperly formatted:  '%target'", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      array('%target' => $tags['Target'][0])); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 |