Skip to content
Snippets Groups Projects
JamView.java 40.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • tjc's avatar
    tjc committed
        return (int) (seqLength * ( x / getWidth()));
      }
      
      /**
       * Set the panel size based on the number of bases visible
       * and repaint.
       * @param nbasesInView
       */
    
    tjc's avatar
    tjc committed
      private void setZoomLevel(final int nbasesInView)
      {
        this.nbasesInView = nbasesInView;
    
        int start = getBaseAtStartOfView();
        setDisplay(start,start+nbasesInView, null);
    
    tjc's avatar
    tjc committed
        revalidate();
        repaint();
    
    tjc's avatar
    tjc committed
      }
      
      /**
       * Set the ViewPort so it starts at the given base position.
       * @param base
       */
    
    tjc's avatar
    tjc committed
      private void goToBasePosition(int base)
    
    tjc's avatar
    tjc committed
      {
        Point p = jspView.getViewport().getViewPosition();
    
    tjc's avatar
    tjc committed
        String refName = (String) combo.getSelectedItem();
        int seqLength = seqLengths.get(refName);
    
        p.x = (int) ((getPreferredSize().width)*(((float)base-1)/(float)seqLength));
    
    tjc's avatar
    tjc committed
        jspView.getViewport().setViewPosition(p);
      }
    
    tjc's avatar
    tjc committed
      /**
    
       * Set the start and end base positions to display.
       * @param start
       * @param end
       * @param event
    
    tjc's avatar
    tjc committed
       */
    
      public void setDisplay(int start,
                             int end,
                             DisplayAdjustmentEvent event)
    
    tjc's avatar
    tjc committed
      {
    
        this.startBase = start;
        this.endBase   = end;
        
    
    tjc's avatar
    tjc committed
        String refName = (String) combo.getSelectedItem();
        int seqLength = seqLengths.get(refName);
    
    
        double pixPerBase = getPixPerBase(start, end);
        if(pixPerBase*2 > ALIGNMENT_PIX_PER_BASE)
    
    tjc's avatar
    tjc committed
        {
    
    tjc's avatar
    tjc committed
          pixPerBase = ALIGNMENT_PIX_PER_BASE;
    
    tjc's avatar
    tjc committed
          checkBoxSingle.setVisible(false);
    
    tjc's avatar
    tjc committed
          jspView.getVerticalScrollBar().setValue(0);
    
    tjc's avatar
    tjc committed
          jspView.setColumnHeaderView(ruler);
    
          showBaseAlignment = true;
    
    tjc's avatar
    tjc committed
        }
    
    tjc's avatar
    tjc committed
        else if(jspView != null)
    
    tjc's avatar
    tjc committed
        {
          checkBoxSingle.setVisible(true);
    
    tjc's avatar
    tjc committed
          jspView.setColumnHeaderView(null);
    
          showBaseAlignment = false;
    
    tjc's avatar
    tjc committed
        }
    
    tjc's avatar
    tjc committed
        Dimension d = new Dimension();
        d.setSize((seqLength*pixPerBase), 800.d);
        setPreferredSize(d);
    
        goToBasePosition(startBase);
        
        repaint();
        if(event == null || 
           event.getType() == DisplayAdjustmentEvent.SCALE_ADJUST_EVENT)
          revalidate();
        
        this.startBase = -1;
        this.endBase   = -1;
      }
      
      private double getPixPerBase(int start, int end)
      {
        if(feature_display == null)
          return 1000.d/(double)(end-start+1);
        else
          return feature_display.getWidth()/(double)(end-start+1);
    
    tjc's avatar
    tjc committed
      }
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
      /**
       * Return an Artemis entry from a file 
       * @param entryFileName
       * @param entryGroup
       * @return
       * @throws NoSequenceException
       */
      private Entry getEntry(final String entryFileName, final EntryGroup entryGroup) 
                       throws NoSequenceException
      {
        final Document entry_document = DocumentFactory.makeDocument(entryFileName);
        final EntryInformation artemis_entry_information =
          Options.getArtemisEntryInformation();
        
        System.out.println(entryFileName);
        final uk.ac.sanger.artemis.io.Entry new_embl_entry =
          EntryFileDialog.getEntryFromFile(null, entry_document,
                                           artemis_entry_information,
                                           false);
    
        if(new_embl_entry == null)  // the read failed
          return null;
    
        Entry entry = null;
        try
        {
          if(entryGroup.getSequenceEntry() != null)
            bases = entryGroup.getSequenceEntry().getBases();
    
    tjc's avatar
    tjc committed
          
    
    tjc's avatar
    tjc committed
          if(bases == null)
    
    tjc's avatar
    tjc committed
          {
    
    tjc's avatar
    tjc committed
            entry = new Entry(new_embl_entry);
    
    tjc's avatar
    tjc committed
            bases = entry.getBases();
          }
    
    tjc's avatar
    tjc committed
          else
            entry = new Entry(bases,new_embl_entry);
          
          entryGroup.add(entry);
        } 
        catch(OutOfRangeException e) 
        {
          new MessageDialog(null, "read failed: one of the features in " +
              entryFileName + " has an out of range " +
                            "location: " + e.getMessage());
        }
        return entry;
      }
    
      
      private boolean isShowScale()
      {
        return showScale;
      }
    
      public void setShowScale(boolean showScale)
      {
        this.showScale = showScale;
      }
      
      public JScrollPane getJspView()
      {
        return jspView;
      }
    
      public void setFeatureDisplay(FeatureDisplay feature_display)
      {
        this.feature_display = feature_display;
        this.selection = feature_display.getSelection();;
      }
      
      public void setBases(Bases bases)
      {
        this.bases = bases;
      }
      
      /**
       * Remove JScrollPane border
       */
      public void removeBorder()
      {
        Border empty = new EmptyBorder(0,0,0,0);
        jspView.setBorder(empty);
      }
      
      /**
       *  Handle a mouse drag event on the drawing canvas.
       **/
      private void handleCanvasMouseDrag(final MouseEvent event)
      {
        if(event.isShiftDown()) 
          return;
    
    tjc's avatar
    tjc committed
    
    
        String refName = (String) combo.getSelectedItem();
        int seqLength = seqLengths.get(refName);
        float pixPerBase = ((float)getWidth())/(float)(seqLength);
        
        
    
    /*    MarkerRange drag_range = getMarkerRangeFromPosition(event.getPoint());
        selection.setMarkerRange(marker_range);
        if(drag_range == null) 
          return;
    
        final MarkerRange selected_range = getSelection().getMarkerRange();
    
        // if the start and current positions of the drag are not on the
        // same Strand then ignore this event
        if(selected_range != null &&
           drag_range.getStrand() != selected_range.getStrand()) 
          return;
    
        try 
        {
          // user has dragged off the screen so use a marker at position 1
          if(drag_range.getStart().getPosition() < 1) 
            drag_range = new MarkerRange(drag_range.getStrand(), 1, 1);
    
          // user has dragged off the screen so use a marker at position the
          // end of the sequence
          if(drag_range.getEnd().getPosition() > getSequenceLength()) 
            drag_range = new MarkerRange(drag_range.getStrand(),
                                          getSequenceLength(),
                                          getSequenceLength());
        }
        catch(OutOfRangeException e) 
        {
          throw new Error("internal error - unexpected OutOfRangeException");
        }
    
        final boolean start_base_is_visible = baseVisible(drag_range.getStart());
        final boolean end_base_is_visible   = baseVisible(drag_range.getEnd());
    
        if(!start_base_is_visible) 
          makeBaseVisible(drag_range.getStart());
    
        if(!end_base_is_visible) 
          makeBaseVisible(drag_range.getEnd());
    
        // scrolling was necessary so update the visible features vector
        if(!start_base_is_visible || !end_base_is_visible) 
          needVisibleFeatureVectorUpdate();
    
        final MarkerRange new_marker_range;
    
        if(click_range == null) 
          new_marker_range = drag_range;
        else 
          new_marker_range = selected_range.combineRanges(drag_range, true);
    
        getSelection().setMarkerRange(new_marker_range);
    
        repaint();*/
      }
      
      private Selection getSelection()
      {
        return selection;
      }
      
    
    tjc's avatar
    tjc committed
      private class Ruler extends JPanel
    
    tjc's avatar
    tjc committed
      {
    
    tjc's avatar
    tjc committed
        private static final long serialVersionUID = 1L;
    
    tjc's avatar
    tjc committed
        int start;
        int end;
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        public Ruler()
        {
          super();
          setPreferredSize(new Dimension(getPreferredSize().width, 15));
          setBackground(Color.white);
          setFont(getFont().deriveFont(11.f));
        }
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        public void paintComponent(Graphics g)
        {
          super.paintComponent(g);
          Graphics2D g2 = (Graphics2D)g;
          drawBaseScale(g2, start, end, 12);
        }
    
    tjc's avatar
    tjc committed
    
        private void drawBaseScale(Graphics2D g2, int start, int end, int ypos)
        {
          int startMark = (((int)(start/10))*10)+1;
    
          for(int i=startMark; i<end; i+=10)
          {
            int xpos = (i-1-start)*ALIGNMENT_PIX_PER_BASE;
            g2.drawString(Integer.toString(i), xpos, ypos);
            
            xpos+=(ALIGNMENT_PIX_PER_BASE/2);
            g2.drawLine(xpos, ypos+1, xpos, ypos+5);
          }
        }
    
    tjc's avatar
    tjc committed
      }
      
    
      /**
      *
      * Popup menu listener
      *
      */
      class PopupListener extends MouseAdapter
      {
        public void mouseClicked(MouseEvent e)
        {
          JamView.this.requestFocus();
        }
        
        public void mousePressed(MouseEvent e)
        {
          maybeShowPopup(e);
        }
    
        public void mouseReleased(MouseEvent e)
        {
          maybeShowPopup(e);
        }
    
        private void maybeShowPopup(MouseEvent e)
        {
          if(e.isPopupTrigger())
            popup.show(e.getComponent(),
                    e.getX(), e.getY());
        }
      }
     
      
    
    tjc's avatar
    tjc committed
      class SAMRecordComparator implements Comparator<Object>
    
    tjc's avatar
    tjc committed
      {
        public int compare(Object o1, Object o2) 
        {
    
    tjc's avatar
    tjc committed
          SAMRecord pr1 = (SAMRecord) o1;
          SAMRecord pr2 = (SAMRecord) o2;
    
    tjc's avatar
    tjc committed
          
    
    tjc's avatar
    tjc committed
          int cmp = pr1.getReadName().compareTo(pr2.getReadName());
          
          if(cmp == 0)
          {
            if(pr1.getAlignmentStart() < pr2.getAlignmentStart())
              return -1;
            else
              return 1;
          }
          return cmp;
    
    tjc's avatar
    tjc committed
        }
      }
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
      public Dimension getPreferredScrollableViewportSize()
      {
        return getPreferredSize();
      }
    
      public int getScrollableBlockIncrement(Rectangle visibleRect,
          int orientation, int direction)
      {
        if (orientation == SwingConstants.HORIZONTAL)
          return visibleRect.width - maxUnitIncrement;
        else 
          return visibleRect.height - maxUnitIncrement;
      }
    
      public boolean getScrollableTracksViewportHeight()
      {
        return false;
      }
    
      public boolean getScrollableTracksViewportWidth()
      {
        return false;
      }
    
      public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation,
                                            int direction)
      {
      //Get the current position.
        int currentPosition = 0;
        if (orientation == SwingConstants.HORIZONTAL) 
            currentPosition = visibleRect.x;
        else 
            currentPosition = visibleRect.y;
    
        //Return the number of pixels between currentPosition
        //and the nearest tick mark in the indicated direction.
        if (direction < 0)
        {
          int newPosition = currentPosition -
                            (currentPosition / maxUnitIncrement)
                             * maxUnitIncrement;
          return (newPosition == 0) ? maxUnitIncrement : newPosition;
        } 
        else 
        {
          return ((currentPosition / maxUnitIncrement) + 1)
                  * maxUnitIncrement
                  - currentPosition;
        }
      }
    
    tjc's avatar
    tjc committed
      
    
      /**
       * Artemis event notification
       */
      public void displayAdjustmentValueChanged(DisplayAdjustmentEvent event)
      {
        setDisplay(event.getStart(), event.getEnd(), event);
      }
      
    
    tjc's avatar
    tjc committed
      public static void main(String[] args)
      {
        String bam = args[0];
    
    tjc's avatar
    tjc committed
        int nbasesInView = 1000;
    
    tjc's avatar
    tjc committed
        String reference = null;
        
    
    tjc's avatar
    tjc committed
        for(int i=0;i<args.length; i++)
        {
          if(args[i].equals("-a"))
            bam = args[++i];
          else if(args[i].equals("-r"))
            reference = args[++i];
          else if(args[i].equals("-v"))
            nbasesInView = Integer.parseInt(args[++i]);
          else if(args[i].equals("-s"))
            System.setProperty("samtoolDir", args[++i]);
          else if(args[i].startsWith("-h"))
          { 
            System.out.println("-h\t show help");
            
            System.out.println("-a\t BAM/SAM file to display");
            System.out.println("-r\t reference file (optional)");
            System.out.println("-v\t number of bases to display in the view (optional)");
            System.out.println("-s\t samtool directory");
    
            System.exit(0);
          }
        }
    
    
    tjc's avatar
    tjc committed
        final JamView view = new JamView(bam, reference, nbasesInView);
    
    tjc's avatar
    tjc committed
        JFrame frame = new JFrame("JAM");
    
    tjc's avatar
    tjc committed
        
        frame.addWindowFocusListener(new WindowFocusListener()
        {
          public void windowGainedFocus(WindowEvent e)
          {
            view.requestFocus();
          }
          public void windowLostFocus(WindowEvent e){}
        });
        
    
        view.addJamToPanel((JPanel)frame.getContentPane(), true);
    
    tjc's avatar
    tjc committed
        frame.pack();
    
    tjc's avatar
    tjc committed
        view.jspView.getVerticalScrollBar().setValue(
            view.jspView.getVerticalScrollBar().getMaximum());
    
        frame.setVisible(true);
    
    tjc's avatar
    tjc committed
      }
    
    
      public void selectionChanged(SelectionChangeEvent event)
      {
        repaint();
      }
    
    tjc's avatar
    tjc committed
    }