import jalview.datamodel.AlignmentI;
import jalview.datamodel.ColumnSelection;
import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SearchResultMatchI;
import jalview.datamodel.SearchResults;
-import jalview.datamodel.SearchResults.Match;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
import jalview.httpserver.AbstractRequestHandler;
import java.net.BindException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
{
public static final String CHIMERA_FEATURE_GROUP = "Chimera";
- private static final String CHIMERA_FEATURE_PREFIX = "chim_";
-
// Chimera clause to exclude alternate locations in atom selection
private static final String NO_ALTLOCS = "&~@.B-Z&~@.2-9";
private static final String ALPHACARBON = "CA";
+ private List<String> chainNames = new ArrayList<String>();
+
+ private Hashtable<String, String> chainFile = new Hashtable<String, String>();
+
/*
* Object through which we talk to Chimera
*/
* @param ssm
* @param pdbentry
* @param sequenceIs
- * @param chains
* @param protocol
*/
public JalviewChimeraBinding(StructureSelectionManager ssm,
- PDBEntry[] pdbentry, SequenceI[][] sequenceIs, String[][] chains,
- String protocol)
+ PDBEntry[] pdbentry, SequenceI[][] sequenceIs, String protocol)
{
- super(ssm, pdbentry, sequenceIs, chains, protocol);
+ super(ssm, pdbentry, sequenceIs, protocol);
viewer = new ChimeraManager(
new ext.edu.ucsf.rbvi.strucviz2.StructureManager(true));
}
*/
public String getViewerTitle(boolean verbose)
{
- return getViewerTitle(CHIMERA_FEATURE_GROUP, verbose);
+ return getViewerTitle("Chimera", verbose);
}
/**
boolean first = true;
for (String chain : toshow)
{
+ int modelNumber = getModelNoForChain(chain);
+ String showChainCmd = modelNumber == -1 ? "" : modelNumber + ":."
+ + chain.split(":")[1];
if (!first)
{
cmd.append(",");
}
- cmd.append(":.").append(chain);
+ cmd.append(showChainCmd);
first = false;
}
* window, but it looks more helpful not to (easier to relate chains to the
* whole)
*/
- final String command = "~display #*; ~ribbon #*; ribbon "
+ final String command = "~display #*; ~ribbon #*; ribbon :"
+ cmd.toString();
sendChimeraCommand(command, false);
}
*/
public abstract void refreshPdbEntries();
- private int getModelNum(String modelFileName)
- {
- String[] mfn = getPdbFile();
- if (mfn == null)
- {
- return -1;
- }
- for (int i = 0; i < mfn.length; i++)
- {
- if (mfn[i].equalsIgnoreCase(modelFileName))
- {
- return i;
- }
- }
- return -1;
- }
-
- /**
- * map between index of model filename returned from getPdbFile and the first
- * index of models from this file in the viewer. Note - this is not trimmed -
- * use getPdbFile to get number of unique models.
- */
- private int _modelFileNameMap[];
-
// ////////////////////////////////
// /StructureListener
@Override
{
return new String[0];
}
- // if (modelFileNames == null)
- // {
- // Collection<ChimeraModel> chimodels = viewer.getChimeraModels();
- // _modelFileNameMap = new int[chimodels.size()];
- // int j = 0;
- // for (ChimeraModel chimodel : chimodels)
- // {
- // String mdlName = chimodel.getModelName();
- // }
- // modelFileNames = new String[j];
- // // System.arraycopy(mset, 0, modelFileNames, 0, j);
- // }
return chimeraMaps.keySet().toArray(
modelFileNames = new String[chimeraMaps.size()]);
*
* @return
*/
+ @Override
public List<String> getChainNames()
{
- List<String> names = new ArrayList<String>();
- String[][] allNames = getChains();
- if (allNames != null)
- {
- for (String[] chainsForPdb : allNames)
- {
- if (chainsForPdb != null)
- {
- for (String chain : chainsForPdb)
- {
- if (chain != null && !names.contains(chain))
- {
- names.add(chain);
- }
- }
- }
- }
- }
- return names;
+ return chainNames;
}
/**
String cmd = "list residues attr '" + attName + "'";
List<String> residues = sendChimeraCommand(cmd, true);
- /*
- * TODO check if Jalview already has this feature name, if so give it a
- * distinguishing prefix e.g. chim_
- */
- FeatureRenderer fr = alignmentPanel.getFeatureRenderer();
- // todo should getRenderOrder be in api.FeatureRenderer?
- // FIXME this is empty if feature display is turned off
- List<String> existingFeatures = ((jalview.gui.FeatureRenderer) fr)
- .getRenderOrder();
- if (existingFeatures.contains(attName))
+ boolean featureAdded = createFeaturesForAttributes(attName, residues);
+ if (featureAdded)
{
- // TODO check if feature of this name is in group Chimera
- // if so don't create a new feature name!
- // problem: needs a lookup of features for feature group
- attName = getStructureFeaturePrefix() + attName;
+ alignmentPanel.getFeatureRenderer().featuresAdded();
}
+ }
- /*
- * Expect 0, 1 or more reply lines of the format (chi2 is attName):
- * residue id #0:5.A chi2 -155.000836316 index 5
- * or
- * residue id #0:6.A chi3 None
- *
- * We assume here that attributes on structure do not naturally convert
- * to ranges on sequence, i.e. we just set one feature per mapped position.
- *
- * To conflate positions, would need to first build a map
- * Map<String value, Map<Sequence seq, List<Integer position>>>
- * and then traverse it to find feature ranges.
- */
+ /**
+ * Create features in Jalview for the given attribute name and structure
+ * residues.
+ *
+ * <pre>
+ * The residue list should be 0, 1 or more reply lines of the format:
+ * residue id #0:5.A isHelix -155.000836316 index 5
+ * or
+ * residue id #0:6.A isHelix None
+ * </pre>
+ *
+ * @param attName
+ * @param residues
+ * @return
+ */
+ protected boolean createFeaturesForAttributes(String attName,
+ List<String> residues)
+ {
boolean featureAdded = false;
String featureGroup = getViewerFeatureGroup();
spec.setPdbFile(pdbFile);
List<AtomSpec> atoms = Collections.singletonList(spec);
+
+ /*
+ * locate the mapped position in the alignment (if any)
+ */
SearchResults sr = getSsm()
.findAlignmentPositionsForStructurePositions(atoms);
* expect one matched alignment position, or none
* (if the structure position is not mapped)
*/
- for (Match m : sr.getResults())
+ for (SearchResultMatchI m : sr.getResults())
{
SequenceI seq = m.getSequence();
int start = m.getStart();
featureAdded |= seq.addSequenceFeature(sf);
}
}
- if (featureAdded)
- {
- fr.featuresAdded();
- }
- }
-
- /**
- * Answers a 'namespace' prefix to use for features created in Jalview from
- * attributes in the structure viewer
- *
- * @return
- */
- protected String getStructureFeaturePrefix()
- {
- // TODO pull up as abstract
- return CHIMERA_FEATURE_PREFIX;
+ return featureAdded;
}
/**
// todo pull up to interface
return CHIMERA_FEATURE_GROUP;
}
+
+
+ public Hashtable<String, String> getChainFile()
+ {
+ return chainFile;
+ }
+
+ public List<ChimeraModel> getChimeraModelByChain(String chain)
+ {
+ return chimeraMaps.get(chainFile.get(chain));
+ }
+
+ public int getModelNoForChain(String chain)
+ {
+ List<ChimeraModel> foundModels = getChimeraModelByChain(chain);
+ if (foundModels != null && !foundModels.isEmpty())
+ {
+ return foundModels.get(0).getModelNumber();
+ }
+ return -1;
+ }
}