import charite.christo.strap.StrapProtein;
import charite.christo.ByteArray;
import charite.christo.ChUtils;
import charite.christo.CacheResult;
import charite.christo.interfaces.ProteinWriter;
import charite.christo.interfaces.Superimpose3D;
import charite.christo.protein.Matrix3D;
import charite.christo.protein.PDB_Parser;
import charite.christo.protein.ProteinWriter1;
import charite.christo.strap.extensions.Superimpose3D_TM_align;
import java.io.File;
import static java.lang.System.*;
/*
  java  DemoSuperimpose1 a1_SaccharomycesCerevisiae.pdb hs_EscherichiaColi.pdb
  The protein hs_EscherichiaColi.pdb is superimposed on a2_SaccharomycesCerevisiae.
  The first protein (reference) is superimposed upon the 2nd (mobile) protein.
  The result is a transformation matrix for hs_EscherichiaColi.
  The proteins are not changed by the Superimpose3D class.
  But with the method Protein#setRotationAndTranslation(Matrix3D) the resulting
  transformation can be set to the protein.
*/
public class DemoSuperimpose1 {
    public static void main(String[] argv){

        /* The cache is located in ~/.StrapAlign/cached/ */
        CacheResult.setEnabled(true);

        /* prepare both protein objects */
        final StrapProtein pReference=StrapProtein.newInstance(new File(argv[0]));
        out.println("pReference="+pReference.getResidueTypeAsString());
        final StrapProtein pMobile=StrapProtein.newInstance(new File(argv[1]));
        out.println("pMobile="+pMobile.getResidueTypeAsString());
        /* Initialize the Superimpose3D object with the two proteins to be superimposed */
        final Superimpose3D_TM_align sup=new Superimpose3D_TM_align();
        sup.setMobileProtein(pMobile);
        sup.setReferenceProtein(pReference);
        /* start computation */
        sup.compute();
        /* Obtain the result */
        /* The Matrix3D object contains the coordinate transformation (rotation + translatio) */
        final Superimpose3D.Result result=sup.getResult();
        final Matrix3D transformation= result.toMatrix3D();

        /* Print the original coordinates of the mobile protein */
        final ByteArray sb=new ByteArray(100*1000)
            .append("*********************************************\n")
            .append("*** original *** \n");
        myPrint(pMobile,sb);
        /* Now change the coordinate system of the mobile protein and print the changed coordinates */
        pMobile.setRotationAndTranslation(transformation);
        sb.append("***  transformed *** \n");
        myPrint(pMobile,sb);
        out.println(sb);
        /* Save the Cache containing computed results */
        CacheResult.save();
        System.exit(0);
    }
    /* show only 3 amino acids */
    private static void myPrint(StrapProtein p,ByteArray sb) {
        final ProteinWriter pw=new ProteinWriter1();
        pw.selectResidues(new boolean[]{false,true,true});
        pw.toText(p,new Matrix3D[]{p.getRotationAndTranslation()},ProteinWriter.PDB|ProteinWriter.ATOM_LINES,sb);
    }
}