
org.biojava.nbio.structure.align.FarmJob Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of biojava-structure Show documentation
Show all versions of biojava-structure Show documentation
The protein structure modules of BioJava.
/*
* BioJava development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. If you do not have a copy,
* see:
*
* http://www.gnu.org/copyleft/lesser.html
*
* Copyright for this code is held jointly by the individual
* authors. These should be listed in @author doc comments.
*
* For more information on the BioJava project and its aims,
* or to join the biojava-l mailing list, visit the home page
* at:
*
* http://www.biojava.org/
*
*/
package org.biojava.nbio.structure.align;
import org.biojava.nbio.structure.align.client.FarmJobParameters;
import org.biojava.nbio.structure.align.client.FarmJobRunnable;
import org.biojava.nbio.structure.align.events.AlignmentProgressListener;
import org.biojava.nbio.structure.align.util.CliTools;
import org.biojava.nbio.structure.align.util.ConfigurationException;
import org.biojava.nbio.structure.align.util.UserConfiguration;
import org.biojava.nbio.structure.scop.CachedRemoteScopInstallation;
import org.biojava.nbio.structure.scop.ScopDatabase;
import org.biojava.nbio.structure.scop.ScopFactory;
import org.biojava.nbio.core.util.InputStreamProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/** A job as it can be run on the farm.
*
* @author Andreas Prlic
*
* for arguments see the printHelp() method.
*
*
*
*/
public class FarmJob implements Runnable {
private final static Logger logger = LoggerFactory.getLogger(FarmJob.class);
private static final String[] mandParams = new String[] {"pdbFilePath"};
private static final List mandatoryArgs= Arrays.asList(mandParams);
List progressListeners;
List jobs;
FarmJobParameters params ;
public FarmJob(){
progressListeners = null;
// send a flag to the PDb file loader to cache the gzip compressed files.
System.setProperty(InputStreamProvider.CACHE_PROPERTY, "true");
}
public FarmJobParameters getParams() {
return params;
}
public void setParams(FarmJobParameters params) {
this.params = params;
}
public void addAlignmentProgressListener(AlignmentProgressListener listener){
if (progressListeners == null)
progressListeners = new ArrayList();
progressListeners.add(listener);
}
public void clearListeners(){
progressListeners.clear();
progressListeners = null;
}
public static void main(String[] argv){
FarmJob job = new FarmJob();
if (argv.length == 0 ) {
job.printHelp();
return;
}
if ( argv.length == 1){
if (argv[0].equalsIgnoreCase("-h") || argv[0].equalsIgnoreCase("-help")|| argv[0].equalsIgnoreCase("--help")){
job.printHelp();
return;
}
}
FarmJobParameters params = new FarmJobParameters();
for (int i = 0 ; i < argv.length; i++){
String arg = argv[i];
String value = null;
if ( i < argv.length -1)
value = argv[i+1];
// if value starts with - then the arg does not have a value.
if (value != null && value.startsWith("-"))
value = null;
else
i++;
String[] tmp = {arg,value};
try {
CliTools.configureBean(params, tmp);
} catch (ConfigurationException e){
logger.error("Exception", e);
if ( mandatoryArgs.contains(arg) ) {
// there must not be a ConfigurationException with mandatory arguments.
return;
} else {
// but there can be with optional ...
}
}
}
if (( params.getNrAlignments() == -1) && (params.getTime() == -1)){
logger.error("Please provide either the -time or the -nrAlignments argument!");
return;
}
logger.info("Using parameters: {}", params);
job.setParams(params);
job.run();
}
@Override
public void run(){
// set the system wide PDB path
String path = params.getPdbFilePath();
System.setProperty(UserConfiguration.PDB_DIR,path);
String cachePath = params.getCacheFilePath();
if ( cachePath != null && ! cachePath.equals(""))
System.setProperty(UserConfiguration.PDB_CACHE_DIR,cachePath);
else {
// if not provided, we use pdbFilePath as the default CACHE path
System.setProperty(UserConfiguration.PDB_CACHE_DIR,path);
}
// declare SCOP to be locally cached, but fetching new stuff from remote
ScopDatabase scop = null;
try {
scop = new CachedRemoteScopInstallation(true);
} catch (IOException e) {
throw new RuntimeException("Could not load " + CachedRemoteScopInstallation.class.getName(), e);
}
ScopFactory.setScopDatabase(scop);
String username = params.getUsername();
jobs = new ArrayList();
for ( int i = 0 ; i < params.getThreads();i++){
logger.info("starting thread #{}", (i+1));
FarmJobRunnable runner = new FarmJobRunnable(params);
params.setUsername(username+"_thread_" + (i+1));
jobs.add(runner);
if ( progressListeners != null) {
for (AlignmentProgressListener li : progressListeners){
runner.addAlignmentProgressListener(li);
}
}
Thread t = new Thread(runner);
if ( ( (params.getThreads() > 1 ) && ( i < params.getThreads() - 1) )|| ( params.isRunBackground())) {
logger.info("starting thread #{} in background.", (i + 1));
t.start();
} else {
// single CPU jobs are run in the main thread and the last job is also run in the main thread
logger.info("starting thread #{} in main thread.", (i + 1));
t.run();
}
}
}
public void terminate(){
logger.info("terminating jobs");
if ( jobs == null)
return;
int js = jobs.size();
logger.info("number of jobs: {}", js);
for (FarmJobRunnable runner : jobs){
// runner.terminate() is already synchronized
runner.terminate();
}
clearListeners();
}
public void printHelp(){
System.out.println("-------------------");
System.out.println("FarmJob help:");
System.out.println("-------------------");
System.out.println("FarmJob accepts the following parameters:");
System.out.println("");
System.out.println(" Mandatory:");
System.out.println(" -pdbFilePath (mandatory) Path to the directory in your file system that contains the PDB files.");
System.out.println(" provide either -time or -nrAlignments. If both are provided the job stops as soon as any of the criteria has been reached.");
System.out.println(" -time maximum number of time to run (in seconds). -1 means no time limit, but run -nrAlignment arguments. Default: " + FarmJobParameters.DEFAULT_JOB_TIME );
System.out.println(" -nrAlignments number of alignments to calculate. Default: " + FarmJobParameters.DEFAULT_NR_ALIGNMENTS) ;
System.out.println("");
System.out.println(" Optional: ");
System.out.println(" -threads number of parallel threads to calculate alignments. Should be nr. of available CPUs. Default: " + FarmJobParameters.DEFAULT_NR_THREADS);
System.out.println(" -server the location of the server URL to talk to. Default : " + FarmJobParameters.DEFAULT_SERVER_URL);
System.out.println(" -username a unique name that can be given to this client. Can be used to give credit for who is doing the calculations. Default: IP and a random id");
System.out.println(" -stepSize the number of pairs to be requsted from server. Default: " + FarmJobParameters.DEFAULT_BATCH_SIZE);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy