ch.unibas.fittingwizard.infrastructure.RealVmdDisplayScript.java Source code

Java tutorial

Introduction

Here is the source code for ch.unibas.fittingwizard.infrastructure.RealVmdDisplayScript.java

Source

/*
 * Copyright (c) 2015, Florent Hedin, Markus Meuwly, and the University of Basel
 * All rights reserved.
 *
 * The 3-clause BSD license is applied to this software.
 * see LICENSE.txt
 *
 */
package ch.unibas.fittingwizard.infrastructure;

import ch.unibas.fittingwizard.Settings;
import ch.unibas.fittingwizard.application.molecule.MoleculeId;
import ch.unibas.fittingwizard.application.scripts.vmd.IVmdDisplayScript;
import ch.unibas.fittingwizard.application.scripts.vmd.VmdDisplayInput;
import ch.unibas.fittingwizard.infrastructure.base.FieldcompRunner;
import ch.unibas.fittingwizard.infrastructure.base.PythonScriptRunner;
import ch.unibas.fittingwizard.infrastructure.base.ScriptUtilities;
import ch.unibas.fittingwizard.infrastructure.base.VmdRunner;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.NameFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.log4j.Logger;

public class RealVmdDisplayScript implements IVmdDisplayScript {

    private final static Logger logger = Logger.getLogger(RealVmdDisplayScript.class);

    private static final String ExportScriptNameKey = "scripts.export_data";
    private static final String VmdScriptNameKey = "scripts.vmd_display";

    private static final String CubeOutputNamePostfix = "_mtpcube";

    private final File exportScriptFile;
    private final FieldcompRunner fieldcompRunner;
    private final PythonScriptRunner pyRunner;
    private final VmdRunner vmdRunner;
    private final File vmdScriptFile;
    private final File outputDir;
    private final File moleculesDir;

    public RealVmdDisplayScript(Settings settings, File outputDir, File moleculesDir) {
        this.moleculesDir = moleculesDir;
        exportScriptFile = new File(settings.getScriptsDir(), settings.getValue(ExportScriptNameKey));
        vmdScriptFile = new File(settings.getScriptsDir(), settings.getValue(VmdScriptNameKey));

        this.outputDir = outputDir;
        this.fieldcompRunner = new FieldcompRunner(settings.getScriptsDir());
        this.pyRunner = new PythonScriptRunner();
        this.vmdRunner = new VmdRunner();
    }

    @Override
    public Void execute(VmdDisplayInput input) {

        // run export
        pyRunner.setWorkingDir(outputDir);

        // -txt parameter
        String fitResultFileName = RealFitScript.getResultFileNameForFit(input.getFitId());
        File fitResultFile = new File(outputDir, fitResultFileName);

        // -pun co2_l.pun
        File moleculeLPunFile = getLPunFileForMolecule(input.getMoleculeId());

        // -out co2fit.pun
        File punOutputFile = getPunOutputFile(input.getFitId(), input.getMoleculeId());

        ScriptUtilities.verifyFileExistence(fitResultFile);
        ScriptUtilities.verifyFileExistence(moleculeLPunFile);

        ScriptUtilities.deleteFileIfExists(punOutputFile);

        List<String> pyArgs = Arrays.asList("-txt", fitResultFile.getAbsolutePath(), "-pun",
                moleculeLPunFile.getAbsolutePath(), "-out", punOutputFile.getName());
        // run script 1
        pyRunner.exec(exportScriptFile, pyArgs);
        ScriptUtilities.verifyFileExistence(punOutputFile);

        // run fieldcomp

        File currentMoleculeDir = getMoleculeDirForMolecule(input.getMoleculeId());
        fieldcompRunner.setWorkingDir(currentMoleculeDir);

        // -vdw parameter
        File moleculeVdwFile = getVdwFileForMolecule(input.getMoleculeId());
        File modifiedVdwFile = new File(outputDir, moleculeVdwFile.getName());

        createModifiedVdwFile(moleculeVdwFile, modifiedVdwFile, input.getFitRank());

        // -cube parameter
        File moleculeCubeFile = getCubeFileForMolecule(input.getMoleculeId());

        List<String> fieldcompArgs = Arrays.asList("-cube",
                /*moleculeCubeFile.getName()*/ moleculeCubeFile.getAbsolutePath(), "-vdw",
                modifiedVdwFile.getAbsolutePath(), "-pun", punOutputFile.getAbsolutePath(), "-cubeout");

        fieldcompRunner.exec(fieldcompArgs);

        String systemDir = System.getProperty("user.dir");
        File outputFile = getDefaultCubeOutputFile(input.getMoleculeId());
        File cubeOutputFile = getCubeOutputFile(input.getMoleculeId());

        // copy output file from default location to output dir
        ScriptUtilities.verifyFileExistence(outputFile);

        try {
            FileUtils.copyFile(outputFile, cubeOutputFile);
            outputFile.delete();
        } catch (IOException e) {
            throw new RuntimeException("Could not copy file " + outputFile.getAbsolutePath() + " to destination "
                    + cubeOutputFile.getAbsolutePath(), e);
        }

        ScriptUtilities.verifyFileExistence(cubeOutputFile);

        // display in vmd
        vmdRunner.exec(Arrays.asList(cubeOutputFile.getAbsolutePath(), "-e", vmdScriptFile.getAbsolutePath()));

        return null;
    }

