import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.Annotation;
+import jalview.datamodel.ContiguousI;
import jalview.datamodel.HiddenColumns;
import jalview.datamodel.PDBEntry;
import jalview.datamodel.SearchResults;
import jalview.io.AppletFormatAdapter;
import jalview.io.DataSourceType;
import jalview.io.StructureFile;
+import jalview.structure.StructureImportSettings.TFType;
import jalview.util.MappingUtils;
import jalview.util.MessageManager;
import jalview.util.Platform;
{
if (mappings.isEmpty())
{
- System.err.println("reportMapping: No PDB/Sequence mappings.");
+ jalview.bin.Console.errPrintln("reportMapping: No PDB/Sequence mappings.");
}
else
{
- System.err.println(
+ jalview.bin.Console.errPrintln(
"reportMapping: There are " + mappings.size() + " mappings.");
int i = 0;
for (StructureMapping sm : mappings)
{
- System.err.println("mapping " + i++ + " : " + sm.pdbfile);
+ jalview.bin.Console.errPrintln("mapping " + i++ + " : " + sm.pdbfile);
}
}
}
IProgressIndicator progress)
{
return computeMapping(true, sequence, targetChains, pdbFile, protocol,
- progress);
+ progress, null, null, true);
}
/**
*/
synchronized public StructureFile setMapping(boolean forStructureView,
SequenceI[] sequenceArray, String[] targetChainIds,
- String pdbFile, DataSourceType sourceType)
+ String pdbFile, DataSourceType sourceType, TFType tft,
+ String paeFilename)
+ {
+ return setMapping(forStructureView, sequenceArray, targetChainIds,
+ pdbFile, sourceType, tft, paeFilename, true);
+ }
+
+
+ /**
+ * create sequence structure mappings between each sequence and the given
+ * pdbFile (retrieved via the given protocol). Either constructs a mapping
+ * using NW alignment or derives one from any available SIFTS mapping data.
+ *
+ * @param forStructureView
+ * when true, record the mapping for use in mouseOvers
+ *
+ * @param sequenceArray
+ * - one or more sequences to be mapped to pdbFile
+ * @param targetChainIds
+ * - optional chain specification for mapping each sequence to pdb
+ * (may be nill, individual elements may be nill) - JBPNote: JAL-2693
+ * - this should be List<List<String>>, empty lists indicate no
+ * predefined mappings
+ * @param pdbFile
+ * - structure data resource
+ * @param sourceType
+ * - how to resolve data from resource
+ * @param tft - specify how to interpret the temperature factor column in the atom data
+ * @param paeFilename - when not null, specifies a filename containing a matrix formatted in JSON using one of the known PAE formats
+ * @param doXferSettings - when true, transfer annotation to mapped sequences in sequenceArray
+ * @return null or the structure data parsed as a pdb file
+ */
+ synchronized public StructureFile setMapping(boolean forStructureView,
+ SequenceI[] sequenceArray, String[] targetChainIds,
+ String pdbFile, DataSourceType sourceType, TFType tft,
+ String paeFilename, boolean doXferSettings)
{
return computeMapping(forStructureView, sequenceArray, targetChainIds,
- pdbFile, sourceType, null);
+ pdbFile, sourceType, null, tft, paeFilename, doXferSettings);
}
/**
* @param IProgressIndicator
* reference to UI component that maintains a progress bar for the
* mapping operation
+ * @param tft - specify how to interpret the temperature factor column in the atom data
+ * @param paeFilename - when not null, specifies a filename containing a matrix formatted in JSON using one of the known PAE formats
+ * @param doXferSettings - when true, transfer annotation to mapped sequences in sequenceArray
* @return null or the structure data parsed as a pdb file
*/
synchronized public StructureFile computeMapping(boolean forStructureView,
SequenceI[] sequenceArray, String[] targetChainIds,
String pdbFile, DataSourceType sourceType,
- IProgressIndicator progress)
+ IProgressIndicator progress, TFType tft, String paeFilename,
+ boolean doXferSettings)
{
long progressSessionId = System.currentTimeMillis() * 3;
// FIXME: possibly should just delete
boolean parseSecStr = processSecondaryStructure
- ? isStructureFileProcessed(pdbFile, sequenceArray)
- : false;
+ && !isStructureFileProcessed(pdbFile, sequenceArray);
StructureFile pdb = null;
boolean isMapUsingSIFTs = SiftsSettings.isMapWithSifts();
// FIXME if sourceType is not null, we've lost data here
sourceType = AppletFormatAdapter.checkProtocol(pdbFile);
pdb = new JmolParser(false, pdbFile, sourceType);
+ if (paeFilename != null)
+ {
+ pdb.setPAEMatrix(paeFilename);
+ }
+ pdb.setTemperatureFactorType(tft);
pdb.addSettings(parseSecStr && processSecondaryStructure,
parseSecStr && addTempFacAnnot,
parseSecStr && secStructServices);
+ // save doXferSettings and reset after doParse()
+ boolean temp = pdb.getDoXferSettings();
+ pdb.setDoXferSettings(doXferSettings);
pdb.doParse();
+ pdb.setDoXferSettings(temp);
if (pdb.getId() != null && pdb.getId().trim().length() > 0
&& DataSourceType.FILE == sourceType)
{
chain.transferResidueAnnotation(siftsMapping, null);
} catch (SiftsException e)
{
- System.err.println(e.getMessage());
+ jalview.bin.Console.errPrintln(e.getMessage());
} catch (Exception e)
{
- System.err.println(
+ jalview.bin.Console.errPrintln(
"Unexpected exception during SIFTS mapping - falling back to NW for this sequence/structure pair");
- System.err.println(e.getMessage());
+ jalview.bin.Console.errPrintln(e.getMessage());
}
}
if (!foundSiftsMappings.isEmpty())
private boolean isStructureFileProcessed(String pdbFile,
SequenceI[] sequenceArray)
{
- boolean parseSecStr = true;
+ boolean processed = false;
if (isPDBFileRegistered(pdbFile))
{
for (SequenceI sq : sequenceArray)
// passed, not the structure data ID -
if (PDBfile.isCalcIdForFile(ala, findIdForPDBFile(pdbFile)))
{
- parseSecStr = false;
+ processed = true;
}
}
}
}
}
- return parseSecStr;
+ return processed;
}
public void addStructureMapping(StructureMapping sm)
}
/**
+ * hack to highlight a range of positions at once on any structure views
+ *
+ * @param sequenceRef
+ * @param is
+ * - series of int start-end ranges as positions on sequenceRef
+ * @param i
+ * @param object
+ */
+ public void highlightPositionsOn(SequenceI sequenceRef, int[][] is,
+ Object source)
+ {
+ boolean hasSequenceListeners = handlingVamsasMo
+ || !seqmappings.isEmpty();
+ SearchResultsI results = null;
+ ArrayList<Integer> listOfPositions = new ArrayList<Integer>();
+ for (int[] s_e : is)
+ {
+ for (int p = s_e[0]; p <= s_e[1]; listOfPositions.add(p++))
+ ;
+ }
+ int seqpos[] = new int[listOfPositions.size()];
+ int i = 0;
+ for (Integer p : listOfPositions)
+ {
+ seqpos[i++] = p;
+ }
+
+ for (i = 0; i < listeners.size(); i++)
+ {
+ Object listener = listeners.elementAt(i);
+ if (listener == source)
+ {
+ // TODO listener (e.g. SeqPanel) is never == source (AlignViewport)
+ // Temporary fudge with SequenceListener.getVamsasSource()
+ continue;
+ }
+ if (listener instanceof StructureListener)
+ {
+ highlightStructure((StructureListener) listener, sequenceRef,
+ seqpos);
+ }
+
+ }
+ }
+
+ /**
* Propagate mouseover of a single position in a structure
*
* @param pdbResNum
int indexpos = sm.getSeqPos(atom.getPdbResNum());
if (lastipos != indexpos || lastseq != sm.sequence)
{
- results.addResult(sm.sequence, indexpos, indexpos);
+ results.appendResult(sm.sequence, indexpos, indexpos);
lastipos = indexpos;
lastseq = sm.sequence;
// construct highlighted sequence list
sl.highlightAtoms(atoms);
}
+ public void highlightStructureRegionsFor(StructureListener sl,
+ SequenceI[] seqs, int... columns)
+ {
+ List<SequenceI> to_highlight = new ArrayList<SequenceI>();
+ for (SequenceI seq : seqs)
+ {
+ if (sl.isListeningFor(seq))
+ {
+ to_highlight.add(seq);
+ }
+ }
+ if (to_highlight.size() == 0)
+ {
+ return;
+ }
+ List<AtomSpec> atoms = new ArrayList<>();
+ for (SequenceI seq : to_highlight)
+ {
+ int atomNo;
+ for (StructureMapping sm : mappings)
+ {
+ if (sm.sequence == seq || sm.sequence == seq.getDatasetSequence()
+ || (sm.sequence.getDatasetSequence() != null && sm.sequence
+ .getDatasetSequence() == seq.getDatasetSequence()))
+ {
+
+ for (int i = 0; i < columns.length; i += 2)
+ {
+ ContiguousI positions = seq.findPositions(columns[i] + 1,
+ columns[i + 1] + 1);
+ if (positions == null)
+ {
+ continue;
+ }
+ for (int index = positions.getBegin(); index <= positions
+ .getEnd(); index++)
+ {
+
+ atomNo = sm.getAtomNum(index);
+
+ if (atomNo > 0)
+ {
+ atoms.add(new AtomSpec(sm.pdbfile, sm.pdbchain,
+ sm.getPDBResNum(index), atomNo));
+ }
+ }
+ }
+ }
+ }
+ if (atoms.size() > 0)
+ {
+ sl.highlightAtoms(atoms);
+ }
+ }
+ }
+
/**
* true if a mouse over event from an external (ie Vamsas) source is being
* handled
*
* if (mappings[j].sequence == seq && mappings[j].getPdbId().equals(pdbid)
* && mappings[j].pdbfile.equals(sl.getPdbFile())) {
- * System.out.println(pdbid+" "+mappings[j].getPdbId() +"
+ * jalview.bin.Console.outPrintln(pdbid+" "+mappings[j].getPdbId() +"
* "+mappings[j].pdbfile);
*
* java.awt.Color col; for(int index=0; index<seq.getLength(); index++) {
boolean removed = seqmappings.remove(acf);
if (removed && seqmappings.isEmpty())
{ // debug
- System.out.println("All mappings removed");
+ jalview.bin.Console.outPrintln("All mappings removed");
}
}
}
return seqmappings;
}
+ /**
+ * quick and dirty route to just highlight all structure positions for a range
+ * of columns
+ *
+ * @param sequencesArray
+ * @param is
+ * start-end columns on sequencesArray
+ * @param source
+ * origin parent AlignmentPanel
+ */
+ public void highlightPositionsOnMany(SequenceI[] sequencesArray, int[] is,
+ Object source)
+ {
+ for (int i = 0; i < listeners.size(); i++)
+ {
+ Object listener = listeners.elementAt(i);
+ if (listener == source)
+ {
+ // TODO listener (e.g. SeqPanel) is never == source (AlignViewport)
+ // Temporary fudge with SequenceListener.getVamsasSource()
+ continue;
+ }
+ if (listener instanceof StructureListener)
+ {
+ highlightStructureRegionsFor((StructureListener) listener,
+ sequencesArray, is);
+ }
+ }
+ }
+
+ public Map<String, String> getPdbFileNameIdMap()
+ {
+ return pdbFileNameId;
+ }
+
+ public Map<String, String> getPdbIdFileNameMap()
+ {
+ return pdbIdFileName;
+ }
+
}