diff --git a/uk/ac/sanger/artemis/circular/digest/CircularGenomeController.java b/uk/ac/sanger/artemis/circular/digest/CircularGenomeController.java index cf05244fabc4b73852c6326eb2a1039078d35a82..f7e854f25decaf52c4aef3b2a977a025d4e05a04 100644 --- a/uk/ac/sanger/artemis/circular/digest/CircularGenomeController.java +++ b/uk/ac/sanger/artemis/circular/digest/CircularGenomeController.java @@ -124,7 +124,7 @@ public class CircularGenomeController final DNADraw dna = Utils.createDNADrawFromReportDetails(rd, entryGroup); final InSilicoGelPanel inSilicoGelPanel = - new InSilicoGelPanel(rd.length, rd.cutSites, dna.getHeight()); + new InSilicoGelPanel(rd.length, rd.cutSites, dna.getHeight(), output); MouseMotionListener mouseMotionListener = new MouseMotionAdapter() { diff --git a/uk/ac/sanger/artemis/circular/digest/CutSite.java b/uk/ac/sanger/artemis/circular/digest/CutSite.java index cc6c63618dd3611544990f505f943f7986842cfc..350a2e72558598b50f138c6296bbf774e1acaf96 100644 --- a/uk/ac/sanger/artemis/circular/digest/CutSite.java +++ b/uk/ac/sanger/artemis/circular/digest/CutSite.java @@ -20,6 +20,7 @@ package uk.ac.sanger.artemis.circular.digest; public class CutSite { + private String enzymeName; private int fivePrime; private int threePrime; private int fivePrimeRev; @@ -27,10 +28,12 @@ public class CutSite private boolean forward = false; private boolean highlighted = false; - CutSite(String fivePrimeStr, String threePrimeStr, + CutSite(final String enzymeName, + String fivePrimeStr, String threePrimeStr, String fivePrimeRevStr, String threePrimeRevStr, String strand) { + this.enzymeName = enzymeName; this.fivePrime = Integer.parseInt(fivePrimeStr); this.threePrime = Integer.parseInt(threePrimeStr); if(!fivePrimeRevStr.equals(".")) @@ -76,4 +79,9 @@ public class CutSite { this.highlighted = highlighted; } + + public String getEnzymeName() + { + return enzymeName; + } } diff --git a/uk/ac/sanger/artemis/circular/digest/EmbossTableParser.java b/uk/ac/sanger/artemis/circular/digest/EmbossTableParser.java index 4c02fd5633d12c13d3786cf0af919ee85aea71bc..6540ecc0a7cba14a23f45d0032db739c0f0a2e23 100644 --- a/uk/ac/sanger/artemis/circular/digest/EmbossTableParser.java +++ b/uk/ac/sanger/artemis/circular/digest/EmbossTableParser.java @@ -55,7 +55,8 @@ public class EmbossTableParser if ("Start".equals(parts[0])) continue; - CutSite cutSite = new CutSite(parts[5], parts[6], parts[7], parts[8], parts[2]); + CutSite cutSite = new CutSite( + parts[3], parts[5], parts[6], parts[7], parts[8], parts[2]); list.add(cutSite); } return list; diff --git a/uk/ac/sanger/artemis/circular/digest/InSilicoGelPanel.java b/uk/ac/sanger/artemis/circular/digest/InSilicoGelPanel.java index ad1f059824c258093877d6cb4f796a012535fd31..311e2c706858fa71bf1e404e22eddbb9d8f59620 100644 --- a/uk/ac/sanger/artemis/circular/digest/InSilicoGelPanel.java +++ b/uk/ac/sanger/artemis/circular/digest/InSilicoGelPanel.java @@ -28,14 +28,22 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.text.DecimalFormat; +import java.text.NumberFormat; import java.util.List; import java.util.Vector; import javax.swing.ButtonGroup; +import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; +import uk.ac.sanger.artemis.components.FileViewer; + public class InSilicoGelPanel extends JPanel implements ActionListener { @@ -48,13 +56,21 @@ public class InSilicoGelPanel extends JPanel private int MIN_FRAGMENT_LENGTH = Integer.MAX_VALUE; private boolean drawLog = false; private JPopupMenu popup; + private File restrictOutput; - + /** + * @param genomeLength + * @param cutSites + * @param panelHeight + * @param restrictOutput + */ public InSilicoGelPanel(final int genomeLength, final List<CutSite> cutSites, - final int panelHeight) + final int panelHeight, + final File restrictOutput) { - this.panelHeight = panelHeight; + this.panelHeight = panelHeight; + this.restrictOutput = restrictOutput; setBackground(Color.white); setPreferredSize(new Dimension(160,panelHeight)); @@ -70,7 +86,7 @@ public class InSilicoGelPanel extends JPanel else { len = cutSite.getFivePrime()-lastSite; - System.out.println(i+" **** "+len.toString()); + FragmentBand band = new FragmentBand(); band.genomeFragmentLength = len; band.bandCutSite = cutSite; @@ -90,7 +106,7 @@ public class InSilicoGelPanel extends JPanel genomeFragments.add(band); if(len > MAX_FRAGMENT_LENGTH) MAX_FRAGMENT_LENGTH = len; - System.out.println(len.toString()); + //System.out.println(len.toString()); MouseListener popupListener = new PopupListener(); addMouseListener(popupListener); @@ -106,6 +122,10 @@ public class InSilicoGelPanel extends JPanel group.add(linearScale); group.add(logScale); linearScale.setSelected(true); + + JMenuItem showCutSites = new JMenuItem("Show cut site details"); + popup.add(showCutSites); + showCutSites.addActionListener(this); } /** @@ -135,7 +155,7 @@ public class InSilicoGelPanel extends JPanel else y = gelHeight+marginHeight-(int)( ((float)(gelHeight)/ (float)(MAX_FRAGMENT_LENGTH-MIN_FRAGMENT_LENGTH)) * fragmentLength ); - + if(!genomeFragments.get(i).bandCutSite.isHighlighted()) { g2D.setStroke(stroke); @@ -143,11 +163,50 @@ public class InSilicoGelPanel extends JPanel } else { + g2D.setColor(Color.black); + g2D.drawString(genomeFragments.get(i).bandCutSite.getEnzymeName(), + marginWidth+marginWidth+2, y); g2D.setStroke(stroke2); g2D.setColor(Color.yellow); } g2D.drawLine(marginWidth, y, marginWidth+marginWidth, y); } + + drawScale(g2D, stroke,gelHeight); + } + + /** + * Draw the fragment length scale + * @param g2D + * @param stroke + * @param gelHeight + */ + private void drawScale(Graphics2D g2D, BasicStroke stroke, int gelHeight) + { + g2D.setColor(Color.black); + g2D.setStroke(stroke); + NumberFormat formatter = new DecimalFormat("#0.0"); + + int nscale = 8; + if(isDrawLog()) + nscale = 5; + + float range = (MAX_FRAGMENT_LENGTH-MIN_FRAGMENT_LENGTH)/(float)nscale; + for(int i=0;i<nscale+1; i++) + { + float length = MIN_FRAGMENT_LENGTH+(range*i); + + int y; + if(isDrawLog()) + y = getLogValue((int)length, marginHeight, gelHeight); + else + y = gelHeight+marginHeight-(int)( ((float)(gelHeight)/ + (float)(MAX_FRAGMENT_LENGTH-MIN_FRAGMENT_LENGTH)) * length ); + + g2D.drawLine(marginWidth, y, marginWidth-10, y); + + g2D.drawString(formatter.format(length/1000)+"kb",0,y); + } } private static final double LOG10SCALE = 1.d/Math.log(10); @@ -206,11 +265,34 @@ public class InSilicoGelPanel extends JPanel public void actionPerformed(ActionEvent e) { - JRadioButtonMenuItem radioButton = (JRadioButtonMenuItem)e.getSource(); - if(radioButton.isSelected()) + if (e.getSource() instanceof JRadioButtonMenuItem) { - setDrawLog(radioButton.getText().startsWith("Log")); - repaint(); + JRadioButtonMenuItem radioButton = (JRadioButtonMenuItem) e.getSource(); + if (radioButton.isSelected()) + { + setDrawLog(radioButton.getText().startsWith("Log")); + repaint(); + } + } + else + { + final FileViewer viewer = new FileViewer( + restrictOutput.getName(), true, false); + BufferedReader br; + try + { + br = new BufferedReader(new FileReader(restrictOutput)); + + StringBuffer buff = new StringBuffer(); + String line; + while ((line = br.readLine()) != null) + buff.append(line + "\n"); + viewer.getTextPane().setText(buff.toString()); + } + catch (Exception e2) + { + e2.printStackTrace(); + } } } } \ No newline at end of file diff --git a/uk/ac/sanger/artemis/circular/digest/Utils.java b/uk/ac/sanger/artemis/circular/digest/Utils.java index 0740ee24c55d40fda310423b3e0fb845a97fbf68..fd19e72fd3b6c2ff2a9adc4d9c1f9dbdc5ce3cbd 100644 --- a/uk/ac/sanger/artemis/circular/digest/Utils.java +++ b/uk/ac/sanger/artemis/circular/digest/Utils.java @@ -140,10 +140,7 @@ public class Utils counter++; continue; } - - //circularFeature = createFeature(lastCutPosFwd, cutSite.getEnd(), counter, sequenceLength); - //dna.addFeatureToTrack(circularFeature, forward, false); - //System.out.println(lastCutPosFwd+".."+cutSite.getEnd()+"="+(cutSite.getEnd()-lastCutPosFwd)); + addFeature(lastCutPos, cutSite.getFivePrime(), counter, newEntry, dna, cutSite.isForward()); lastCutPos = cutSite.getFivePrime(); @@ -168,8 +165,17 @@ public class Utils return dna; } + /** + * Add a new feature to the entry with the given coordinates + * @param coord1 + * @param coord2 + * @param counter + * @param newEntry + * @param dna + * @param isForward + */ private static void addFeature(int coord1, int coord2, - int counter, Entry newEntry, + int counter, Entry entry, DNADraw dna, boolean isForward) { String colour; @@ -184,8 +190,7 @@ public class Utils { QualifierVector qualifiers = new QualifierVector(); qualifiers.add(new Qualifier("colour",colour)); - final MarkerRange r; - + final MarkerRange r; if(isForward) qualifiers.add(new Qualifier("note","plus")); @@ -200,18 +205,16 @@ public class Utils dna.getArtemisEntryGroup().getSequenceEntry().getBases().getReverseStrand(), coord1,coord2);*/ - int len = r.getCount(); + //int len = r.getCount(); uk.ac.sanger.artemis.io.Feature f = new uk.ac.sanger.artemis.io.EmblStreamFeature( new Key("misc_feature"), r.createLocation(), qualifiers); - newEntry.add(new uk.ac.sanger.artemis.Feature(f), false); + entry.add(new uk.ac.sanger.artemis.Feature(f), false); - if(!isForward) - { - System.out.println(counter+" "+coord1+".."+coord2+" "+f.getLocation().toStringShort()); - } + //if(!isForward) + // System.out.println(counter+" "+coord1+".."+coord2+" "+f.getLocation().toStringShort()); } catch (Exception e) {