From: <tho...@us...> - 2008-08-26 12:22:31
|
Revision: 12091 http://cdk.svn.sourceforge.net/cdk/?rev=12091&view=rev Author: thomaskuhn Date: 2008-08-26 12:22:27 +0000 (Tue, 26 Aug 2008) Log Message: ----------- Add a new worker and the corresponding actions. This worker extracts the molecule id's from a selected cluster or class from an ART2A classification result Added Paths: ----------- cdk-taverna/trunk/src/main/java/org/openscience/cdk/applications/taverna/qsar/model/ART2AClassificator/tools/GetMoleculeIDsForGivenClasses.java cdk-taverna/trunk/src/main/java/org/openscience/cdk/applications/taverna/qsar/model/ART2AClassificator/tools/action/GetMoleculeIDsForGivenClassesAction.java Added: cdk-taverna/trunk/src/main/java/org/openscience/cdk/applications/taverna/qsar/model/ART2AClassificator/tools/GetMoleculeIDsForGivenClasses.java =================================================================== --- cdk-taverna/trunk/src/main/java/org/openscience/cdk/applications/taverna/qsar/model/ART2AClassificator/tools/GetMoleculeIDsForGivenClasses.java (rev 0) +++ cdk-taverna/trunk/src/main/java/org/openscience/cdk/applications/taverna/qsar/model/ART2AClassificator/tools/GetMoleculeIDsForGivenClasses.java 2008-08-26 12:22:27 UTC (rev 12091) @@ -0,0 +1,235 @@ +/* $RCSfile$ + * $Author: $ + * $Date: $ + * $Revision: $ + * + * Copyright (C) 2008 by Thomas Kuhn <tho...@us...> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * All we ask is that proper credit is given for our work, which includes + * - but is not limited to - adding the above copyright notice to the beginning + * of your source code files, and to any copyright notice that you may distribute + * with programs based on this work. + * + * 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. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +package org.openscience.cdk.applications.taverna.qsar.model.ART2AClassificator.tools; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.xml.stream.XMLStreamReader; + +import org.embl.ebi.escience.baclava.DataThing; +import org.embl.ebi.escience.scufl.DuplicatePortNameException; +import org.embl.ebi.escience.scufl.InputPort; +import org.embl.ebi.escience.scufl.OutputPort; +import org.embl.ebi.escience.scufl.PortCreationException; +import org.embl.ebi.escience.scufl.XScufl; +import org.jdom.Element; +import org.openscience.cdk.applications.art2aClassification.Art2aClassificator; +import org.openscience.cdk.applications.taverna.LocalWorkerCDK; +import org.openscience.cdk.applications.taverna.io.XMLFileIO; +import org.openscience.cdk.applications.taverna.scuflworkers.cdk.CDKLocalWorkerWithPorts; +import org.openscience.cdk.applications.taverna.scuflworkers.cdk.CDKProcessor; +import org.openscience.cdk.applications.taverna.scuflworkers.cdk.XMLExtensible; + +import uk.ac.soton.itinnovation.taverna.enactor.entities.TaskExecutionException; + +/** + * Class which implements a local worker for the cdk-taverna project. + * This worker extracts the molecule id's from the corresponding object of vectors which are within a given class number of an ART2A classification result. + * @author Thomas Kuhn + * + */ +public class GetMoleculeIDsForGivenClasses implements LocalWorkerCDK, CDKLocalWorkerWithPorts, XMLExtensible{ + +// Region: class variables + + private static final String[] inputNames = new String[] { "clasNnumber", "fileName" }; + private static final String[] outputNames = new String[] { "moleculeIDs", "Comment" }; + private List<String> fileNames = new ArrayList<String>(); + + // Region: XML tags/attributes + + private static final String EXTENSIONS = "extensions"; + private static final String GETMOLECULEIDSFORGIVENCLASSES = "GetMoleculeIDsForGivenClasses"; + private static final String FILENAMES = "filenames"; + private static final String FILENAMELIST = "filenamelist"; + private static final String FILENAME = "filename"; + + // End of region + + // End of region + + // Region: public methods + + // Region: get / set properties + + /** + * Returns the current file names + * @return filenames + */ + public List<String> getFileNames() { + return this.fileNames; + } + /** + * Add the file name to the file name list + * @param fileName file name of the file which should be loaded1 + */ + public void addFileName(String fileName){ + this.fileNames.add(fileName); + } + + // End of region + + // Region: input and output definition + + public String[] inputNames() { + return inputNames; + } + public String[] inputTypes() { + return new String[] { LocalWorkerCDK.STRING, LocalWorkerCDK.STRING_ARRAY }; + } + + public String[] outputNames() { + return outputNames; + } + public String[] outputTypes() { + return new String[] {LocalWorkerCDK.STRING_ARRAY, LocalWorkerCDK.STRING_ARRAY}; + } + + public List<InputPort> inputPorts(CDKProcessor processor) throws DuplicatePortNameException, PortCreationException { + List<InputPort> input = new ArrayList<InputPort>(); + InputPort inPort; + for (int i = 0; i < inputNames.length; i++) { + inPort = new InputPort(processor, inputNames[i]); + inPort.setSyntacticType(inputTypes()[i]); + input.add(inPort); + } + return input; + } + public List<OutputPort> outputPorts(CDKProcessor processor) throws DuplicatePortNameException, PortCreationException { + List<OutputPort> output = new ArrayList<OutputPort>(); + OutputPort outPort; + for (int i = 0; i < outputNames.length; i++) { + outPort = new OutputPort(processor, outputNames[i]); + outPort.setSyntacticType(outputTypes()[i]); + output.add(outPort); + } + return output; + } + + // End of region + + // Region: local worker execution + /** + * This worker extracts the molecule id's from the corresponding object of vectors which are within a given class number of an ART2A classification result. + */ + @SuppressWarnings("unchecked") + public Map<String, DataThing> execute(Map<String, DataThing> inputs) throws TaskExecutionException { + List<String> fileNamesList = new ArrayList<String>(); + String classNumbers = null; + List<String> comment = new ArrayList<String>(); + List<String> moleculeIDs = new ArrayList<String>(1000); + Map<String, DataThing> outputs = new HashMap<String, DataThing>(); + if(inputs.get(inputNames[0]) != null) { + classNumbers = (String)((DataThing)(inputs.get(inputNames[0]))).getDataObject(); + } + else { + comment.add("no class number in list"); + outputs.put(outputNames[0], new DataThing(comment)); + return outputs; + } + if(inputs.get(inputNames[1]) != null) { + fileNamesList = (List<String>)((DataThing)(inputs.get(inputNames[1]))).getDataObject(); + } + if (this.fileNames != null && this.fileNames.size() != 0) { + fileNamesList.addAll(this.fileNames); + } + if (fileNamesList == null || fileNamesList.isEmpty()){ + comment.add("no entry in list"); + outputs.put(outputNames[0], new DataThing(comment)); + return outputs; + } + try { + XMLStreamReader xmlReader; + Art2aClassificator classificator; + XMLFileIO xmlFileIO = new XMLFileIO(); + List<Object> correspontingObjects; + for (String fileName : fileNamesList) { + xmlReader = xmlFileIO.getXMLStreamReaderWithCompression(fileName); + xmlReader.next(); + classificator = new Art2aClassificator(xmlReader, true); + xmlReader.close(); + xmlFileIO.closeXMLStreamReader(); + + correspontingObjects = classificator.getCorrespondingObjectsOfClass(Integer.valueOf(classNumbers)); + for (Object correspondingObject : correspontingObjects) { + if (correspondingObject instanceof Integer) { + Integer moleculeID = (Integer) correspondingObject; + moleculeIDs.add(String.valueOf(moleculeID)); + } + } + } + outputs.put(outputNames[0],new DataThing(moleculeIDs)); + } catch (Exception exception) { + throw new TaskExecutionException(exception); + } + outputs.put(outputNames[1], new DataThing(comment)); + return outputs; + } + + // End of region + + // Region: XML processing methods + @SuppressWarnings("unchecked") + public void consumeXML(Element element) { + Element ele = element.getChild(GETMOLECULEIDSFORGIVENCLASSES, XScufl.XScuflNS); + if (ele == null) { + return; + } + Element fileNames = ele.getChild(FILENAMELIST, XScufl.XScuflNS); + for (Iterator<Element> iterator = fileNames.getChildren(FILENAMES, XScufl.XScuflNS).iterator(); iterator.hasNext();) { + Element elem = (Element) iterator.next(); + if (elem.getAttribute(FILENAME, XScufl.XScuflNS) != null) { + this.addFileName(elem.getAttribute(FILENAME, XScufl.XScuflNS).getValue()); + } + } + + } + public Element provideXML() { + Element extensions = new Element(EXTENSIONS, XScufl.XScuflNS); + Element insertElement = new Element(GETMOLECULEIDSFORGIVENCLASSES, XScufl.XScuflNS); + Element fileNames = new Element(FILENAMELIST, XScufl.XScuflNS); + Element fileName; + for (Iterator<String> iterator = this.fileNames.iterator(); iterator.hasNext();) { + String name = iterator.next(); + fileName = new Element(FILENAMES, XScufl.XScuflNS); + fileName.setAttribute(FILENAME, name, XScufl.XScuflNS); + fileNames.addContent(fileName); + } + insertElement.addContent(fileNames); + extensions.addContent(insertElement); + return extensions; + } + + + + // End of region + + // End of region +} \ No newline at end of file Added: cdk-taverna/trunk/src/main/java/org/openscience/cdk/applications/taverna/qsar/model/ART2AClassificator/tools/action/GetMoleculeIDsForGivenClassesAction.java =================================================================== --- cdk-taverna/trunk/src/main/java/org/openscience/cdk/applications/taverna/qsar/model/ART2AClassificator/tools/action/GetMoleculeIDsForGivenClassesAction.java (rev 0) +++ cdk-taverna/trunk/src/main/java/org/openscience/cdk/applications/taverna/qsar/model/ART2AClassificator/tools/action/GetMoleculeIDsForGivenClassesAction.java 2008-08-26 12:22:27 UTC (rev 12091) @@ -0,0 +1,155 @@ +/* $RCSfile$ + * $Author: egonw $ + * $Date: 2008-05-05 12:58:11 +0200 (Mo, 05 Mai 2008) $ + * $Revision: 10819 $ + * + * Copyright (C) 2008 by Thomas Kuhn <tho...@us...> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * All we ask is that proper credit is given for our work, which includes + * - but is not limited to - adding the above copyright notice to the beginning + * of your source code files, and to any copyright notice that you may distribute + * with programs based on this work. + * + * 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. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +package org.openscience.cdk.applications.taverna.qsar.model.ART2AClassificator.tools.action; + +import java.awt.Dimension; +import java.io.File; +import java.util.Iterator; + +import javax.swing.ImageIcon; +import javax.swing.JComponent; +import javax.swing.JFileChooser; +import javax.swing.JFrame; + +import org.embl.ebi.escience.scufl.Processor; +import org.embl.ebi.escience.scuflui.TavernaIcons; +import org.openscience.cdk.applications.taverna.actions.AbstractCDKProcessorAction; +import org.openscience.cdk.applications.taverna.qsar.model.ART2AClassificator.tools.GetMoleculeIDsForGivenClasses; +import org.openscience.cdk.applications.taverna.scuflworkers.cdk.CDKProcessor; +/** + * This class handles the action of the Get Molecule IDs for given classes. It provides a filechooser dialog to choose the classification result file + * @author Thomas Kuhn + */ +public class GetMoleculeIDsForGivenClassesAction extends AbstractCDKProcessorAction { + private String descriptionAdder = ""; + + /* (non-Javadoc) + * @see org.embl.ebi.escience.scuflui.actions.AbstractProcessorAction#getComponent(org.embl.ebi.escience.scufl.Processor) + */ + @Override + public JComponent getComponent(Processor processor) { + if (!(processor instanceof CDKProcessor)) { + return null; + } + JFileChooser fileChooser = new JFileChooser(); + CDKProcessor proc = (CDKProcessor) processor; + final GetMoleculeIDsForGivenClasses worker = (GetMoleculeIDsForGivenClasses) proc.getWorker(); + boolean fileSearch = true; + try { + String fileName = null; + fileChooser.setMultiSelectionEnabled(true); + while (fileSearch) { + if (worker.getFileNames() != null && worker.getFileNames().size() != 0) { + fileName = worker.getFileNames().get(0); + } + if (fileName != null && fileName.length() > 0) { + fileChooser.setCurrentDirectory(new java.io.File(fileName)); + } + // Is true if the user selects a file within the filechooser + fileChooser.setMultiSelectionEnabled(true); + if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { + File[] files = fileChooser.getSelectedFiles(); + for (int i = 0; i < files.length; i++) { + worker.addFileName(files[i].getAbsolutePath()); + } + fileName = fileChooser.getSelectedFiles()[0].getAbsolutePath(); + fileSearch = false; + // Is true if the is in an format which is supported by the cdk-taverna project + } else { + fileSearch = false; + } + } + } catch (Exception e) { + return null; + } + // TODO Don't give null back!! Change this! + return null; + } + + /* (non-Javadoc) + * @see org.embl.ebi.escience.scuflui.spi.ProcessorActionSPI#canHandle(org.embl.ebi.escience.scufl.Processor) + */ + public boolean canHandle(Processor processor) { + if (!(processor instanceof CDKProcessor)) { + return false; + } + CDKProcessor proc = (CDKProcessor) processor; + if (proc.getWorker() instanceof GetMoleculeIDsForGivenClasses) { + GetMoleculeIDsForGivenClasses reader = (GetMoleculeIDsForGivenClasses)proc.getWorker(); + File file; + String temp = ""; + if (reader.getFileNames().size() != 0) { + for (Iterator<String> iterator = reader.getFileNames().iterator(); iterator + .hasNext();) { + String fileName = iterator.next(); + file = new File(fileName); + if (file.isFile()) { + temp += file.getName() + "; "; + } + } + + if (temp.length() != 0) { + this.descriptionAdder = " - selected file: " + temp; + } + } + else { + this.descriptionAdder = ""; + } + return true; + } + else { + return false; + } + } + + /* (non-Javadoc) + * @see org.embl.ebi.escience.scuflui.spi.ProcessorActionSPI#getDescription() + */ + public String getDescription() { + return "Choose File" + this.descriptionAdder; + } + + /* (non-Javadoc) + * @see org.embl.ebi.escience.scuflui.actions.AbstractProcessorAction#getFrameSize() + */ + public Dimension getFrameSize() { + // should be small enought due to using a file dialog + return new Dimension(1, 1); + } + + + /* (non-Javadoc) + * @see org.embl.ebi.escience.scuflui.spi.ProcessorActionSPI#getIcon() + */ + public ImageIcon getIcon() { + return TavernaIcons.openIcon; + } + + @Override + public JFrame getFrame(Processor processor) { + return null; + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |