ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/owl/trunk/computeEnergies.java
Revision: 573
Committed: Fri Mar 28 15:56:24 2008 UTC (16 years, 6 months ago) by duarte
File size: 6520 byte(s)
Log Message:
Fixed script: was exiting after computing native energy!
Line User Rev File contents
1 duarte 572 import java.io.BufferedReader;
2     import java.io.File;
3     import java.io.FileReader;
4     import java.io.IOException;
5     import java.io.PrintWriter;
6     import java.util.ArrayList;
7     import java.util.Collections;
8     import java.util.Comparator;
9    
10     import proteinstructure.MaxClusterRunner;
11     import proteinstructure.MaxClusterRunner.ScoreType;
12    
13     import tinker.TinkerError;
14     import tinker.TinkerRunner;
15    
16     /**
17     * Script to calculate energies of a set of decoys by using tinker minimize program.
18     * At the moment the force field used for the energy calculation is amber99. But
19     * that could be change to any of the ones supported by tinker. See:
20     * ftp://dasher.wustl.edu/pub/tinker/params
21     *
22     * @author duarte
23     *
24     */
25     public class computeEnergies {
26    
27     private static final String TINKER_BIN_DIR = "/project/StruPPi/Software/tinker/bin";
28     private static final String FORCEFIELD_PRM_FILE = "/project/StruPPi/Software/tinker/amber/amber99.prm";
29     private static final String maxClusterExecutable = "/project/StruPPi/bin/maxcluster";
30     private static final double DEFAULT_RMSGRADIENT = 1.0;
31    
32     private class Row {
33    
34     String id;
35     double rmsdOriginal;
36     int rmsdOrigRank;
37     double rmsdMinimised;
38     int rmsdMinRank;
39     double gdtMinimised;
40     int gdtMinRank;
41     double energy;
42     int energyRank;
43    
44     public Row() {
45     this.id = null;
46     this.rmsdOriginal = 0;
47     this.rmsdMinimised = 0;
48     this.gdtMinimised = 0;
49     this.energy = 0;
50     }
51    
52     public Row(String id, double rmsdOriginal, double rmsdMinimised, double gdtMinimised, double energy) {
53     this.id = id;
54     this.rmsdOriginal = rmsdOriginal;
55     this.rmsdMinimised = rmsdMinimised;
56     this.gdtMinimised = gdtMinimised;
57     this.energy = energy;
58     }
59    
60     }
61    
62    
63     public static void main(String[] args) throws IOException {
64    
65     File listFile = new File(args[0]); // 1st argument listFile
66     File nativeStruct = new File(args[1]); // 2nd argument: native structure pdb file
67     double rmsGradient = DEFAULT_RMSGRADIENT;
68     if (args.length>=3) rmsGradient = Double.parseDouble(args[2]); // 3rd (optional) argument: rms gradient for minimization
69    
70     // getting file names from list file
71     ArrayList<File> pdbFiles = new ArrayList<File>();
72    
73     BufferedReader in = new BufferedReader(new FileReader(listFile));
74     String line;
75     int countPdbFiles=0;
76     while ((line=in.readLine())!=null) {
77     // ignore empty lines or comments
78     if (line.equals("") || line.startsWith("#")) {
79     continue;
80     }
81     pdbFiles.add(new File(line.trim()));
82     countPdbFiles++;
83     }
84    
85     TinkerRunner tr = new TinkerRunner(TINKER_BIN_DIR,FORCEFIELD_PRM_FILE);
86     MaxClusterRunner maxCluster = new MaxClusterRunner(maxClusterExecutable);
87     PrintWriter log = new PrintWriter(new File(listFile.getParent(),"tinker.log"));
88    
89     // getting energy of native
90     Row nativeRow = new computeEnergies().new Row();
91     try {
92     double energy = tr.minimize(nativeStruct, rmsGradient, log);
93     nativeRow = new computeEnergies().new Row(nativeStruct.getName(), 0.0, 0.0, 0.0, energy);
94     } catch(TinkerError e) {
95     System.err.println("Tinker error while computing energy for "+nativeStruct+". Skipping.");
96     }
97 duarte 573
98 duarte 572 // getting energy of all decoys in list
99     ArrayList<Row> rows = new ArrayList<Row>();
100     for (File pdbFile:pdbFiles){
101     try {
102     double energy = tr.minimize(pdbFile, rmsGradient, log);
103     double rmsdOriginal = maxCluster.calculatePairwiseScore(pdbFile.getAbsolutePath(), nativeStruct.getAbsolutePath(), ScoreType.RMSD);
104     String basename = pdbFile.getAbsolutePath();
105     if (basename.contains(".")) {
106     basename = basename.substring(0,basename.lastIndexOf("."));
107     }
108     double rmsdMinimised = maxCluster.calculatePairwiseScore(basename+".min.pdb", nativeStruct.getAbsolutePath(), ScoreType.RMSD);
109     double gdtMinimised = maxCluster.calculatePairwiseScore(basename+".min.pdb", nativeStruct.getAbsolutePath(), ScoreType.GDT);
110     Row row = new computeEnergies().new Row(pdbFile.getName(), rmsdOriginal, rmsdMinimised, gdtMinimised, energy);
111     rows.add(row);
112    
113     } catch(TinkerError e) {
114     System.err.println("Tinker error while computing energy for "+pdbFile+". Skipping. Error: "+e.getMessage());
115     continue;
116     }
117    
118     }
119    
120     log.close();
121    
122     System.out.println("Done "+rows.size()+" pdb files out of "+countPdbFiles);
123    
124     // sorting on rmsdOrig to get rmsdOrig rank
125     sortOnRmsdOrig(rows);
126     int rmsdOrigRank=1;
127     for (Row row: rows) {
128     row.rmsdOrigRank = rmsdOrigRank;
129     rmsdOrigRank++;
130     }
131    
132     // sorting on gdtMin to get gdt rank
133     sortOnGdtMin(rows);
134     int gdtRank=1;
135     for (Row row: rows) {
136     row.gdtMinRank = gdtRank;
137     gdtRank++;
138     }
139    
140     // sorting on energy to get energy rank
141     sortOnEnergy(rows);
142     int energyRank=1;
143     for (Row row: rows) {
144     row.energyRank = energyRank;
145     energyRank++;
146     }
147    
148     // sorting on rmsdMin for rmsd min rank and printing out
149     sortOnRmsdMin(rows);
150     int rmsdRank=1;
151     for (Row row: rows) {
152     row.rmsdMinRank = rmsdRank;
153     rmsdRank++;
154     }
155    
156     System.out.println("id\trmsdOrig\trmsdOrigRank\trmsdMin\trmsdMinRank\tgdtMin\tgdtRank\tenergy\tenergyRank");
157     for (Row row: rows) {
158     System.out.printf("%s %6.3f %3d %6.3f %3d %6.3f %3d %12.4f %3d\n",row.id,row.rmsdOriginal,row.rmsdOrigRank,row.rmsdMinimised,row.rmsdMinRank,row.gdtMinimised,row.gdtMinRank,row.energy,row.energyRank);
159     }
160     System.out.println("Native: ");
161     System.out.printf("%s %6.3f %3d %6.3f %3d %6.3f %3d %12.4f %3d\n",nativeRow.id,nativeRow.rmsdOriginal,nativeRow.rmsdOrigRank,nativeRow.rmsdMinimised,nativeRow.rmsdMinRank,nativeRow.gdtMinimised,nativeRow.gdtMinRank,nativeRow.energy,nativeRow.energyRank);
162    
163    
164     }
165    
166     private static void sortOnRmsdOrig(ArrayList<Row> rows) {
167     Collections.sort(rows, new Comparator<Row>() {
168     public int compare(Row o1, Row o2) {
169     return new Double(o1.rmsdOriginal).compareTo(o2.rmsdOriginal);
170     }
171     });
172     }
173    
174     private static void sortOnGdtMin(ArrayList<Row> rows) {
175     Collections.sort(rows, new Comparator<Row>() {
176     public int compare(Row o1, Row o2) {
177     // ordered is inversed here (in gdt maximum score is best)
178     return new Double(o2.gdtMinimised).compareTo(o1.gdtMinimised);
179     }
180     });
181     }
182    
183     private static void sortOnEnergy(ArrayList<Row> rows) {
184     Collections.sort(rows, new Comparator<Row>() {
185     public int compare(Row o1, Row o2) {
186     return new Double(o1.energy).compareTo(o2.energy);
187     }
188     });
189     }
190    
191     private static void sortOnRmsdMin(ArrayList<Row> rows) {
192     Collections.sort(rows, new Comparator<Row>() {
193     public int compare(Row o1, Row o2) {
194     return new Double(o1.rmsdMinimised).compareTo(o2.rmsdMinimised);
195     }
196     });
197     }
198    
199     }