// $Id: RIOn.java,v 1.7 2010/09/05 17:56:50 cmzmasek Exp $
// FORESTER -- software libraries and applications
// for evolutionary biology research and applications.
//
// Copyright (C) 2008-2009 Christian M. Zmasek
// Copyright (C) 2008-2009 Burnham Institute for Medical Research
// All rights reserved
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
//
// Contact: cmzmasek@yahoo.com
// WWW: www.phylosoft.org/forester
package org.forester.sdi;
import java.util.ArrayList;
import java.util.List;
import org.forester.phylogeny.Phylogeny;
import org.forester.phylogeny.PhylogenyMethods;
import org.forester.phylogeny.PhylogenyNode;
import org.forester.phylogeny.data.Event;
import org.forester.phylogeny.iterators.PhylogenyNodeIterator;
import org.forester.util.GeneralTable;
public class RIOn {
private final static boolean ROOT_BY_MINIMIZING_MAPPING_COST = false;
private final static boolean ROOT_BY_MINIMIZING_SUM_OF_DUPS = true;
private final static boolean ROOT_BY_MINIMIZING_TREE_HEIGHT = true;
GeneralTable<String, Integer> _orthologs = null;
GeneralTable<String, Integer> _paralogs = null;
GeneralTable<String, Integer> _super_orthologs = null;
GeneralTable<String, Integer> _ultra_paralogs = null;
private void doInferOrthologs( final Phylogeny gene_tree, final Phylogeny species_tree ) {
final SDIR sdiunrooted = new SDIR();
final Phylogeny assigned_tree = sdiunrooted.infer( gene_tree,
species_tree,
ROOT_BY_MINIMIZING_MAPPING_COST,
ROOT_BY_MINIMIZING_SUM_OF_DUPS,
ROOT_BY_MINIMIZING_TREE_HEIGHT,
true,
1 )[ 0 ];
final List<PhylogenyNode> external_nodes = new ArrayList<PhylogenyNode>();
for( final PhylogenyNodeIterator iterator = assigned_tree.iteratorExternalForward(); iterator.hasNext(); ) {
external_nodes.add( iterator.next() );
}
final PhylogenyMethods methods = PhylogenyMethods.getInstance();
for( int i = 0; i < external_nodes.size(); ++i ) {
for( int j = 0; j < external_nodes.size(); ++j ) {
if ( i != j ) {
final PhylogenyNode node_i = external_nodes.get( i );
final PhylogenyNode node_j = external_nodes.get( j );
final PhylogenyNode lca = methods.obtainLCA( node_i, node_j );
final Event event = lca.getNodeData().getEvent();
final String node_i_name = node_i.getNodeData().getSequence().getName();
final String node_j_name = node_j.getNodeData().getSequence().getName();
if ( event.isDuplication() ) {
increaseCounter( getOrthologs(), node_i_name, node_j_name );
}
else {
increaseCounter( getParalogs(), node_i_name, node_j_name );
}
}
}
}
}
public GeneralTable<String, Integer> getOrthologs() {
return _orthologs;
}
public GeneralTable<String, Integer> getParalogs() {
return _paralogs;
}
public GeneralTable<String, Integer> getSuperOrthologs() {
return _super_orthologs;
}
public GeneralTable<String, Integer> getUltraParalogs() {
return _ultra_paralogs;
}
private void increaseCounter( final GeneralTable<String, Integer> table,
final String node_i_name,
final String node_j_name ) {
final Integer value = table.getValue( node_i_name, node_j_name );
if ( value == null ) {
table.setValue( node_i_name, node_j_name, 1 );
}
else {
table.setValue( node_i_name, node_j_name, value.intValue() + 1 );
}
}
private void init() {
_orthologs = new GeneralTable<String, Integer>();
_paralogs = new GeneralTable<String, Integer>();
_super_orthologs = new GeneralTable<String, Integer>();
_ultra_paralogs = new GeneralTable<String, Integer>();
}
private void setOrthologs( final GeneralTable<String, Integer> orthologs ) {
_orthologs = orthologs;
}
private void setParalogs( final GeneralTable<String, Integer> paralogs ) {
_paralogs = paralogs;
}
private void setSuperOrthologs( final GeneralTable<String, Integer> super_orthologs ) {
_super_orthologs = super_orthologs;
}
private void setUltraParalogs( final GeneralTable<String, Integer> ultra_paralogs ) {
_ultra_paralogs = ultra_paralogs;
}
}