/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.ext.rbvi.chimera;
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureRenderer;
import jalview.api.SequenceRenderer;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.HiddenColumns;
import jalview.datamodel.MappedFeatures;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
import jalview.gui.Desktop;
import jalview.renderer.seqfeatures.FeatureColourFinder;
import jalview.structure.StructureMapping;
import jalview.structure.StructureMappingcommandSet;
import jalview.structure.StructureSelectionManager;
import jalview.util.ColorUtils;
import jalview.util.Comparison;
import java.awt.Color;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* Routines for generating ChimeraX commands for Jalview/ChimeraX binding
*/
public class ChimeraXCommands extends ChimeraCommands
{
public static final String NAMESPACE_PREFIX = "jv_";
private static final String CMD_COLOUR_BY_CHARGE = "color white;color :ASP,GLU red;color :LYS,ARG blue;color :CYS yellow";
/**
* Traverses a map of { modelNumber, {chain, {list of from-to ranges} } } and
* builds a Chimera format atom spec
*
* @param modelAndChainRanges
*/
protected static String getAtomSpec(
Map>> modelAndChainRanges)
{
StringBuilder sb = new StringBuilder(128);
boolean firstModelForColour = true;
for (Integer model : modelAndChainRanges.keySet())
{
boolean firstPositionForModel = true;
if (!firstModelForColour)
{
sb.append("|");
}
firstModelForColour = false;
sb.append("#").append(model).append(":");
final Map> modelData = modelAndChainRanges
.get(model);
for (String chain : modelData.keySet())
{
boolean hasChain = !"".equals(chain.trim());
for (int[] range : modelData.get(chain))
{
if (!firstPositionForModel)
{
sb.append(",");
}
if (range[0] == range[1])
{
sb.append(range[0]);
}
else
{
sb.append(range[0]).append("-").append(range[1]);
}
if (hasChain)
{
sb.append(".").append(chain);
}
firstPositionForModel = false;
}
}
}
return sb.toString();
}
/**
*
* Build a data structure which records contiguous subsequences for each colour.
* From this we can easily generate the Chimera command for colour by sequence.
* Color
* Model number
* Chain
* list of start/end ranges
* Ordering is by order of addition (for colours and positions), natural ordering (for models and chains)
*