/*
* EuroCarbDB, a framework for carbohydrate bioinformatics
*
* Copyright (c) 2006-2009, Eurocarb project, or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
* A copy of this license accompanies this distribution in the file LICENSE.txt.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* Last commit: $Rev: 1930 $ by $Author: david@nixbioinf.org $ on $Date:: 2010-07-29 #$
*/
/**
@author Alessio Ceroni (a.ceroni@imperial.ac.uk)
*/
package org.eurocarbdb.application.glycoworkbench.plugin;
import org.eurocarbdb.application.glycoworkbench.plugin.reporting.*;
import org.eurocarbdb.application.glycoworkbench.plugin.grammar.*;
import org.eurocarbdb.application.glycoworkbench.*;
import org.eurocarbdb.application.glycanbuilder.*;
import org.pushingpixels.flamingo.api.common.icon.ResizableIcon;
import org.pushingpixels.flamingo.api.ribbon.JRibbonBand;
import org.pushingpixels.flamingo.api.ribbon.RibbonTask;
import java.util.*;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import java.awt.event.*;
public class ReportingPlugin implements Plugin, ActionListener {
protected PluginManager theManager = null;
protected GlycoWorkbench theApplication = null;
protected GlycanWorkspace theWorkspace = null;
protected Grammar theGrammar = null;
protected AnnotationReportOptions theAnnotationReportOptions = new AnnotationReportOptions();
protected ProfilesComparisonReportOptions theProfilesComparisonReportOptions = new ProfilesComparisonReportOptions();
protected HashMap<AnnotationReportDocument,AnnotationReportEditor> openAnnotationReportEditors = new HashMap<AnnotationReportDocument,AnnotationReportEditor>();
public ReportingPlugin(GlycoWorkbench bench) {
this.theApplication=bench;
try {
theGrammar = new Grammar("/conf/sim_human_ng_grammar.gwg",false);
}
catch(Exception e) {
LogUtils.report(e);
}
}
public void init() {
if( theWorkspace!=null ) {
theAnnotationReportOptions.retrieve(theWorkspace.getConfiguration());
theProfilesComparisonReportOptions.retrieve(theWorkspace.getConfiguration());
}
}
public void exit() {
if( theWorkspace!=null ) {
theAnnotationReportOptions.store(theWorkspace.getConfiguration());
theProfilesComparisonReportOptions.store(theWorkspace.getConfiguration());
}
}
public String getName() {
return "Reporting";
}
public int getMnemonic() {
return KeyEvent.VK_R;
}
//See future plans
public ResizableIcon getResizableIcon(){
return FileUtils.getThemeManager().getResizableIcon("report", ICON_SIZE.L3).getResizableIcon();
}
public ImageIcon getIcon() {
return FileUtils.defaultThemeManager.getImageIcon("report");
}
public int getViewPosition(String view) {
return PluginManager.VIEW_RIGHT;
}
public java.awt.Component getLeftComponent() {
return null;
}
public java.awt.Component getRightComponent() {
return null;
}
public java.awt.Component getBottomComponent() {
return null;
}
public Collection<String> getViews() {
Vector<String> views = new Vector<String>();
return views;
}
public Collection<GlycanAction> getActions() {
Vector<GlycanAction> actions = new Vector<GlycanAction>();
actions.add(new GlycanAction("reportAnnotations",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Create a report of the annotations",KeyEvent.VK_C,"",this));
actions.add(new GlycanAction("openAnnotationsReport",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Open a previous annotations report",KeyEvent.VK_O,"",this));
actions.add(null);
actions.add(new GlycanAction("deisotope",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Deisotope the annotated peaklist using the annotations",KeyEvent.VK_D,"",this));
actions.add(new GlycanAction("reportProfilesComparison",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Create a report comparing different profiles",KeyEvent.VK_P,"",this));
return actions;
}
public Collection<GlycanAction> getToolbarActions() {
return new Vector<GlycanAction>();
}
public Collection<GlycanAction> getObjectActions(Object prototype, ActionListener al) {
Vector<GlycanAction> actions = new Vector<GlycanAction>();
return actions;
}
public void setManager(PluginManager manager) {
theManager = manager;
}
public void setApplication(GlycoWorkbench application) {
theApplication = application;
}
public void setWorkspace(GlycanWorkspace workspace) {
theWorkspace = workspace;
if( theWorkspace!=null ) {
theAnnotationReportOptions.retrieve(theWorkspace.getConfiguration());
theProfilesComparisonReportOptions.retrieve(theWorkspace.getConfiguration());
}
}
public PluginManager getManager() {
return theManager;
}
public GlycoWorkbench getApplication() {
return theApplication;
}
public GlycanWorkspace getWorkspace() {
return theWorkspace;
}
public AnnotationReportOptions getAnnotationReportOptions() {
return theAnnotationReportOptions;
}
public void show(String view) throws Exception {
throw new Exception("Invalid view: " + view);
}
public boolean runAction(String action) throws Exception{
return runAction(action,theWorkspace.getPeakList());
}
public boolean runAction(String action, Object params) throws Exception {
if( action.equals("reportAnnotations") )
return reportAnnotations();
if( action.equals("reportProfilesComparison") )
return reportProfilesComparison();
if( action.equals("deisotope") )
return deisotopeAnnotatedPeakList(false);
if( action.equals("openAnnotationsReport") )
return openAnnotationsReport();
throw new Exception("Invalid action: " + action);
}
public void actionPerformed(ActionEvent e) {
try {
runAction(GlycanAction.getAction(e));
}
catch(Exception ex) {
LogUtils.report(ex);
}
}
public void updateViews() {
}
public void updateMasses() {
}
//------------
// ACTIONS
public boolean reportAnnotations() {
if( theWorkspace.getAnnotatedPeakList().size()>0 ) {
AnnotationReportChoiceDialog dlg = new AnnotationReportChoiceDialog(theApplication,theWorkspace,theAnnotationReportOptions);
dlg.setVisible(true);
if( dlg.getReturnStatus().equals("OK") ) {
AnnotationReportDocument doc = new AnnotationReportDocument(dlg.getStartMZ(),dlg.getEndMZ(), dlg.getPeakData(),dlg.getParentStructure(),dlg.getPeakAnnotationCollection(),theAnnotationReportOptions,theWorkspace.getGraphicOptions());
theWorkspace.addAnnotationReport(doc);
showAnnotationsReport(doc,true);
return true;
}
}
else
javax.swing.JOptionPane.showMessageDialog(theApplication,"There are not annotation to display.", "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
return false;
}
public boolean reportProfilesComparison() {
ProfilesComparisonReportDialog dlg = new ProfilesComparisonReportDialog(theApplication,theWorkspace,theProfilesComparisonReportOptions);
dlg.setVisible(true);
if( dlg.getReturnStatus().equals("OK") && dlg.getFirstGroup().size()>0 ) {
theApplication.haltInteractions();
try {
ProfilesComparisonReportDocument doc = new ProfilesComparisonReportDocument(dlg.getFirstGroup(),dlg.getSecondGroup(),dlg.getScanNameMap(),theGrammar,theProfilesComparisonReportOptions);
theApplication.restoreInteractions();
if( theProfilesComparisonReportOptions.REPRESENTATION == theProfilesComparisonReportOptions.TABLE )
new ProfilesComparisonReportTableFrame(theApplication,doc,theProfilesComparisonReportOptions).setVisible(true);
else
new ProfilesComparisonReportChartFrame(theApplication,doc,theProfilesComparisonReportOptions).setVisible(true);
return true;
}
catch(Exception e) {
LogUtils.report(e);
theApplication.restoreInteractions();
return false;
}
}
return false;
}
public boolean openAnnotationsReport() {
AnnotationReportDocument doc = new AnnotationReportDocument();
if( theApplication.onOpen(null,doc,false) )
showAnnotationsReport(doc,false);
return true;
}
public boolean showAnnotationsReport(AnnotationReportDocument doc, boolean init) {
if( doc!=null ) {
AnnotationReportEditor are = openAnnotationReportEditors.get(doc);
if( are==null || !are.isVisible() ) {
are = new AnnotationReportEditor(theApplication,this,doc,init);
openAnnotationReportEditors.put(doc,are);
are.setVisible(true);
}
return true;
}
return false;
}
public boolean deisotopeAnnotatedPeakList(boolean show_all) {
if( theWorkspace.getAnnotatedPeakList().size()==0 ) {
JOptionPane.showMessageDialog(theApplication, "The annotated peaklis is empty", "Error", JOptionPane.ERROR_MESSAGE);
return false;
}
if( JOptionPane.showConfirmDialog(theApplication, "Attention, the method will compute invalid intensities if the peaklist has already been deisotoped. Do you still want to continue?", null, JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION ) {
return false;
}
try {
// retrieve compositions
TreeMap<Peak,HashSet<Molecule>> data = new TreeMap<Peak,HashSet<Molecule>>();
for( PeakAnnotationMultiple pam : theWorkspace.getAnnotatedPeakList().getAnnotations() ) {
Peak p = pam.getPeak();
HashSet<Molecule> compositions = new HashSet<Molecule>();
for( Vector<Annotation> annotations : pam.getAnnotations() ) {
for( Annotation annotation : annotations ) {
if( !annotation.isEmpty() )
compositions.add(annotation.getFragmentEntry().fragment.computeIon());
}
}
data.put(p.clone(),compositions);
}
// deisotope
for( Map.Entry<Peak,HashSet<Molecule>> e : data.entrySet() ) {
Peak p = e.getKey();
HashSet<Molecule> compositions = e.getValue();
if( p.getIntensity()==0. || compositions.size()==0 )
continue;
// compute isotope curves
Vector<double[][]> all_curves = new Vector<double[][]>();
for( Molecule m : compositions ) {
double[][] curve = MSUtils.getIsotopesCurve(1,m,show_all);
MSUtils.adjust(curve,p.getMZ(),p.getIntensity());
all_curves.add(curve);
}
double[][] avg_curve = MSUtils.average(all_curves,show_all);
// adjust intensity for this peak to the total intensity for this signal
double sum = 0.;
for( int i=0; i<avg_curve[0].length; i++ )
sum += avg_curve[1][i];
p.setIntensity(sum);
// remove isotopes from the following peaks
int i=1;
int no_isotopes = avg_curve[0].length;
double mass_tol = (show_all) ?0.0001 :0.5;
for( Map.Entry<Peak,HashSet<Molecule>> t : data.tailMap(p).entrySet() ) {
Peak tp = t.getKey();
if( i==no_isotopes )
break;
// search matching peak
for( ; i<no_isotopes && tp.getMZ()>(avg_curve[0][i]+mass_tol); i++);
// remove isotope intensity if matching
if( i<no_isotopes && Math.abs(tp.getMZ()-avg_curve[0][i])<=mass_tol )
tp.setIntensity(Math.max(0.,tp.getIntensity()-avg_curve[1][i]));
}
}
// set new peak intensities for the annotated peaklist
theWorkspace.getAnnotatedPeakList().updatePeaks(data.keySet());
if( JOptionPane.showConfirmDialog(theApplication, "Do you want to update the intensities in the peaklist as well?", null, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION ) {
theWorkspace.getPeakList().updatePeaks(data.keySet());
}
return true;
}
catch(Exception ex) {
LogUtils.report(ex);
return false;
}
}
@Override
public void completeSetup() {
// TODO Auto-generated method stub
}
@Override
public List<JRibbonBand> getBandsForToolBar() {
// TODO Auto-generated method stub
return null;
}
@Override
public RibbonTask getRibbonTask() {
// TODO Auto-generated method stub
return null;
}
}