From 3fec481aaf9ff576e33891ac41d94fb7f9420c44 Mon Sep 17 00:00:00 2001 From: Tomas Pluskal Date: Tue, 19 Jun 2018 10:19:29 -0400 Subject: [PATCH] Removed METLIN code, updated dependencies --- pom.xml | 9 +- .../databases/MetLinGateway.java | 146 ------------------ .../metlin-api/1.0/metlin-api-1.0.jar | Bin 17922 -> 0 bytes 3 files changed, 2 insertions(+), 153 deletions(-) delete mode 100644 src/main/java/net/sf/mzmine/modules/peaklistmethods/identification/onlinedbsearch/databases/MetLinGateway.java delete mode 100644 src/main/lib/soap-apis/metlin-api/1.0/metlin-api-1.0.jar diff --git a/pom.xml b/pom.xml index 0b681685c..4a331131c 100644 --- a/pom.xml +++ b/pom.xml @@ -138,7 +138,7 @@ com.google.guava guava - 24.1-jre + 25.1-jre org.apache.commons @@ -294,7 +294,7 @@ uk.ac.ebi.jmzml jmzml - 1.7.9 + 1.7.10 @@ -339,11 +339,6 @@ - - soap-apis - metlin-api - 1.0 - soap-apis chemspider-api diff --git a/src/main/java/net/sf/mzmine/modules/peaklistmethods/identification/onlinedbsearch/databases/MetLinGateway.java b/src/main/java/net/sf/mzmine/modules/peaklistmethods/identification/onlinedbsearch/databases/MetLinGateway.java deleted file mode 100644 index 07c7c83b9..000000000 --- a/src/main/java/net/sf/mzmine/modules/peaklistmethods/identification/onlinedbsearch/databases/MetLinGateway.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright 2006-2015 The MZmine 2 Development Team - * - * This file is part of MZmine 2. - * - * MZmine 2 is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * MZmine 2 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * MZmine 2; if not, write to the Free Software Foundation, Inc., 51 Franklin St, - * Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.sf.mzmine.modules.peaklistmethods.identification.onlinedbsearch.databases; - -import java.io.IOException; -import java.net.URL; -import java.util.Hashtable; -import java.util.Map; - -import javax.xml.rpc.ServiceException; - -import metlin.LineInfo; -import metlin.MetaboliteSearchRequest; -import metlin.MetlinPortType; -import metlin.MetlinServiceLocator; -import net.sf.mzmine.modules.peaklistmethods.identification.onlinedbsearch.DBCompound; -import net.sf.mzmine.modules.peaklistmethods.identification.onlinedbsearch.DBGateway; -import net.sf.mzmine.modules.peaklistmethods.identification.onlinedbsearch.OnlineDatabase; -import net.sf.mzmine.parameters.ParameterSet; -import net.sf.mzmine.parameters.parametertypes.tolerances.MZTolerance; -import net.sf.mzmine.util.RangeUtils; - -import org.apache.axis.AxisFault; - -import com.google.common.collect.Range; - -public class MetLinGateway implements DBGateway { - - private static final String adduct[] = { "M" }; - - private static final String metLinEntryAddress = "http://metlin.scripps.edu/metabo_info.php?molid="; - private static final String metLinStructureAddress1 = "http://metlin.scripps.edu/structure/"; - private static final String metLinStructureAddress2 = ".mol"; - - private Map retrievedMolecules = new Hashtable(); - - public synchronized String[] findCompounds(double mass, - MZTolerance mzTolerance, int numOfResults, ParameterSet parameters) - throws IOException { - - Range toleranceRange = mzTolerance.getToleranceRange(mass); - - MetlinServiceLocator locator = new MetlinServiceLocator(); - MetlinPortType serv; - try { - serv = locator.getMetlinPort(); - } catch (ServiceException e) { - throw (new IOException(e)); - } - - // Search mass as float[] - float searchMass[] = new float[] { (float) RangeUtils - .rangeCenter(toleranceRange) }; - float searchTolerance = (float) (RangeUtils.rangeLength(toleranceRange) / 2.0); - - final String token = parameters.getParameter( - MetLinParameters.SECURITY_TOKEN).getValue(); - - MetaboliteSearchRequest searchParams = new MetaboliteSearchRequest( - token, searchMass, adduct, searchTolerance, "Da"); - LineInfo resultsData[][]; - try { - resultsData = serv.metaboliteSearch(searchParams); - } catch (AxisFault e) { - // For some reason, the METLIN SOAP gateway throws AxisFault caused - // by ArrayStoreException if no result is found. I suspect their - // SOAP response is malformed and Axis does not like it. - resultsData = new LineInfo[1][0]; - } - - if (resultsData.length == 0) { - throw (new IOException("Results could not be retrieved from METLIN")); - - } - final int totalResults = Math.min(resultsData[0].length, numOfResults); - String metlinIDs[] = new String[totalResults]; - - for (int i = 0; i < totalResults; i++) { - LineInfo metlinEntry = resultsData[0][i]; - String metlinID = metlinEntry.getMolid(); - retrievedMolecules.put(metlinID, metlinEntry); - metlinIDs[i] = metlinID; - } - - return metlinIDs; - - } - - /** - * This method retrieves the details about METLIN compound - * - */ - public DBCompound getCompound(String ID, ParameterSet parameters) - throws IOException { - - URL entryURL = new URL(metLinEntryAddress + ID); - - LineInfo metlinEntry = retrievedMolecules.get(ID); - - if (metlinEntry == null) { - throw new IOException("Unknown ID " + ID); - } - - String compoundName = metlinEntry.getName(); - - if (compoundName == null) { - throw (new IOException( - "Could not parse compound name for compound " + ID)); - } - - String compoundFormula = metlinEntry.getFormula(); - - URL structure2DURL = new URL(metLinStructureAddress1 + ID - + metLinStructureAddress2); - - URL structure3DURL = null; - - /* - DBCompound newCompound = new DBCompound(OnlineDatabase.METLIN, ID, - compoundName, compoundFormula, entryURL, structure2DURL, - structure3DURL); - - return newCompound; - - */ - return null; - - } -} diff --git a/src/main/lib/soap-apis/metlin-api/1.0/metlin-api-1.0.jar b/src/main/lib/soap-apis/metlin-api/1.0/metlin-api-1.0.jar deleted file mode 100644 index c20d706d02b930d8fed19a0a250021c13f18c6b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17922 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 aAGm)q2l{C(0RX^#zGy!;hi-x2pZ*VK;aTwj