- }
- }
- if (chain == null || (chid != null && (chid.equals(chain)
- || chid.trim().equals(chain.trim())
- || (chain.trim().length() == 0 && chid.equals("_")))))
- {
- // FIXME seems to result in 'PDB|1QIP|1qip|A' - 1QIP is redundant.
- // TODO: suggest simplify naming to 1qip|A as default name defined
- pdbcs.setName(id
- + SEPARATOR + pdbcs.getName());
- // Might need to add more metadata to the PDBEntry object
- // like below
- /*
- * PDBEntry entry = new PDBEntry(); // Construct the PDBEntry
- * entry.setId(id); if (entry.getProperty() == null)
- * entry.setProperty(new Hashtable());
- * entry.getProperty().put("chains", pdbchain.id + "=" +
- * sq.getStart() + "-" + sq.getEnd());
- * sq.getDatasetSequence().addPDBId(entry);
- */
- // Add PDB DB Refs
- // We make a DBRefEtntry because we have obtained the PDB file from
- // a
- // verifiable source
- // JBPNote - PDB DBRefEntry should also carry the chain and mapping
- // information
- DBRefEntry dbentry = new DBRefEntry(getDbSource(),
- getDbVersion(), (chid == null ? id : id + chid));
- // dbentry.setMap()
- pdbcs.addDBRef(dbentry);
- }
- else
+ }
+
+ public static void addPAEToStructure(StructureSelectionManager ssm,
+ String structFilename, File pae, String label)
+ {
+ FileInputStream paeInput = null;
+ try
+ {
+ paeInput = new FileInputStream(pae);
+ } catch (FileNotFoundException e)
+ {
+ Console.error(
+ "Could not find pAE file '" + pae.getAbsolutePath() + "'", e);
+ return;
+ }
+ if (ssm == null)
+ {
+ ssm = StructureSelectionManager
+ .getStructureSelectionManager(Desktop.instance);
+ }
+ if (ssm != null)
+ {
+ StructureMapping[] smArray = ssm.getMapping(structFilename);
+
+ try
+ {
+ if (!importPaeJSONAsContactMatrixToStructure(smArray, paeInput,
+ label))
+ {
+ Console.warn("Could not import contact matrix from '"
+ + pae.getAbsolutePath() + "' to structure.");
+ }
+ } catch (IOException e1)
+ {
+ Console.error("Error when importing pAE file '"
+ + pae.getAbsolutePath() + "'", e1);
+ } catch (ParseException e2)
+ {
+ Console.error("Error when parsing pAE file '"
+ + pae.getAbsolutePath() + "'", e2);
+ }
+ }
+ }
+
+ /**
+ * parses the given pAE matrix and adds it to sequence 0 in the given
+ * alignment
+ *
+ * @param pdbAlignment
+ * @param pae_input
+ * @return true if there was a pAE matrix added
+ * @throws ParseException
+ * @throws IOException
+ * @throws Exception
+ */
+ public static boolean importPaeJSONAsContactMatrixToSequence(
+ AlignmentI pdbAlignment, InputStream pae_input, int index,
+ String seqId, String label) throws IOException, ParseException
+ {
+ SequenceI sequence = null;
+ if (seqId == null)
+ {
+ int seqToGet = index > 0 ? index : 0;
+ sequence = pdbAlignment.getSequenceAt(seqToGet);
+ }
+ if (sequence == null)
+ {
+ SequenceI[] sequences = pdbAlignment.findSequenceMatch(seqId);
+ if (sequences == null || sequences.length < 1)
+ {
+ Console.warn("Could not find sequence with id '" + seqId
+ + "' to attach pAE matrix to. Ignoring matrix.");
+ return false;
+ }
+ else
+ {
+ sequence = sequences[0]; // just use the first sequence with this seqId
+ }
+ }
+ if (sequence == null)
+ {
+ return false;
+ }
+ return importPaeJSONAsContactMatrixToSequence(pdbAlignment, pae_input,
+ sequence, label);
+ }
+
+ public static boolean importPaeJSONAsContactMatrixToSequence(
+ AlignmentI pdbAlignment, InputStream pae_input,
+ SequenceI sequence, String label)
+ throws IOException, ParseException
+ {
+ JSONObject paeDict = parseJSONtoPAEContactMatrix(pae_input);
+ if (paeDict == null)
+ {
+ Console.debug("JSON file did not parse properly.");
+ return false;
+ }
+ ContactMatrixI matrix = new PAEContactMatrix(sequence,
+ (Map<String, Object>) paeDict);
+
+ AlignmentAnnotation cmannot = sequence.addContactList(matrix);
+ if (label != null)
+ cmannot.label = label;
+ pdbAlignment.addAnnotation(cmannot);
+
+ return true;
+ }
+
+ public static JSONObject parseJSONtoPAEContactMatrix(
+ InputStream pae_input) throws IOException, ParseException
+ {
+ Object paeJson = Platform.parseJSON(pae_input);
+ JSONObject paeDict = null;
+ if (paeJson instanceof JSONObject)
+ {
+ paeDict = (JSONObject) paeJson;
+ }
+ else if (paeJson instanceof JSONArray)
+ {
+ JSONArray jsonArray = (JSONArray) paeJson;
+ if (jsonArray.size() > 0)
+ paeDict = (JSONObject) jsonArray.get(0);
+ }
+
+ return paeDict;
+ }
+
+ // ###### TEST THIS
+ public static boolean importPaeJSONAsContactMatrixToStructure(
+ StructureMapping[] smArray, InputStream paeInput, String label)
+ throws IOException, ParseException
+ {
+ boolean someDone = false;
+ for (StructureMapping sm : smArray)
+ {
+ boolean thisDone = importPaeJSONAsContactMatrixToStructure(sm,
+ paeInput, label);
+ someDone |= thisDone;
+ }
+ return someDone;
+ }
+
+ public static boolean importPaeJSONAsContactMatrixToStructure(
+ StructureMapping sm, InputStream paeInput, String label)
+ throws IOException, ParseException
+ {
+ JSONObject pae_obj = parseJSONtoPAEContactMatrix(paeInput);
+ if (pae_obj == null)
+ {
+ Console.debug("JSON file did not parse properly.");
+ return false;
+ }
+
+ SequenceI seq = sm.getSequence();
+ ContactMatrixI matrix = new PAEContactMatrix(seq,
+ (Map<String, Object>) pae_obj);
+ AlignmentAnnotation cmannot = sm.getSequence().addContactList(matrix);
+ /* this already happens in Sequence.addContactList()
+ seq.addAlignmentAnnotation(cmannot);
+ */
+ return true;
+ }
+
+ /**
+ * general purpose structure importer - designed to yield alignment useful for
+ * transfer of annotation to associated sequences
+ *
+ * @param alphaFoldCif
+ * @param tmpFile
+ * @param id
+ * @param chain
+ * @param dbSource
+ * @param dbVersion
+ * @return
+ * @throws Exception
+ */
+ public static AlignmentI importDownloadedStructureFromUrl(
+ String alphaFoldCif, File tmpFile, String id, String chain,
+ String dbSource, String dbVersion) throws Exception
+ {
+ String file = tmpFile.getAbsolutePath();
+ // todo get rid of Type and use FileFormatI instead?
+ FileFormatI fileFormat = FileFormat.MMCif;
+ TFType tempfacType = TFType.PLDDT;
+ AlignmentI pdbAlignment = new FormatAdapter().readFile(tmpFile, file,
+ DataSourceType.FILE, fileFormat, tempfacType);
+
+ if (pdbAlignment != null)
+ {
+ List<SequenceI> toremove = new ArrayList<SequenceI>();
+ for (SequenceI pdbcs : pdbAlignment.getSequences())
+ {
+ String chid = null;
+ // Mapping map=null;
+ for (PDBEntry pid : pdbcs.getAllPDBEntries())
+ {
+ if (pid.getFile() == file)