/**********************************************************************
Copyright (C) 2006 by Virtual Computational Chemistry Laboratory, http://www.vcclab.org
Authors: Igor V. Tetko and Dmitry Samorodov
This program 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 version 2 of the License.
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 General Public License for more details.
***********************************************************************/
/*
This is a sample code to perform ALOGPS calculations at http://www.vcclab.org site
It requires Java 1.5,
AXIS libraries from AXIS project http://ws.apache.org/axis/
options.jar (library) for command-line processing from http://www.javaworld.com/javaworld/jw-08-2004/jw-0816-command.html.
mail.jar from http://java.sun.com/products/javamail/downloads/index.html
and activation.jar from http://java.sun.com/products/beans/glasgow/jaf.html
You can upload all of them at
http://www.vcclab.org/web/alllibraries.zip
The input file is molecule(s) in any OpenBabel format (http://openbabel.sourceforge.net/)
The output file is XML file produced by the ALOGPS program.
ALOGPS will perform conversion to SMILES using OpenBabel and will
calculate the logP and aqueous solubility values using SMILES representation.
Notice, that this is an experimental Web Service and it may change in the future.
Consult http://www.vcclab.org/web for details.
The application sends to the server XML file:
data1
data2
CCCC
C1CCCCC1
FORMAT is thus the same for all molecules.
On LINUX/MacOsX:
to compile program
javac -classpath .:options.jar:axis-ant.jar:axis-schema.jar:axis.jar:commons-discovery-0.2.jar:commons-logging-1.0.4.jar:jaxrpc.jar:log4j-1.2.8.jar:saaj.jar:wsdl4j-1.5.1.jar:mail.jar:activation.jar VcclabALOGPS.java
to run program use
java -classpath .:options.jar:axis-ant.jar:axis-schema.jar:axis.jar:commons-discovery-0.2.jar:commons-logging-1.0.4.jar:jaxrpc.jar:log4j-1.2.8.jar:saaj.jar:wsdl4j-1.5.1.jar:mail.jar:activation.jar VcclabALOGPS -f smi FILE_SMILES output.xml
where FILE_SMILES is file with molecules in SMILES format
On Windows :
to compile program
javac -classpath .;options.jar;axis-ant.jar;axis-schema.jar;axis.jar;commons-discovery-0.2.jar;commons-logging-1.0.4.jar;jaxrpc.jar;log4j-1.2.8.jar;saaj.jar;wsdl4j-1.5.1.jar;mail.jar;activation.jar VcclabALOGPS.java
to run program use
java -classpath .;options.jar;axis-ant.jar;axis-schema.jar;axis.jar;commons-discovery-0.2.jar;commons-logging-1.0.4.jar;jaxrpc.jar;log4j-1.2.8.jar;saaj.jar;wsdl4j-1.5.1.jar;mail.jar;activation.jar VcclabALOGPS -f smi FILE_SMILES output.xml
In this command all libraries are from the AXIS project (the other versions may have different names, just use all libraries) with an exception of
options.jar, which is available from http://www.javaworld.com/javaworld/jw-08-2004/jw-0816-command.html.
********
N.B:!
Submit only one molecule per file when analysing molecules in other than SMILES, mol2 (Sybyl) and sdf file formats.
Usage: java VcclabALOGPS [-f babelFormat]
The default input file is a list of SMILES: one SMILES per line.
********
*/
import java.io.*;
import java.util.*;
import java.net.URL;
import org.apache.axis.client.Service;
import org.apache.axis.client.Call;
import org.apache.axis.utils.XMLUtils;
import org.apache.axis.message.SOAPBodyElement;
import org.w3c.dom.Element;
import org.w3c.dom.Document;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import ml.options.*;
import ml.options.Options.*;
public class VcclabALOGPS{
final static String SMILES="smi", SDF="sdf", MOL2="mol2";
String inputFile = null,
outputFile = null,
fileFormat = SMILES;
public VcclabALOGPS() {}
public void getAlogpsXmlResults() throws Exception {
File source = new File(inputFile);
if (!source.exists()) {
System.err.println("Error: \"" + inputFile + "\" does not exist!");
System.exit(8);
}
ArrayList molecules = new ArrayList ();
try{
BufferedReader br = new BufferedReader(new FileReader(source));
String line,mol="";boolean ok=false;
while ( (line = br.readLine()) != null) {
if(fileFormat.equals(SMILES)){
mol=line.trim();
if (mol.length() > 0)molecules.add(mol+"\n");
continue;
}
if(fileFormat.equals(SDF)){
mol=mol+line+"\n";
if(line.trim().length()>0)ok=true;
if(line.startsWith("$$$$")){molecules.add(mol);mol="";ok=false;}
continue;
}
if(fileFormat.equals(MOL2)){
if(line.startsWith("@MOLECULE")){molecules.add(mol);mol="";}
mol=mol+line+"\n";
continue;
}
mol=mol+line+"\n";ok=true;
}
if(fileFormat.equals(MOL2)||ok)molecules.add(mol);
br.close();
}catch(Exception e) {
System.out.println("There is an exception when reading molecules from file "+inputFile+"\n"+e.getMessage());
}
if ( molecules.isEmpty()) {
System.err.println("Error \"" + inputFile + "\" is empty");
System.exit(8);
}
Service service = new Service();
Call call = (Call) service.createCall();
String endpoint = "http://www.vcclab.org/web/services/ALOGPS";
call.setTargetEndpointAddress(new URL(endpoint));
int size = molecules.size();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element rootElement = doc.createElement("MOLECULES");
rootElement.setAttribute("FORMAT",fileFormat);
for (int i = 0; i < size; i++){
Element molecule = doc.createElement("MOLECULE");
molecule.appendChild(doc.createTextNode(molecules.get(i)));
rootElement.appendChild(molecule);
}
doc.appendChild(rootElement);
SOAPBodyElement[] input = new SOAPBodyElement[1];
input[0] = new SOAPBodyElement(doc.getDocumentElement());
Vector elems = (Vector) call.invoke(input);
SOAPBodyElement element = (SOAPBodyElement) elems.get(0);
Element e = element.getAsDOM();
File target = new File(outputFile);
Transformer t = TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(e), new StreamResult(new FileOutputStream(target)));
}
public static void main(String[] args) throws Exception {
Options opt = new Options(args,Multiplicity.ZERO_OR_ONE, 2);
opt.getSet().addOption("f", Separator.BLANK);
if (!opt.check()) {
System.out.println("Usage: java VcclabALOGPS [-f babelFormat] \nsmi is default format (SMILES)\nFor other formats openBabel will be used to perform file conversion\n");
System.exit(1);
}
VcclabALOGPS alogps = new VcclabALOGPS();
if (opt.getSet().isSet("f")) {
alogps.fileFormat = opt.getSet().getOption("f").getResultValue(0);
}
alogps.inputFile = opt.getSet().getData().get(0);
alogps.outputFile = opt.getSet().getData().get(1);
alogps.getAlogpsXmlResults();
}
}