From 067c5bbdf6f36a20513f57a3f88210c5f4c3270f Mon Sep 17 00:00:00 2001 From: tcarver <tjc> Date: Wed, 27 Mar 2013 10:22:22 +0000 Subject: [PATCH] add getTransferValues() to change evidence code and add source link to GO and product qualifiers --- .../components/TransferAnnotationTool.java | 198 +++++++++++++----- 1 file changed, 149 insertions(+), 49 deletions(-) diff --git a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java index 795b21e95..cc44b783d 100644 --- a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java +++ b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java @@ -127,16 +127,14 @@ public class TransferAnnotationTool extends JFrame final EntryGroup entryGroup, final MatchPanel matchPanel) { - super("Transfer Annotation Tool :: " - + feature.getIDString()); + super("Transfer Annotation Tool :: "+ feature.getIDString()); this.matchPanel = matchPanel; List<String> geneNames = null; if(matchPanel != null) - geneNames = matchPanel.getGeneNameList(); - - FlowLayout flow = new FlowLayout(FlowLayout.LEFT); - JPanel panel = new JPanel(flow); + geneNames = matchPanel.getGeneNameList(); + + JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JPanel pane = new JPanel(new GridBagLayout()); JScrollPane jsp = new JScrollPane(panel); panel.setBackground(Color.white); @@ -154,7 +152,6 @@ public class TransferAnnotationTool extends JFrame geneNameCheckBoxes, geneNames); addBottomButtons(qualifierPanels, geneNameCheckBoxes, framePanel, entryGroup); - pack(); setVisible(true); } @@ -232,7 +229,6 @@ public class TransferAnnotationTool extends JFrame while(it.hasNext()) { GFFStreamFeature kid = (GFFStreamFeature)it.next(); - if(id.equals( GeneUtils.getUniqueName(((GFFStreamFeature)kid)) )) continue; addQualifierPanel((Feature)kid.getUserData(), qualifierPanels, @@ -272,7 +268,7 @@ public class TransferAnnotationTool extends JFrame { for(int i=0; i<qualifierPanels.size(); i++) { - QualifierPanel qP = (QualifierPanel)qualifierPanels.get(i); + QualifierPanel qP = qualifierPanels.get(i); Enumeration<JCheckBox> enumQualifiers = qP.getQualifierCheckBoxes().keys(); while(enumQualifiers.hasMoreElements()) { @@ -292,9 +288,10 @@ public class TransferAnnotationTool extends JFrame { for(int i = 0; i < geneNameCheckBoxes.size(); i++) { - JCheckBox cb = (JCheckBox) geneNameCheckBoxes.get(i); + JCheckBox cb = geneNameCheckBoxes.get(i); cb.setSelected(!cb.isSelected()); } + geneNameBox.repaint(); } }); xBox.add(toggleGeneList); @@ -330,7 +327,7 @@ public class TransferAnnotationTool extends JFrame c.gridx = 0; pane.add(xBox, c); - final List<String> clusterList = matchPanel.getGeneNameList(true); + final List<String> clusterList = (matchPanel == null ? null : matchPanel.getGeneNameList(true)); if(clusterList != null && !geneNames.contains(clusterList.get(0))) { final JButton importCluster = new JButton("Import Cluster Names"); @@ -383,7 +380,7 @@ public class TransferAnnotationTool extends JFrame l.setFont(l.getFont().deriveFont(Font.BOLD)); l.setForeground(STEEL_BLUE); pane.add(l, c); - + c.gridy = ++nrows; pane.add(qPanel, c); c.weightx = 0.d; @@ -407,7 +404,11 @@ public class TransferAnnotationTool extends JFrame final JCheckBox overwriteCheckBox = new JCheckBox("Overwrite", false); overwriteCheckBox.setToolTipText("overwrite rather than append values"); - + + final JCheckBox cvCheckBox = new JCheckBox("Set evidence as ISO and link to source in WITH/FROM", false); + cvCheckBox.setToolTipText("for GO and Product qualifiers set the evidence as ISO (Inferred from\n"+ + "Sequence Orthology) and add a link to the source in the WITH/FROM field"); + Box buttonBox = Box.createHorizontalBox(); final JButton transfer = new JButton(">>TRANSFER"); transfer.setToolTipText("transfer annotation"); @@ -418,8 +419,7 @@ public class TransferAnnotationTool extends JFrame if(overwriteCheckBox.isSelected()) { int res = JOptionPane.showConfirmDialog(TransferAnnotationTool.this, - "Overwrite selected annotation?", - "Overwrite", JOptionPane.OK_CANCEL_OPTION); + "Overwrite selected annotation?", "Overwrite", JOptionPane.OK_CANCEL_OPTION); if(res == JOptionPane.CANCEL_OPTION) return; } @@ -429,11 +429,13 @@ public class TransferAnnotationTool extends JFrame StringBuffer summary = new StringBuffer(); for(int i = 0; i < qualifierPanels.size(); i++) { - QualifierPanel qP = (QualifierPanel) qualifierPanels.get(i); + QualifierPanel qP = qualifierPanels.get(i); int res = transferAnnotation(qP.getQualifierCheckBoxes(), geneNameCheckBoxes, qP.getFeature(), entryGroup, sameKeyCheckBox.isSelected(), - overwriteCheckBox.isSelected(), buff, summary); + overwriteCheckBox.isSelected(), + cvCheckBox.isSelected(), + buff, summary); if(res == -1) break; } @@ -458,6 +460,7 @@ public class TransferAnnotationTool extends JFrame yBox.add(transfer); yBox.add(sameKeyCheckBox); yBox.add(overwriteCheckBox); + yBox.add(cvCheckBox); buttonBox.add(yBox); final JButton close = new JButton("CLOSE"); @@ -503,19 +506,20 @@ public class TransferAnnotationTool extends JFrame * @param overwrite */ protected static int transferAnnotation( - final Hashtable<JCheckBox, Vector<JCheckBox>> qualifierCheckBoxes, - final Vector<JCheckBox> geneNameCheckBoxes, - final Feature orginatingFeature, - final EntryGroup entryGroup, - final boolean sameKey, - final boolean overwrite, - final StringBuffer buff, - final StringBuffer genesUpdated) + final Hashtable<JCheckBox, Vector<JCheckBox>> qualifierCheckBoxes, + final Vector<JCheckBox> geneNameCheckBoxes, + final Feature orginatingFeature, + final EntryGroup entryGroup, + final boolean sameKey, + final boolean overwrite, + final boolean setEvidenceAndWithFrom, + final StringBuffer buff, + final StringBuffer genesUpdated) { // transfer selected annotation to genes final QualifierVector qualifiers = orginatingFeature.getQualifiers(); final QualifierVector qualifiersToTransfer = new QualifierVector(); - + Enumeration<JCheckBox> enumQualifiers = qualifierCheckBoxes.keys(); while(enumQualifiers.hasMoreElements()) { @@ -523,22 +527,26 @@ public class TransferAnnotationTool extends JFrame if (cb.isSelected()) { Vector<JCheckBox> qualifierValuesCheckBox = qualifierCheckBoxes.get(cb); - StringVector values = qualifiers.getQualifierByName(cb.getText()).getValues(); + final StringVector values = qualifiers.getQualifierByName(cb.getText()).getValues(); StringVector valuesToTransfer = new StringVector(values); logger4j.debug("TRANSFER "+cb.getText()); for(int i=0; i<qualifierValuesCheckBox.size(); i++) { - JCheckBox valuesCb = (JCheckBox) qualifierValuesCheckBox.get(i); + JCheckBox valuesCb = qualifierValuesCheckBox.get(i); if(!valuesCb.isSelected()) { valuesToTransfer.remove(valuesCb.getText()); logger4j.debug("NOT TRANSFERING "+valuesCb.getText()); } } - + if(valuesToTransfer.size() < 1) continue; + + valuesToTransfer = new StringVector( getTransferValues( + setEvidenceAndWithFrom, orginatingFeature, cb.getText(), valuesToTransfer) ); + qualifiersToTransfer.addElement(new Qualifier(cb.getText(), valuesToTransfer)); } } @@ -546,14 +554,13 @@ public class TransferAnnotationTool extends JFrame int count = 0; for(int i =0; i<geneNameCheckBoxes.size(); i++) { - if( ((JCheckBox)geneNameCheckBoxes.get(i)).isSelected() ) + if( geneNameCheckBoxes.get(i).isSelected() ) count++; } if(count < 1) { - JOptionPane.showMessageDialog(null, - "No genes selected.", + JOptionPane.showMessageDialog(null, "No genes selected.", "Warning", JOptionPane.WARNING_MESSAGE); return -1; } @@ -562,7 +569,7 @@ public class TransferAnnotationTool extends JFrame count = 0; for(int i =0; i<geneNameCheckBoxes.size(); i++) { - JCheckBox cb = (JCheckBox)geneNameCheckBoxes.get(i); + JCheckBox cb = geneNameCheckBoxes.get(i); if( cb.isSelected() ) { geneNames[count] = cb.getText(); @@ -576,7 +583,7 @@ public class TransferAnnotationTool extends JFrame // transfer selected annotation entryGroup.getActionController().startAction(); - geneNames = transfer(features, qualifiersToTransfer, key, sameKey, overwrite, + geneNames = transfer(features, qualifiersToTransfer, key, sameKey, overwrite, GeneUtils.isDatabaseEntry(entryGroup), geneNames, genesUpdated); entryGroup.getActionController().endAction(); @@ -584,7 +591,8 @@ public class TransferAnnotationTool extends JFrame // Commit changes to genes not in Artemis but in the database // Vector<String> genesNotFound = null; - if (orginatingFeature.getEntry().getEMBLEntry() instanceof DatabaseDocumentEntry) + if (geneNames != null && + orginatingFeature.getEntry().getEMBLEntry() instanceof DatabaseDocumentEntry) { DatabaseDocumentEntry db_entry = (DatabaseDocumentEntry) orginatingFeature.getEntry().getEMBLEntry(); @@ -638,7 +646,7 @@ public class TransferAnnotationTool extends JFrame // GeneEdit.showGeneEditor(null, geneNames[i], newDbEntry); } } - + if(genesNotFound != null) JOptionPane.showMessageDialog(null, "Gene(s) Not Found:\n"+genesNotFound.toString(), @@ -676,7 +684,7 @@ public class TransferAnnotationTool extends JFrame StringBuffer qualifierBuffer = new StringBuffer(); for (int j = 0; j < qualifiersToTransfer.size(); j++) { - Qualifier newQualifier = (Qualifier) qualifiersToTransfer.elementAt(j); + Qualifier newQualifier = qualifiersToTransfer.elementAt(j); String qualifierName = newQualifier.getName(); try { @@ -709,6 +717,7 @@ public class TransferAnnotationTool extends JFrame e1.printStackTrace(); } } + geneNames = removeArrayElement(geneNames, predicate.getGeneName()); if(qualifierBuffer.length() > 0) genesUpdated.append(thisFeature.getSystematicName()+ @@ -782,7 +791,11 @@ public class TransferAnnotationTool extends JFrame private static String[] removeArrayElement(final String strArr[], final String str) { if(strArr.length == 1) + { + if(strArr[0].equals(str)) + return null; return strArr; + } String[] newarray = new String[strArr.length - 1]; int count = 0; for (int i = 0; i < strArr.length; i++) @@ -803,9 +816,94 @@ public class TransferAnnotationTool extends JFrame System.arraycopy(newarray, 0, tmparray, 0, count); newarray = tmparray; } - return newarray; } + + /** + * Optionally transfer GO fields with evidence code ISO and link back to + * the original source in the WITH/FROM column. + * @param setEvidenceAndWithFrom + * @param feature + * @param qName + * @param values + * @return + */ + private static StringVector getTransferValues(final boolean setEvidenceAndWithFrom, + final Feature feature, + final String qName, + final StringVector values) + { + if(!setEvidenceAndWithFrom) + return values; + + if(qName.equals("GO") || qName.equals("product")) + { + final StringVector tvalues = new StringVector(); + final String gene = getGeneName(feature); + for (int i = 0; i < values.size(); i++) + { + String val = changeField("evidence=", + "Inferred from Sequence Orthology", + null, values.get(i)); + + if(gene != null) + val = changeField("with=", + "GeneDB:"+gene, "|", val); + tvalues.add(val); + } + return tvalues; + } + return values; + } + + private static String getGeneName(Feature feature) + { + try + { + return + ((GFFStreamFeature)feature.getEmblFeature()).getChadoGene().getGeneUniqueName(); + } + catch(Exception e){} + return null; + } + + /** + * Replace or add the value of a field in a qualifier string + * @param fieldName + * @param newFieldStr + * @param separator + * @param qualStr + * @return + */ + private static String changeField(final String fieldName, + final String newFieldStr, + final String separator, + String qualStr) + { + int idx1 = qualStr.toLowerCase().indexOf(fieldName.toLowerCase()); + int idx2 = qualStr.indexOf(";", idx1); + int len = fieldName.length(); + if(idx2 > idx1 && idx1 > -1) + { + if(separator != null) + qualStr = qualStr.substring(0, idx2) + separator + newFieldStr + + qualStr.substring(idx2); + else + qualStr = qualStr.substring(0, idx1+len) + newFieldStr + + qualStr.substring(idx2); + } + else if(idx1 > -1) + { + if(separator != null) + qualStr = qualStr + separator + newFieldStr; + else + qualStr = qualStr.substring(0, idx1+len) + newFieldStr; + } + else if(!newFieldStr.equals("")) + qualStr = qualStr + ";" + + fieldName + newFieldStr; + return qualStr; + } } class QualifierPanel extends JPanel @@ -835,7 +933,7 @@ class QualifierPanel extends JPanel for(int i = 0; i < qualifiers.size(); i++) { nrows = - addQualifierComponents((Qualifier) qualifiers.get(i), + addQualifierComponents(qualifiers.get(i), qualifierCheckBoxes, c, nrows); } @@ -846,17 +944,17 @@ class QualifierPanel extends JPanel /** * Add a qualifier to the list of transferable annotation - * @param pane * @param qualifier * @param qualifierCheckBoxes * @param c * @param nrows * @return */ - private int addQualifierComponents(final Qualifier qualifier, - final Hashtable<JCheckBox, Vector<JCheckBox>> qualifierCheckBoxes, - final GridBagConstraints c, - int nrows) + private int addQualifierComponents( + final Qualifier qualifier, + final Hashtable<JCheckBox, Vector<JCheckBox>> qualifierCheckBoxes, + final GridBagConstraints c, + int nrows) { if(TransferAnnotationTool.isNonTransferable(qualifier.getName())) return nrows; @@ -887,7 +985,7 @@ class QualifierPanel extends JPanel for(int i=0; i<qualifierValuesCheckBox.size(); i++) { - JCheckBox cb = (JCheckBox) qualifierValuesCheckBox.get(i); + JCheckBox cb = qualifierValuesCheckBox.get(i); cb.setSelected(qualifierNameCheckBox.isSelected()); } } @@ -943,20 +1041,22 @@ class QualifierPanel extends JPanel // set-up qualifier values list qualifierValueBox.setVisible(false); - Vector<JCheckBox> qualifierValuesCheckBox = new Vector<JCheckBox>(); - StringVector values = qualifier.getValues(); + final Vector<JCheckBox> qualifierValuesCheckBox = new Vector<JCheckBox>(); + final StringVector values = qualifier.getValues(); if(values != null) + { for (int i = 0; i < values.size(); i++) { - JCheckBox cb = new JCheckBox((String) values.get(i), + final JCheckBox cb = new JCheckBox(values.get(i), qualifierNameCheckBox.isSelected()); cb.setFont(cb.getFont().deriveFont(Font.ITALIC)); qualifierValueBox.add(cb); qualifierValuesCheckBox.add(cb); } + } return qualifierValuesCheckBox; } - + protected Hashtable<JCheckBox, Vector<JCheckBox>> getQualifierCheckBoxes() { return qualifierCheckBoxes; -- GitLab