All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.biojava.nbio.structure.align.quaternary.QsAlignResult Maven / Gradle / Ivy

The newest version!
/*
 *                    BioJava development code
 *
 * This code may be freely distributed and modified under the
 * terms of the GNU Lesser General Public Licence.  This should
 * be distributed with the code.  If you do not have a copy,
 * see:
 *
 *      http://www.gnu.org/copyleft/lesser.html
 *
 * Copyright for this code is held jointly by the individual
 * authors.  These should be listed in @author doc comments.
 *
 * For more information on the BioJava project and its aims,
 * or to join the biojava-l mailing list, visit the home page
 * at:
 *
 *      http://www.biojava.org/
 *
 */
package org.biojava.nbio.structure.align.quaternary;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.vecmath.Matrix4d;

import org.biojava.nbio.structure.Atom;
import org.biojava.nbio.structure.align.multiple.MultipleAlignment;
import org.biojava.nbio.structure.align.multiple.util.MultipleAlignmentScorer;
import org.biojava.nbio.structure.cluster.Subunit;
import org.biojava.nbio.structure.cluster.SubunitCluster;

/**
 * Result of a Quaternary Structure Alignment {@link QsAlign}. The QsAlignResult
 * holds the original inputs of the algorithm and the results and scores of the
 * alignment.
 *
 * @author Aleix Lafita
 * @since 5.0.0
 *
 */
public class QsAlignResult {

	private List clusters;

	private final List subunits1;
	private final List subunits2;

	private Map subunitMap;
	private MultipleAlignment alignment;

	private QsRelation relation;

	/**
	 * The Constructor of the result takes the same inputs as the
	 * {@link QsAlign} algorithm.
	 *
	 * @param subunits1
	 * @param subunits2
	 */
	public QsAlignResult(List subunits1, List subunits2) {

		this.subunits1 = subunits1;
		this.subunits2 = subunits2;

		subunitMap = Collections.emptyMap();
		relation = QsRelation.DIFFERENT;

	}

	/**
	 * Original Subunits of the first group.
	 *
	 * @return an unmodifiable view of the original List
	 */
	public List getSubunits1() {
		return Collections.unmodifiableList(subunits1);
	}

	/**
	 * Original Subunits of the second group.
	 *
	 * @return an unmodifiable view of the original List
	 */
	public List getSubunits2() {
		return Collections.unmodifiableList(subunits2);
	}

	/**
	 * Map of Subunit equivalencies from the first to the second group.
	 *
	 * @return an unmodifiable view of the original Map
	 */
	public Map getSubunitMap() {

		if (subunitMap == null)
			return Collections.emptyMap();

		return Collections.unmodifiableMap(subunitMap);
	}

	/**
	 * Map of Subunit equivalencies from the first to the second group.
	 *
	 * @param subunitMap
	 */
	public void setSubunitMap(Map subunitMap) {

		// Check consistency of the map
		if (Collections.max(subunitMap.keySet()) > subunits1.size()
				| Collections.max(subunitMap.values()) > subunits2.size())
			throw new IndexOutOfBoundsException(
					"Subunit Map index higher than Subunit List size.");

		// Update the relation enum
		if (subunitMap.size() == 0) {
			relation = QsRelation.DIFFERENT;
		} else if (subunitMap.keySet().size() == subunits1.size()) {
			if (subunitMap.values().size() == subunits2.size()) {
				relation = QsRelation.EQUIVALENT;
			} else {
				relation = QsRelation.PARTIAL_COMPLETE;
			}
		} else {
			if (subunitMap.values().size() == subunits2.size()) {
				relation = QsRelation.PARTIAL_COMPLETE;
			} else {
				relation = QsRelation.PARTIAL_INCOMPLETE;
			}
		}

		this.subunitMap = subunitMap;
	}

	/**
	 * The length of the alignment is the number of Subunit equivalencies it
	 * contains. This is equivalent to the size of the Subunit Map.
	 *
	 * @return length of the alignment
	 */
	public int length() {
		if (subunitMap == null)
			return 0;

		return subunitMap.size();
	}

	/**
	 * The transformation 4D matrix that needs to be applied to the second group
	 * of Subunits to superimpose them onto the first group of Subunits, given
	 * the equivalent residues in the SubunitCluster and the Subunit
	 * equivalencies.
	 * 

* This is equivalent to * multipleAlignment.getBlockSet(0).getTransformations().get(1). * * @return Matrix4d */ public Matrix4d getTransform() { if (alignment == null) return null; return alignment.getBlockSet(0).getTransformations().get(1); } /** * The RMSD between the equivalent residues of the equivalent Subunits after * superposition of the Subunit groups. This is equivalent to * multipleAlignment.getScore(MultipleAlignmentScorer.RMSD). * * @return rmsd */ public double getRmsd() { if (alignment == null) return -1.0; if (alignment.getScore(MultipleAlignmentScorer.RMSD) == null) return MultipleAlignmentScorer.getRMSD(alignment); return alignment.getScore(MultipleAlignmentScorer.RMSD); } /** * The quaternary structure relation {@link QsRelation} between the two * groups of Subunits. * * @return relation */ public QsRelation getRelation() { return relation; } /** * The quaternary structure relation {@link QsRelation} between the two * groups of Subunits. * * @param relation */ public void setRelation(QsRelation relation) { this.relation = relation; } /** * The alignment that specifies the residue equivalencies of the equivalent * Subunits. * * @return alignment as a MultipleAlignment object */ public MultipleAlignment getAlignment() { return alignment; } /** * The alignment that specifies the residue equivalencies of the equivalent * Subunits. * * @param alignment * a MultipleAlignment object */ public void setAlignment(MultipleAlignment alignment) { this.alignment = alignment; } /** * Return the aligned subunits of the first Subunit group, in the alignment * order. * * @return a List of Subunits in the alignment order */ public List getAlignedSubunits1() { List aligned = new ArrayList<>(subunitMap.size()); for (Integer key : subunitMap.keySet()) aligned.add(subunits1.get(key)); return aligned; } /** * Return the aligned subunits of the second Subunit group, in the alignment * order. * * @return a List of Subunits in the alignment order */ public List getAlignedSubunits2() { List aligned = new ArrayList<>(subunitMap.size()); for (Integer key : subunitMap.keySet()) aligned.add(subunits2.get(subunitMap.get(key))); return aligned; } public void setClusters(List clusters) { this.clusters = clusters; } public Atom[] getAlignedAtomsForSubunits1(int index) { // Obtain the indices of the clustered subunits for (SubunitCluster cluster : clusters) { if (cluster.getSubunits().contains(subunits1.get(index))) { return cluster.getAlignedAtomsSubunit(cluster.getSubunits() .indexOf(subunits1.get(index))); } } return null; } public Atom[] getAlignedAtomsForSubunits2(int index) { // Obtain the indices of the clustered subunits for (SubunitCluster cluster : clusters) { if (cluster.getSubunits().contains(subunits2.get(index))) { return cluster.getAlignedAtomsSubunit(cluster.getSubunits() .indexOf(subunits2.get(index))); } } return null; } @Override public String toString() { return "QsAlignResult [relation=" + relation + ", rmsd=" + getRmsd() + ", length=" + length() + ", Aligned 1: " + getAlignedSubunits1().stream().map(s -> s.getName()) .collect(Collectors.toList()) + ", Aligned 2: " + getAlignedSubunits2().stream().map(s -> s.getName()) .collect(Collectors.toList()) + "]"; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy