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}