import jalview.io.DataSourceType;
import jalview.io.StructureFile;
import jalview.structure.StructureImportSettings.TFType;
+import jalview.util.MapList;
import jalview.util.MappingUtils;
import jalview.util.MessageManager;
import jalview.util.Platform;
{
if (mappings.isEmpty())
{
- jalview.bin.Console.errPrintln("reportMapping: No PDB/Sequence mappings.");
+ jalview.bin.Console
+ .errPrintln("reportMapping: No PDB/Sequence mappings.");
}
else
{
int i = 0;
for (StructureMapping sm : mappings)
{
- jalview.bin.Console.errPrintln("mapping " + i++ + " : " + sm.pdbfile);
+ jalview.bin.Console
+ .errPrintln("mapping " + i++ + " : " + sm.pdbfile);
}
}
}
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
* - 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
+ * @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,
* @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
+ * @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,
String maxChainId = " ";
PDBChain maxChain = null;
boolean first = true;
+ PDBChain idLengthChain = null;
for (PDBChain chain : pdb.getChains())
{
if (targetChainId.length() > 0 && !targetChainId.equals(chain.id)
final String type = chain.isNa ? AlignSeq.DNA : AlignSeq.PEP;
AlignSeq as = AlignSeq.doGlobalNWAlignment(seq, chain.sequence,
type);
- // equivalent to:
- // AlignSeq as = new AlignSeq(sequence[s], chain.sequence, type);
- // as.calcScoreMatrix();
- // as.traceAlignment();
+ // TODO: JAL-4366 determinine of a crummy alignment but exact match should make this chain the one to be mapped to a 3di sequence
+ if (as.s1str.length() == as.s2str.length())
+ {
+ idLengthChain = chain;
+ }
if (first || as.maxscore > max
|| (as.maxscore == max && chain.id.equals(targetChainId)))
{
continue;
}
-
if (sourceType == DataSourceType.PASTE)
{
pdbFile = "INLINE" + pdb.getId();
}
-
List<StructureMapping> seqToStrucMapping = new ArrayList<>();
+
+ List<StructureMapping> foundSiftsMappings = new ArrayList<>();
if (isMapUsingSIFTs && seq.isProtein())
{
if (progress != null)
pdb.getId().toLowerCase(Locale.ROOT));
maxChain.transferResidueAnnotation(siftsMapping, null);
ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
+ foundSiftsMappings.add(siftsMapping);
} catch (SiftsException e)
{
- // fall back to NW alignment
Console.error(e.getMessage());
- StructureMapping nwMapping = getNWMappings(seq, pdbFile,
- targetChainId, maxChain, pdb, maxAlignseq);
- seqToStrucMapping.add(nwMapping);
- maxChain.makeExactMapping(maxAlignseq, seq);
- maxChain.transferRESNUMFeatures(seq, "IEA:Jalview",
- pdb.getId().toLowerCase(Locale.ROOT)); // FIXME: is
- // this
- // "IEA:Jalview" ?
- maxChain.transferResidueAnnotation(nwMapping, sqmpping);
- ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
}
}
else
{
- List<StructureMapping> foundSiftsMappings = new ArrayList<>();
for (PDBChain chain : pdb.getChains())
{
StructureMapping siftsMapping = null;
jalview.bin.Console.errPrintln(e.getMessage());
}
}
+ // If sifts was successful, add mappings and return
if (!foundSiftsMappings.isEmpty())
{
- seqToStrucMapping.addAll(foundSiftsMappings);
ds.addPDBId(sqmpping.getTo().getAllPDBEntries().get(0));
}
- else
- {
- StructureMapping nwMapping = getNWMappings(seq, pdbFile,
- maxChainId, maxChain, pdb, maxAlignseq);
- seqToStrucMapping.add(nwMapping);
- maxChain.transferRESNUMFeatures(seq, null,
- pdb.getId().toLowerCase(Locale.ROOT)); // FIXME: is this
- // "IEA:Jalview" ?
- maxChain.transferResidueAnnotation(nwMapping, sqmpping);
- ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
- }
+ }
+
+ // If sifts was successful, add mappings and return
+ if (!foundSiftsMappings.isEmpty())
+ {
+ seqToStrucMapping.addAll(foundSiftsMappings);
}
}
- else
+ if (foundSiftsMappings.isEmpty())
{
- if (progress != null)
+ // Not doing SIFTS, or SIFTS failed for some reason.
+
+ // first check if we should use an identity mapping
+ if (idLengthChain != null && maxAlignseq.getS2Coverage() < 0.75)
{
- progress.setProgressBar(
- MessageManager.getString(
- "status.obtaining_mapping_with_nw_alignment"),
- progressSessionId);
+ Console.info(
+ "Assuming 3Dsi identity mapping between structure and sequence");
+ StructureMapping matchMapping = getIdMappings(seq, pdbFile,
+ idLengthChain.id, idLengthChain, pdb);
+ seqToStrucMapping.add(matchMapping);
+ ds.addPDBId(idLengthChain.sequence.getAllPDBEntries().get(0));
+ Console.info("Mapping added.");
+ }
+ else
+ {
+ // Construct a needleman wunsch mapping instead.
+ if (progress != null)
+ {
+ progress.setProgressBar(
+ MessageManager.getString(
+ "status.obtaining_mapping_with_nw_alignment"),
+ progressSessionId);
+ }
+ StructureMapping nwMapping = getNWMappings(seq, pdbFile,
+ maxChainId, maxChain, pdb, maxAlignseq);
+ seqToStrucMapping.add(nwMapping);
+ ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
}
- StructureMapping nwMapping = getNWMappings(seq, pdbFile, maxChainId,
- maxChain, pdb, maxAlignseq);
- seqToStrucMapping.add(nwMapping);
- ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
}
if (forStructureView)
{
}
return curChainMapping;
}
+
+ /**
+ * construct a mapping based on a pairwise alignment of the sequence and chain
+ * @param seq
+ * @param pdbFile
+ * @param maxChainId
+ * @param maxChain
+ * @param pdb
+ * @param maxAlignseq
+ * @return
+ */
private StructureMapping getNWMappings(SequenceI seq, String pdbFile,
String maxChainId, PDBChain maxChain, StructureFile pdb,
maxChain.transferResidueAnnotation(nwMapping, sqmpping);
return nwMapping;
}
+
+ /**
+ * construct a 1:1 mapping using given residue and sequence numbering
+ * @param seq
+ * @param pdbFile
+ * @param identityChainId
+ * @param identityChain
+ * @param pdb
+ * @return
+ */
+
+ private StructureMapping getIdMappings(SequenceI seq, String pdbFile,
+ String identityChainId, PDBChain identityChain, StructureFile pdb)
+ {
+ final StringBuilder mappingDetails = new StringBuilder(128);
+ mappingDetails.append(NEWLINE)
+ .append("Sequence \u27f7 Structure mapping details");
+ mappingDetails.append(NEWLINE);
+ mappingDetails.append("Method: Matching length 1:1");
+ mappingDetails.append(NEWLINE).append("PDB Sequence is :")
+ .append(NEWLINE).append("Sequence = ")
+ .append(identityChain.sequence.getSequenceAsString());
+ mappingDetails.append(NEWLINE).append("No of residues = ")
+ .append(identityChain.residues.size()).append(NEWLINE)
+ .append(NEWLINE);
+
+ mappingDetails.append(NEWLINE)
+ .append("Aligned Sequence is: " + seq.getDisplayId(true));
+ mappingDetails.append(NEWLINE)
+ .append("Sequence = " + seq.getSequenceAsString());
+
+ int from = Math.max(seq.getStart(),identityChain.sequence.getStart());
+ int to = Math.min(seq.getEnd(), identityChain.sequence.getEnd());
+ jalview.datamodel.Mapping sqmpping = new jalview.datamodel.Mapping(seq,
+ new MapList(new int[]
+ { from,to },
+ new int[]
+ { from,to },
+ 1, 1));
+ identityChain.mapChainWith(sqmpping, seq);
+
+ identityChain.transferRESNUMFeatures(seq, null,
+ pdb.getId().toLowerCase(Locale.ROOT));
+
+ // Construct mapping
+ // TODO REFACTOR TO PDBChain as a builder
+ HashMap<Integer, int[]> mapping = new HashMap<>();
+ int resNum = -10000;
+ int index = 0;
+ char insCode = ' ';
+
+ do
+ {
+ Atom tmp = identityChain.atoms.elementAt(index);
+ if ((resNum != tmp.resNumber || insCode != tmp.insCode)
+ && tmp.alignmentMapping != -1)
+ {
+ resNum = tmp.resNumber;
+ insCode = tmp.insCode;
+ if (tmp.alignmentMapping >= -1)
+ {
+ mapping.put(tmp.alignmentMapping + 1,
+ new int[]
+ { tmp.resNumber, tmp.atomIndex });
+ }
+ }
+
+ index++;
+ } while (index < identityChain.atoms.size());
+
+ StructureMapping idMapping = new StructureMapping(seq, pdbFile,
+ pdb.getId(), identityChainId, mapping,
+ mappingDetails.toString());
+ identityChain.transferResidueAnnotation(idMapping, sqmpping);
+ return idMapping;
+ }
public void removeStructureViewerListener(Object svl, String[] pdbfiles)
{