/*
* EuroCarbDB, a framework for carbohydrate bioinformatics
*
* Copyright (c) 2006-2009, Eurocarb project, or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
* A copy of this license accompanies this distribution in the file LICENSE.txt.
*
* 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 Lesser General Public License
* for more details.
*
* Last commit: $Rev: 1612 $ by $Author: magnusl@organ.su.se $ on $Date:: 2009-09-09 #$
*/
/* class Casper_simulate
*
*
*
* @author ml
*
*/
package org.eurocarbdb.action.nmr;
import java.util.Collection;
import java.io.*;
import java.util.Enumeration;
import java.util.Iterator;
// 3rd party imports
import com.opensymphony.webwork.dispatcher.multipart.MultiPartRequestWrapper;
import com.opensymphony.webwork.ServletActionContext;
// eurocarb imports
import org.eurocarbdb.action.EurocarbAction;
import org.eurocarbdb.dataaccess.EntityManager;
import org.eurocarbdb.action.exception.InsufficientParams;
import org.eurocarbdb.application.glycanbuilder.ConvertGWS;
// static imports
import static org.eurocarbdb.util.StringUtils.join;
import static org.eurocarbdb.dataaccess.Eurocarb.getEntityManager;
public class Casper_simulate extends Casper
{
//------------------------- FIELDS ----------------------------//
public class residueData
{
private String name;
private String value;
public residueData()
{
name="";
value="";
}
public residueData(String inName, String inValue)
{
name=inName;
value=inValue;
}
public String getName()
{
return this.name;
}
public void setName(String str)
{
this.name=str;
}
public String getValue()
{
return this.value;
}
public void setValue(String str)
{
this.value=str;
}
}
private residueData [] residueList;
private residueData [] substituentList;
//------------------------ METHODS ----------------------------//
public Casper_simulate()
{
/* Set values of the enabled residues */
String [] Names= {"D-Galp","D-Glcp","D-Manp","D-GlcpNAc","D-GalpNAc",
"D-ManpNAc","D-GalpA","D-GlcpA","D-ManpA","L-Fucp",
"D-Fucp","L-Rhap","D-Rhap","D-Quip","L-FucpNAc",
"L-RhapNAc","D-QuipNAc","D-GalpANAc","D-ManpANAc",
"Abep","Colp","Parp","Tyvp","Ascp","MurpNAc",
"Aspargine","Serine","Threonine"};
String [] Values= {"DGal.12346","DGlc.12346","DMan.12346",
"DGlcNAc.1346","DGalNAc.1346","DManNAc.1346",
"DGalA.1234","DGlcA.1234","DManA.1234","LFuc.1234",
"DFuc.1234","LRha.1234","DRha.1234","DQui.1234",
"LFucNAc.134","LRhaNAc.134","DQuiNAc.134",
"DGalANAc.134","DManANAc.134",
"Abe.124","Col.124","Par.124","Tyv.124","Asc.124",
"MurNAc.146","Asn.4","Ser.3","Thr.3"};
residueList = new residueData[Names.length];
for(int i=0;i<Names.length;i++)
{
residueList[i] = new residueData(Names[i],Values[i]);
}
/* Set values of the enabled substituents */
String [] SubstNames= {"Methyl", "O-Acetyl", "Phosphate"};
String [] SubstValues= {"Me", "Ac", "P"};
substituentList = new residueData[SubstNames.length];
for(int i=0;i<SubstNames.length;i++)
{
substituentList[i] = new residueData(SubstNames[i],SubstValues[i]);
}
this.setMode("simulate");
}
public residueData [] getResidueList()
{
return this.residueList;
}
public void setResidueList(residueData [] res)
{
this.residueList=res;
}
public residueData getResidue(int i)
{
return this.residueList[i];
}
public residueData [] getSubstituentList()
{
return this.substituentList;
}
public void setSubstituentList(residueData [] sub)
{
this.substituentList=sub;
}
/* Generates the script that will be used by Casper for this run */
public String writeScript() throws Exception
{
Unit unit;
FileOutputStream outfile;
PrintStream out;
String res, toRes, line, name;
String experimental="exp";
boolean manualres=true;
File outDir, outFile;
try
{
outfile=new FileOutputStream
(this.getPath() + File.separator + "temp" +
File.separator + this.getId() + ".script");
out = new PrintStream(outfile);
outDir=this.createTempDirectory();
out.println("set error '" + this.getPath() + File.separator + "temp" +
File.separator + this.getId() + ".error'");
/* Will print structure in CT format. Can be used for graphical output. */
if(this.getGraphicalStructures())
{
out.println("set printct 1");
}
/* Removes all CCPN functionality and increases speed. */
if(this.getDisableCcpn())
{
out.println("disableccpn");
this.setProjectFileName("");
}
if(!this.getProjectFileName().equals(""))
{
out.println("ccpnload '"+ this.getProjectFileName() + "'");
experimental="/";
/* out.println("ldexp c /");
out.println("ldexp h /");*/
out.println("ldexp ch /");
String [] split=this.getUnit(0).getResidue().split("\\.");
res=split[0];
if(res.equals(""))
{
out.println("build sim /");
manualres=false;
}
}
if(manualres==true)
{
out.println("build sim {");
/* If there is a structure from GlycanBuilder convert
it to GlycoCT format and use it as CASPER input */
if(!this.getSequenceGWS().equals(""))
{
out.println("glycoinput *");
out.println(ConvertGWS.toFormat("glycoct_condensed", this.getSequenceGWS()));
out.println("*");
}
/* Otherwise use the specified structure */
else
{
/* Add the specified residues */
for(int i=0;i<8;i++)
{
unit=this.getUnit(i);
String [] split=unit.getResidue().split("\\.");
res=split[0];
if(!res.equals(""))
{
if(unit.getLinkToPos().equals("m"))
{
res=res+"OMe";
}
if(res.equals("Asn") || res.equals("Ser") || res.equals("Thr"))
{
unit.setConfiguration("");
}
out.println("unit " + (char)('a'+i) + " " +
unit.getConfiguration() +
res);
}
}
/* Add the specified substituents */
for(int i=0;i<8;i++)
{
unit=this.getSubstituent(i);
res=unit.getResidue();
if(!res.equals(""))
{
out.println("unit sub" + (i+1) + " " + res);
}
}
/* Add the residue linkages */
for(int i=0;i<8;i++)
{
unit=this.getUnit(i);
res=unit.getResidue();
if(!res.equals(""))
{
toRes=unit.getLinkToResidue();
if(!toRes.equals("") && !unit.getLinkToPos().equals("m"))
{
out.println("link '" + (char)('a'+i) + "(->" +
unit.getLinkToPos() + ")" +
toRes + "'");
}
}
}
/* Add the substituent linkages */
for(int i=0;i<8;i++)
{
unit=this.getSubstituent(i);
res=unit.getResidue();
if(!res.equals(""))
{
out.println("link 'sub" + (i+1) + "(->" +
unit.getLinkToPos() + ")" +
unit.getLinkToResidue() + "'");
}
}
}
out.println("}");
}
out.println("show str sim");
if(this.getProjectFileName().equals(""))
{
if(!this.getCShifts().equals(""))
{
out.println("ldexp c exp *");
out.println(this.getCShifts());
out.println("*");
}
if(!this.getHShifts().equals(""))
{
out.println("ldexp h exp *");
out.println(this.getHShifts());
out.println("*");
}
}
if(!this.getCCorrection().equals("") ||
!this.getHCorrection().equals(""))
{
out.println("correct "+ experimental + " " +
this.getCCorrection() + " " +
this.getHCorrection());
}
/* Just to keep it to reset experimental if it is temporarily set to
"none" */
name=experimental;
if(!this.getDisableCcpn() && this.getProjectFileName().equals("") &&
this.getCShifts().equals("") && this.getHShifts().equals(""))
{
out.println("ldassign sim " + experimental);
/* out.println("migrateassign sim " + experimental);*/
experimental="none";
}
/* Save spectra as pictures to be able to show them */
out.println("gnuplot c sim " + experimental +
" '" + outDir +
File.separator + "cSpectra.png'");
out.println("gnuplot c sim " + experimental +
" '" + outDir +
File.separator + "cSpectra.eps'");
out.println("gnuplot h sim " + experimental +
" '" + outDir +
File.separator + "hSpectra.png'");
out.println("gnuplot h sim " + experimental +
" '" + outDir +
File.separator + "hSpectra.eps'");
out.println("gnuplot ch sim " + experimental +
" '" + outDir +
File.separator + "chSpectra.png'");
out.println("gnuplot ch sim " + experimental +
" '" + outDir +
File.separator + "chSpectra.eps'");
if(experimental.equals("none"))
{
experimental=name;
}
if(!this.getCShifts().equals("") || !this.getHShifts().equals("") ||
!this.getProjectFileName().equals(""))
{
out.println("assign sim "+ experimental);
out.println("echo 'experimental structure:'");
out.println("show str "+ experimental);
}
else if(!this.getDisableCcpn())
{
out.println("assign sim " + experimental);
}
if(!this.getDisableCcpn())
{
outFile=new File(this.getProjectFileName());
name=outFile.getName();
if(name.equals(""))
{
name="casper_project";
}
out.println("ccpnsave '" + outDir +
File.separator + "save" +
File.separator +
name +"'");
}
out.println("quit");
out.close();
}
catch(Exception e)
{
System.err.println("Error writing parameters script file");
throw (e);
}
try
{
this.writeExecutionScript();
}
catch(Exception e)
{
throw (e);
}
return SUCCESS;
}
}