001/**
002 *                    BioJava development code
003 *
004 * This code may be freely distributed and modified under the
005 * terms of the GNU Lesser General Public Licence.  This should
006 * be distributed with the code.  If you do not have a copy,
007 * see:
008 *
009 *      http://www.gnu.org/copyleft/lesser.html
010 *
011 * Copyright for this code is held jointly by the individual
012 * authors.  These should be listed in @author doc comments.
013 *
014 * For more information on the BioJava project and its aims,
015 * or to join the biojava-l mailing list, visit the home page
016 * at:
017 *
018 *      http://www.biojava.org/
019 *
020 * Created on Nov 27, 2012
021 * Created by Andreas Prlic
022 *
023 * @since 3.0.2
024 */
025package org.biojava.nbio.structure.symmetry.analysis;
026
027
028import org.biojava.nbio.structure.Structure;
029import org.biojava.nbio.structure.align.util.ResourceManager;
030import org.biojava.nbio.structure.symmetry.core.*;
031import org.biojava.nbio.structure.symmetry.jmolScript.JmolSymmetryScriptGenerator;
032
033import java.util.List;
034
035
036public class CalcBioAssemblySymmetry {
037        private Structure bioAssembly;
038        private QuatSymmetryParameters parameters;
039        private QuatSymmetryResults results;
040
041        private JmolSymmetryScriptGenerator scriptGenerator;
042
043        static public String version;
044        static public String build;
045        static {
046                try {
047                        ResourceManager about = ResourceManager.getResourceManager("about");
048
049                        version = about.getString("project_version");
050                        build   = about.getString("build");
051
052                } catch (Exception e){
053                        e.printStackTrace();
054                }
055        }
056
057        public CalcBioAssemblySymmetry(Structure bioAssembly, QuatSymmetryParameters parameters){
058                this.bioAssembly = bioAssembly;
059                this.parameters = parameters;
060        }
061
062        public QuatSymmetryParameters getParameters(){
063                return parameters;
064        }
065
066        public QuatSymmetryDetector orient(){
067                QuatSymmetryDetector detector = new QuatSymmetryDetector(bioAssembly, parameters);
068                String defaultColoring = "";
069
070                if (detector.hasProteinSubunits()) {
071                        for (QuatSymmetryResults globalSymmetry: detector.getGlobalSymmetry()) {
072
073                                String postFix = "g";
074                                AxisAligner aligner = AxisAligner.getInstance(globalSymmetry);
075                                JmolSymmetryScriptGenerator generator = JmolSymmetryScriptGenerator.getInstance(aligner, postFix);
076                                generator.setOnTheFly(parameters.isOnTheFly());
077                                // save the preferred result
078                                if (globalSymmetry.isPreferredResult()) {
079                                        this.results = globalSymmetry;
080                                        this.scriptGenerator = generator;
081                                }
082
083                                // get default color by symmetry for all subunits (for asymmetric cases only)
084                                if (globalSymmetry.getSymmetry().equals("C1") && ! globalSymmetry.getSubunits().isPseudoStoichiometric()) {
085                                        defaultColoring = generator.colorBySymmetry();
086                                }
087
088                                if (parameters.isVerbose()) {
089                                        System.out.println("Global symmetry: ");
090                                        System.out.println(globalSymmetry);
091
092//                                      System.out.println();
093//                                      System.out.println(generator.getDefaultOrientation());
094//                                      System.out.println(generator.getZoom());
095//                                      System.out.println(generator.drawPolyhedron());
096                                        System.out.println(generator.drawAxes());
097                                        System.out.println(generator.colorBySubunit());
098                                        System.out.println(generator.colorBySequenceCluster());
099                                        System.out.println(generator.colorBySymmetry());
100                                }
101
102                        }
103
104                        for (List<QuatSymmetryResults> localSymmetries: detector.getLocalSymmetries()) {
105                                int count = 0;
106
107                                for (QuatSymmetryResults localSymmetry: localSymmetries) {
108                                        // create a unique postFix for each local symmetry to be used in the Jmol script
109                                        // to avoid naming conflicts when more than one symmetry is displayed at one time.
110                                        String postFix = "l" + count;
111                                        AxisAligner aligner = AxisAligner.getInstance(localSymmetry);
112                                        JmolSymmetryScriptGenerator generator = JmolSymmetryScriptGenerator.getInstance(aligner, postFix);
113                                        generator.setOnTheFly(parameters.isOnTheFly());
114                                        // sets color by symmetry for all subunits. This is
115                                        // required for local symmetry, to ensure all subunits are colored.
116                                        generator.setDefaultColoring(defaultColoring);
117                                        // save preferred result
118                                        if (localSymmetry.isPreferredResult()) {
119                                                this.results = localSymmetry;
120                                                this.scriptGenerator = generator;
121                                        }
122
123                                        if (parameters.isVerbose()) {
124                                                System.out.println("Local symmetry: ");
125                                                System.out.println(localSymmetry);
126
127//                                              System.out.println();
128//                                              System.out.println(generator.getDefaultOrientation());
129//                                              System.out.println(generator.getZoom());
130//                                              System.out.println(generator.drawPolyhedron());
131//                                              System.out.println(generator.drawAxes());
132//                                              System.out.println(generator.colorBySubunit());
133//                                              System.out.println(generator.colorBySequenceCluster());
134//                                              System.out.println(generator.colorBySymmetry());
135                                        }
136                                }
137                        }
138                } else {
139                        System.out.println("No protein chains found for " + bioAssembly.getPDBCode() );
140                }
141                return detector;
142        }
143
144        /** Only works if this is not helical symmetry. Deprecated, use getSymmetry instead */
145        @Deprecated
146        public RotationGroup getRotationGroup() {
147                return results.getRotationGroup();
148        }
149
150
151        public Subunits getSubunits() {
152                return results.getSubunits();
153        }
154
155        /** String representation of Symmetry, e.g. C1, C2, H
156         *
157         * @return
158         */
159        public String getSymmetry() {
160                return results.getSymmetry();
161        }
162
163        public JmolSymmetryScriptGenerator getScriptGenerator() {
164                return scriptGenerator;
165        }
166}