    private File getMoleculeDirForMolecule(MoleculeId moleculeId) {
        return new File(moleculesDir.getAbsolutePath(), moleculeId.getName());
    }

    private File getDefaultCubeOutputFile(MoleculeId moleculeId) {
        String name = String.format("%s%s.cube", moleculeId.getName(), CubeOutputNamePostfix);
        File currentMoleculeDir = getMoleculeDirForMolecule(moleculeId);
        File cubeDefaultOutput = new File(currentMoleculeDir.getAbsolutePath(), name);
        return cubeDefaultOutput;
    }

    private File getPunOutputFile(int fitId, MoleculeId moleculeId) {
        // for example: fit_1_co2.pun
        String name = String.format("%s%s_%s.pun", RealFitScript.FitNamePrefix, String.valueOf(fitId),
                moleculeId.getName());
        File exportOutput = new File(outputDir, name);
        return exportOutput;
    }

    private File getLPunFileForMolecule(MoleculeId moleculeId) {
        String lPunFileName = moleculeId.getName() + RealLRAScript.LPunExtension;
        Collection<File> files = FileUtils.listFiles(moleculesDir, new NameFileFilter(lPunFileName),
                TrueFileFilter.TRUE);
        if (files.size() != 1) {
            throw new RuntimeException(String.format("No or too many %s files found in %s.", lPunFileName,
                    moleculesDir.getAbsolutePath()));
        }
        File lPunFile = files.iterator().next();
        return lPunFile;
    }

    private File getVdwFileForMolecule(MoleculeId moleculeId) {
        String vdwFileName = moleculeId.getName() + RealMultipoleGaussScript.vdwExtension;
        Collection<File> files = FileUtils.listFiles(moleculesDir, new NameFileFilter(vdwFileName),
                TrueFileFilter.TRUE);
        if (files.size() != 1) {
            throw new RuntimeException(String.format("No or too many %s files found in %s.", vdwFileName,
                    moleculesDir.getAbsolutePath()));
        }
        File vdwFile = files.iterator().next();
        return vdwFile;
    }

    private File getCubeFileForMolecule(MoleculeId moleculeId) {
        String cubeFileName = moleculeId.getName() + RealMultipoleGaussScript.cubeExtension;
        Collection<File> files = FileUtils.listFiles(moleculesDir, new NameFileFilter(cubeFileName),
                TrueFileFilter.TRUE);
        if (files.size() != 1) {
            throw new RuntimeException(String.format("No or too many %s files found in %s.", cubeFileName,
                    moleculesDir.getAbsolutePath()));
        }
        File cubeFile = files.iterator().next();
        return cubeFile;
    }

    private File getCubeOutputFile(MoleculeId moleculeId) {
        // *mol*_mtpcube.cube
        String name = String.format("%s%s.cube", moleculeId.getName(), CubeOutputNamePostfix);
        File cubeOutputFile = new File(outputDir, name);
        return cubeOutputFile;
    }

    private void createModifiedVdwFile(File vdwInputFile, File vdwOutputFile, int fitRank) {
        List<String> lines;
        List<String> modLines = new LinkedList<String>();
        try {
            lines = FileUtils.readLines(vdwInputFile);
        } catch (IOException e) {
            throw new RuntimeException("Could not read form vdw file.\n" + vdwInputFile.getAbsolutePath(), e);
        }

        for (String line : lines) {
            String modifiedLine = line.replaceAll("[0-2]$", String.valueOf(fitRank));
            modLines.add(modifiedLine);
        }

        try {
            FileUtils.writeLines(vdwOutputFile, modLines);
        } catch (IOException e) {
            throw new RuntimeException("Could not write to modified vdw file.\n" + vdwOutputFile.getAbsolutePath(),
                    e);
        }
    }

}