|
@@ -1,19 +1,46 @@
|
|
|
<?php
|
|
|
|
|
|
-class GFF3Loader extends TripalLoader {
|
|
|
+class GFF3Importer extends TripalImporter {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The name of this loader. This name will be presented to the site
|
|
|
+ * user.
|
|
|
+ */
|
|
|
+ public static $name = 'Chado GFF3 File Loader';
|
|
|
|
|
|
/**
|
|
|
- * @see TripalLoader::form()
|
|
|
+ * The machine name for this loader. This name will be used to construct
|
|
|
+ * the URL for the loader.
|
|
|
+ */
|
|
|
+ public static $machine_name = 'gff3_loader';
|
|
|
+
|
|
|
+ /**
|
|
|
+ * A brief description for this loader. This description will be
|
|
|
+ * presented to the site user.
|
|
|
+ */
|
|
|
+ public static $description = 'Import a GFF3 file into Chado';
|
|
|
+
|
|
|
+ /**
|
|
|
+ * An array containing the extensions of allowed file types.
|
|
|
+ */
|
|
|
+ public static $file_types = array('gff3');
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Provides information to the user about the file upload. Typically this
|
|
|
+ * may include a description of the file types allowed.
|
|
|
+ */
|
|
|
+ public static $upload_description = 'Please provide the GFF3 file. The file must have a .gff3 extension.';
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The title that should appear above the upload button.
|
|
|
+ */
|
|
|
+ public static $upload_title = 'GFF3 File';
|
|
|
+ /**
|
|
|
+ * @see TripalImporter::form()
|
|
|
*/
|
|
|
public function form($form, &$form_state) {
|
|
|
- $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);
|
|
@@ -232,70 +259,23 @@ class GFF3Loader extends TripalLoader {
|
|
|
GFF file take precedence over those specified above."),
|
|
|
);
|
|
|
|
|
|
- $form['button'] = array(
|
|
|
- '#type' => 'submit',
|
|
|
- '#value' => t('Import GFF3 file'),
|
|
|
- '#weight' => 10,
|
|
|
- );
|
|
|
-
|
|
|
+ return $form;
|
|
|
}
|
|
|
/**
|
|
|
- * @see TripalLoader::formSubmit()
|
|
|
+ * @see TripalImporter::formSubmit()
|
|
|
*/
|
|
|
public function formSubmit($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 '';
|
|
|
}
|
|
|
/**
|
|
|
- * @see TripalLoader::formValidate()
|
|
|
+ * @see TripalImporter::formValidate()
|
|
|
*/
|
|
|
public function formValidate($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']);
|
|
@@ -312,20 +292,6 @@ class GFF3Loader extends TripalLoader {
|
|
|
$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
|
|
@@ -355,36 +321,34 @@ class GFF3Loader extends TripalLoader {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * @see TripalLoader::run()
|
|
|
+ * @see TripalImporter::run()
|
|
|
*/
|
|
|
- public function run() {
|
|
|
-
|
|
|
- // Perform parent validation
|
|
|
- parent::run();
|
|
|
-
|
|
|
- $gff_file = $this->job->arguments[0];
|
|
|
- $organism_id = $this->job->arguments[1];
|
|
|
- $analysis_id = $this->job->arguments[2];
|
|
|
- $add_only = $this->job->arguments[3];
|
|
|
- $update = $this->job->arguments[4];
|
|
|
- $refresh = $this->job->arguments[5];
|
|
|
- $remove = $this->job->arguments[6];
|
|
|
- $use_transaction = $this->job->arguments[7];
|
|
|
- $target_organism_id = $this->job->arguments[8];
|
|
|
- $target_type = $this->job->arguments[9];
|
|
|
- $create_target = $this->job->arguments[10];
|
|
|
- $start_line = $this->job->arguments[11];
|
|
|
- $landmark_type = $this->job->arguments[12];
|
|
|
- $alt_id_attr = $this->job->arguments[13];
|
|
|
- $create_organism = $this->job->arguments[14];
|
|
|
- $re_mrna = $this->job->arguments[15];
|
|
|
- $re_protein = $this->job->arguments[16];
|
|
|
-
|
|
|
- $this->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)
|
|
|
+ public function run($details, $job_id = NULL) {
|
|
|
+ $arguments = $details->arguments;
|
|
|
+
|
|
|
+ $gff_file = $arguments['file_path'];
|
|
|
+ $organism_id = $arguments['organism_id'];
|
|
|
+ $analysis_id = $arguments['analysis_id'];
|
|
|
+ $add_only = $arguments['add_only'];
|
|
|
+ $update = $arguments['update'];
|
|
|
+ $refresh = FALSE;
|
|
|
+ $remove = FALSE;
|
|
|
+ $use_transaction = $arguments['use_transaction'];
|
|
|
+ $target_organism_id = $arguments['target_organism_id'];
|
|
|
+ $target_type = $arguments['target_type'];
|
|
|
+ $create_target = $arguments['create_target'];
|
|
|
+ $start_line = $arguments['line_number'];
|
|
|
+ $landmark_type = $arguments['landmark_type'];
|
|
|
+ $alt_id_attr = $arguments['alt_id_attr'];
|
|
|
+ $create_organism = $arguments['create_organism'];
|
|
|
+ $re_mrna = $arguments['re_mrna'];
|
|
|
+ $re_protein = $arguments['re_protein'];
|
|
|
+
|
|
|
+ $this->load($gff_file, $organism_id, $analysis_id,
|
|
|
+ $add_only, $update, $refresh, $remove, $use_transaction,
|
|
|
+ $target_organism_id, $target_type, $create_target,
|
|
|
+ $start_line, $landmark_type, $alt_id_attr, $create_organism,
|
|
|
+ $re_mrna, $re_protein, $job_id);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -463,7 +427,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3($gff_file, $organism_id, $analysis_id,
|
|
|
+ private function load($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,
|
|
@@ -600,7 +564,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
// 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);
|
|
|
+ $this->loadFasta($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
|
|
@@ -609,7 +573,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
$rstart = $region_matches[2];
|
|
|
$rend = $region_matches[3];
|
|
|
if ($landmark_type) {
|
|
|
- tripal_feature_load_gff3_feature($organism, $analysis_id, $landmark_cvterm, $rid,
|
|
|
+ $this->loadFeature($organism, $analysis_id, $landmark_cvterm, $rid,
|
|
|
$rid, '', 'f', 'f', 1, 0);
|
|
|
}
|
|
|
continue;
|
|
@@ -896,7 +860,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
if ($update or $refresh or $add_only) {
|
|
|
|
|
|
// Add/update the feature.
|
|
|
- $feature = tripal_feature_load_gff3_feature($feature_organism, $analysis_id, $cvterm,
|
|
|
+ $feature = $this->loadFeature($feature_organism, $analysis_id, $cvterm,
|
|
|
$attr_uniquename, $attr_name, $residues, $attr_is_analysis,
|
|
|
$attr_is_obsolete, $add_only, $score);
|
|
|
|
|
@@ -923,58 +887,58 @@ class GFF3Loader extends TripalLoader {
|
|
|
// 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,
|
|
|
+ $this->loadFeatureLoc($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']);
|
|
|
+ $this->loadAlias($feature, $tags['Alias']);
|
|
|
}
|
|
|
// add any dbxrefs for this feature
|
|
|
if (array_key_exists('Dbxref', $tags)) {
|
|
|
- tripal_feature_load_gff3_dbxref($feature, $tags['Dbxref']);
|
|
|
+ $this->loadDbxref($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']);
|
|
|
+ $this->loadOntology($feature, $tags['Ontology_term']);
|
|
|
}
|
|
|
// add parent relationships
|
|
|
if (array_key_exists('Parent', $tags)) {
|
|
|
- tripal_feature_load_gff3_parents($feature, $cvterm, $tags['Parent'],
|
|
|
+ $this->loadParents($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);
|
|
|
+ $this->loadTarget($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);
|
|
|
+ $this->loadProperty($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);
|
|
|
+ $this->loadProperty($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],
|
|
|
+ $this->loadDerivesFrom($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);
|
|
|
+ $this->loadDbxref($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);
|
|
|
+ $this->loadProperty($feature, $tag_name, $value);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1049,15 +1013,15 @@ class GFF3Loader extends TripalLoader {
|
|
|
}
|
|
|
|
|
|
// Add the new protein record.
|
|
|
- $feature = tripal_feature_load_gff3_feature($organism, $analysis_id,
|
|
|
+ $feature = $this->loadFeature($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,
|
|
|
+ $this->loadDerivesFrom($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,
|
|
|
+ $this->loadFeatureLoc($feature, $organism, $result->landmark,
|
|
|
$pfmin, $pfmax, $result->strand, '', 'f', 'f', '', 0);
|
|
|
}
|
|
|
}
|
|
@@ -1172,7 +1136,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_derives_from($feature, $cvterm, $object,
|
|
|
+ private function loadDerivesFrom($feature, $cvterm, $object,
|
|
|
$organism, $fmin, $fmax) {
|
|
|
|
|
|
$type = $cvterm->name;
|
|
@@ -1281,7 +1245,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_parents($feature, $cvterm, $parents,
|
|
|
+ private function loadParents($feature, $cvterm, $parents,
|
|
|
$organism_id, $strand, $phase, $fmin, $fmax) {
|
|
|
|
|
|
$uname = $feature->uniquename;
|
|
@@ -1388,7 +1352,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_dbxref($feature, $dbxrefs) {
|
|
|
+ private function loadDbxref($feature, $dbxrefs) {
|
|
|
|
|
|
// iterate through each of the dbxrefs
|
|
|
foreach ($dbxrefs as $dbxref) {
|
|
@@ -1480,7 +1444,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_ontology($feature, $dbxrefs) {
|
|
|
+ private function loadOntology($feature, $dbxrefs) {
|
|
|
|
|
|
// iterate through each of the dbxrefs
|
|
|
foreach ($dbxrefs as $dbxref) {
|
|
@@ -1558,7 +1522,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_alias($feature, $aliases) {
|
|
|
+ private function loadAlias($feature, $aliases) {
|
|
|
|
|
|
// make sure we have a 'synonym_type' vocabulary
|
|
|
$select = array('name' => 'synonym_type');
|
|
@@ -1715,7 +1679,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_feature($organism, $analysis_id, $cvterm, $uniquename,
|
|
|
+ private function loadFeature($organism, $analysis_id, $cvterm, $uniquename,
|
|
|
$name, $residues, $is_analysis = 'f', $is_obsolete = 'f', $add_only, $score) {
|
|
|
|
|
|
// Check to see if the feature already exists.
|
|
@@ -1842,7 +1806,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_featureloc($feature, $organism, $landmark, $fmin,
|
|
|
+ private function loadFeatureLoc($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) {
|
|
@@ -2023,7 +1987,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_property($feature, $property, $value) {
|
|
|
+ private function loadProperty($feature, $property, $value) {
|
|
|
|
|
|
// first make sure the cvterm exists. if not, then add it
|
|
|
$select = array(
|
|
@@ -2105,7 +2069,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_fasta($fh, $interval, &$num_read, &$intv_read, &$line_num, $filesize, $job) {
|
|
|
+ private function loadFasta($fh, $interval, &$num_read, &$intv_read, &$line_num, $filesize, $job) {
|
|
|
print "\nLoading FASTA sequences\n";
|
|
|
$residues = '';
|
|
|
$id = NULL;
|
|
@@ -2196,7 +2160,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
*
|
|
|
* @ingroup gff3_loader
|
|
|
*/
|
|
|
- private function tripal_feature_load_gff3_target($feature, $tags, $target_organism_id, $target_type, $create_target, $attr_locgroup) {
|
|
|
+ private function loadTarget($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);
|
|
|
|
|
@@ -2318,7 +2282,7 @@ class GFF3Loader extends TripalLoader {
|
|
|
|
|
|
// 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,
|
|
|
+ $this->loadFeatureLoc($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);
|
|
|
}
|