ssi = SecStrucTools.getSecStrucInfo(s);
+ for (SecStrucInfo ss : ssi) {
+ System.out.println(ss.getGroup().getChain().getName() + " "
+ + ss.getGroup().getResidueNumber() + " "
+ + ss.getGroup().getPDBName() + " -> " + ss.toString());
+ }
+ }
+```
+
+
+
+
+---
+
+Navigation:
+[Home](../README.md)
+| [Book 3: The Structure Modules](README.md)
+| Chapter 15 : Protein Secondary Structure
+
+Prev: [Chapter 14 : Protein Symmetry](symmetry.md)
+
+Next: [Chapter 17 : Special Cases](special.md)
diff --git a/structure/seqres.md b/structure/seqres.md
index 62b2695..2d03e04 100644
--- a/structure/seqres.md
+++ b/structure/seqres.md
@@ -1,24 +1,23 @@
-SEQRES and ATOM records, mapping to Uniprot (SIFTs)
+SEQRES and ATOM Records, Mapping to Uniprot (SIFTs)
===================================================
How molecular sequences are linked to experimentally observed atoms.
## Sequences and Atoms
-In many experiments not all atoms that are part of the molecule under study can be observed. As such the ATOM records in PDB oftein contain missing atoms or only the part of a molecule that could be experimentally determined. In case of multi-domain proteins the PDB often contains only one of the domains (and in some cases even shorter fragments).
+In many experiments not all atoms that are part of the molecule under study can be observed. As such the ATOM records in PDB often contain missing atoms or only the part of a molecule that could be experimentally determined. In case of multi-domain proteins the PDB often contains only one of the domains (and in some cases even shorter fragments).
-Let's take a look at an example. The [Protein Feature View](https://github.com/andreasprlic/proteinfeatureview) provides a graphical summary of how the regions that have been observed in an experiment and are available in the PDB map to UniProt.
+Let's take a look at an example. The [Protein Feature View](https://github.com/andreasprlic/proteinfeatureview) provides a graphical summary of the regions that have been observed in an experiment and are available in the PDB map to UniProt.
-![Screenshot of Protein Feature View at RCSB]
-(https://raw.github.com/andreasprlic/proteinfeatureview/master/images/P06213.png "Insulin receptor - P06213 (INSR_HUMAN)")
+")
As you can see, there are three PDB entries (PDB IDs [3LOH](http://www.rcsb.org/pdb/explore.do?structureId=3LOH), [2HR7](http://www.rcsb.org/pdb/explore.do?structureId=2RH7), [3BU3](http://www.rcsb.org/pdb/explore.do?structureId=3BU3)) that cover different regions of the UniProt sequence for the insulin receptor.
The blue-boxes are regions for which atoms records are available. For the grey regions there is sequence information available in the PDB, but no coordinates.
-## Seqres and Atom records
+## Seqres and Atom Records
-The sequence that has been used in the experiment is stored in the **Seqres** records in the PDB. It is often not the same sequences as can be found in Uniprot, since it can contain cloning-artefacts and modifications that were necessary in order to crystallize a structure.
+The sequence that has been used in the experiment is stored in the **Seqres** records in the PDB. It is often not the same sequence as can be found in Uniprot, since it can contain cloning-artefacts and modifications that were necessary in order to crystallize a structure.
The **Atom** records provide coordinates where it was possible to observe them.
@@ -40,9 +39,9 @@ The *mmCIF/PDBx* file format contains the information how the Seqres and atom re
```
-## Accessing Seqres and Atom groups
+## Accessing Seqres and Atom Groups
-By default BioJava loads both the Seqres and Atom groups into the [Chain](http://www.biojava.org/docs/api/org/biojava/bio/structure/Chain.html)
+By default BioJava loads both the Seqres and Atom groups into the [Chain](http://www.biojava.org/docs/api/org/biojava/nbio/structure/Chain.html)
objects.
@@ -53,13 +52,11 @@ objects.
Groups that are part of the Seqres sequence as well as of the Atom records are mapped onto each other. This means you
can iterate over all Seqres groups in a chain and check, if they have observed atoms.
-
-
-## Mapping from Uniprot to Atom records
+## Mapping from Uniprot to Atom Records
The mapping between PDB and UniProt changes over time, due to the dynamic nature of biological data. The [PDBe](http://www.pdbe.org) has a project that provides up-to-date mappings between the two databases, the [SIFTs](http://www.ebi.ac.uk/pdbe/docs/sifts/) project.
-BioJava contains a parser for the SIFTs XML files. The [SiftsMappingProvider](http://www.biojava.org/docs/api/org/biojava/bio/structure/io/sifts/SiftsMappingProvider.html) also acts similar to the AtomCache class, that we [discussed earlier](caching.md) and can automatically download and locally install SIFTs files.
+BioJava contains a parser for the SIFTs XML files. The [SiftsMappingProvider](http://www.biojava.org/docs/api/org/biojava/nbio/structure/io/sifts/SiftsMappingProvider.html) also acts similar to the AtomCache class, that we [discussed earlier](caching.md) and can automatically download and locally install SIFTs files.
Here, how to request the mapping for one particular PDB ID.
@@ -98,3 +95,16 @@ This gives the following output:
As you can see for each residue in the Uniprot / PDB sequence the matching counterpart is provided (if there is one).
+
+
+
+---
+
+Navigation:
+[Home](../README.md)
+| [Book 3: The Structure Modules](README.md)
+| Chapter 7 : SEQRES and ATOM Records
+
+Prev: [Chapter 6 : Work with mmCIF/PDBx Files](mmcif.md)
+
+Next: [Chapter 8 : Structure Alignments](alignment.md)
diff --git a/structure/special.md b/structure/special.md
index 07fcc6d..ea14816 100644
--- a/structure/special.md
+++ b/structure/special.md
@@ -123,3 +123,16 @@ DYG is an unusual group - it has 3 characters as a result of .getOne_letter_code
## Microheterogeneity
+
+
+
+---
+
+Navigation:
+[Home](../README.md)
+| [Book 3: The Structure Modules](README.md)
+| Chapter 17 : Special Cases
+
+Prev: [Chapter 15 : Protein Secondary Structure](secstruc.md)
+
+Next: [Chapter 18 : Status Information](lists.md)
diff --git a/structure/structure-data-model.md b/structure/structure-data-model.md
index 513e865..6ea6ce4 100644
--- a/structure/structure-data-model.md
+++ b/structure/structure-data-model.md
@@ -1,17 +1,17 @@
-# The BioJava-structure data model
+# The BioJava-Structure Data Model
A biologically and chemically meaningful data representation of PDB/mmCIF.
-## The basics
+## The Basics
-BioJava at its core is a collection of file parsers and (in some cases) data models to represent frequently used biological data. The protein-structure modules represent macromolecular data in a way that should make it easy to work with. The representation is essentially independ of the underlying file format and the user can chose to work with either PDB or mmCIF files and still get an almost identical data representation. (There can be subtile differences between PDB and mmCIF data, for example the atom indices in a few entries are not 100% identical)
+BioJava at its core is a collection of file parsers and (in some cases) data models to represent frequently used biological data. The protein-structure modules represent macromolecular data in a way that should make it easy to work with. The representation is essentially independent of the underlying file format and the user can chose to work with either PDB or mmCIF files and still get an almost identical data representation. (There can be subtile differences between PDB and mmCIF data, for example the atom indices in a few entries are not 100% identical)
-## The main hierarchy
+## The Main Hierarchy
BioJava provides a flexible data structure for managing protein structural data. The
-[http://www.biojava.org/docs/api/org/biojava/bio/structure/Structure.html Structure] class is the main container.
+[Structure](http://www.biojava.org/docs/api/org/biojava/nbio/structure/Structure.html) class is the main container.
-A Structure has a hierarchy of sub-objects:
+A `Structure` has a hierarchy of sub-objects:
Structure
@@ -25,28 +25,27 @@ Structure
Atom(s)
-All structure objects contain one or more "models". That means also X-ray structures contain a "virtual" model which serves as a container for the chains. The most common way to access chains will be via
+All `Structure` objects contain one or more `Models`. That means also X-ray structures contain a "virtual" model which serves as a container for the chains. This allows to represent multi-model X-ray structures, e.g. from time-series analysis. The most common way to access chains is via:
```java
- List chains = structure.getChains();
+ List chains = structure.getChains();
```
-This works for both NMR and X-ray based structures and by default the first model is getting accessed.
+This works for both NMR and X-ray based structures and by default the first `Model` is getting accessed.
+## Working with Atoms
-## Working with atoms
-
-Different ways are provided how to access the data contained in a [Structure](http://www.biojava.org/docs/api/org/biojava/bio/structure/Structure.html).
-If you want to directly access an array of [Atoms](http://www.biojava.org/docs/api/org/biojava/bio/structure/Atom.html) you can use the utility class called [StructureTools](http://www.biojava.org/docs/api/org/biojava/bio/structure/StructureTools.html)
+Different ways are provided how to access the data contained in a [Structure](http://www.biojava.org/docs/api/org/biojava/nbio/structure/Structure.html).
+If you want to directly access an array of representative [Atoms](http://www.biojava.org/docs/api/org/biojava/nbio/structure/Atom.html) (CA for proteins, P in nucleotides),you can use the utility class called [StructureTools](http://www.biojava.org/docs/api/org/biojava/nbio/structure/StructureTools.html)
```java
- // get all C-alpha atoms in the structure
- Atom[] caAtoms = StructureTools.getAtomCAArray(structure);
+ // get all representative atoms in the structure, one for residue
+ Atom[] caAtoms = StructureTools.getRepresentativeAtomArray(structure);
```
Alternatively you can access atoms also by their parent-group.
-## Loop over all the data
+## Loop over All the Data
Here an example that loops over the whole data model and prints out the HEM groups of hemoglobin:
@@ -59,7 +58,7 @@ Here an example that loops over the whole data model and prints out the HEM grou
for (Chain c : chains) {
- System.out.println(" Chain: " + c.getChainID() + " # groups with atoms: " + c.getAtomGroups().size());
+ System.out.println(" Chain: " + c.getId() + " # groups with atoms: " + c.getAtomGroups().size());
for (Group g: c.getAtomGroups()){
@@ -77,36 +76,35 @@ Here an example that loops over the whole data model and prints out the HEM grou
}
```
-## Working with groups
+## Working with Groups
-The [Group](http://www.biojava.org/docs/api/org/biojava/bio/structure/Group.html) interface defines all methods common to a group of atoms. There are 3 types of Groups:
+The [Group](http://www.biojava.org/docs/api/org/biojava/nbio/structure/Group.html) interface defines all methods common to a group of atoms. There are 3 types of Groups:
-* [AminoAcid](http://www.biojava.org/docs/api/org/biojava/bio/structure/AminoAcid.html)
-* [Nucleotide](http://www.biojava.org/docs/api/org/biojava/bio/structure/NucleotideImpl.html)
-* [Hetatom](http://www.biojava.org/docs/api/org/biojava/bio/structure/HetatomImpl.html)
+* [AminoAcid](http://www.biojava.org/docs/api4.2.1/org/biojava/nbio/structure/AminoAcid.html)
+* [Nucleotide](http://www.biojava.org/docs/api4.2.1/org/biojava/nbio/structure/NucleotideImpl.html)
+* [Hetatom](http://www.biojava.org/docs/api4.2.1/org/biojava/nbio/structure/HetatomImpl.html)
In order to get all amino acids that have been observed in a PDB chain, you can use the following utility method:
```java
- Chain chain = s.getChainByPDB("A");
- List groups = chain.getAtomGroups("amino");
+ Chain chain = structure.getPolyChainByPDB("A");
+ List groups = chain.getAtomGroups(GroupType.AMINOACID);
for (Group group : groups) {
- AminoAcid aa = (AminoAcid) group;
+ SecStrucInfo secStrucInfo = (SecStrucInfo) group.getProperty(Group.SEC_STRUC);
- // do something amino acid specific, e.g. print the secondary structure assignment
- System.out.println(aa + " " + aa.getSecStruc());
+ // print the secondary structure assignment
+ System.out.println(group + " -- " + secStrucInfo);
}
```
-
In a similar way you can access all nucleotide groups by
```java
- chain.getAtomGroups("nucleotide");
+ chain.getAtomGroups(GroupType.NUCLEOTIDE);
```
The Hetatom groups are access in a similar fashion:
```java
- chain.getAtomGroups("hetatm");
+ chain.getAtomGroups(GroupType.HETATM);
```
@@ -114,10 +112,10 @@ Since all 3 types of groups are implementing the Group interface, you can also i
```java
List allgroups = chain.getAtomGroups();
- for (Group group : groups) {
- if ( group instanceof AminoAcid) {
- AminoAcid aa = (AminoAcid) group;
- System.out.println(aa.getSecStruc());
+ for (Group group : allgroups) {
+ if (group.isAminoAcid()) {
+ SecStrucInfo secStrucInfo = (SecStrucInfo) group.getProperty(Group.SEC_STRUC);
+ System.out.println(group + " -- " + secStrucInfo);
}
}
```
@@ -128,7 +126,7 @@ The detection of the groups works really well in connection with the [Chemical C
## Entities and Chains
-Entities (in the BioJava API called compounds) are the distinct chemical components of structures in the PDB.
+Entities are the distinct chemical components of structures in the PDB.
Unlike chains, entities do not include duplicate copies and each entity is different from every other
entity in the structure. There are different types of entities. Polymer entities include Protein, DNA,
and RNA. Ligands are smaller chemical components that are not part of a polymer entity.
@@ -142,15 +140,15 @@ and beta. Each of the entities has two copies (= chains) in the structure. IN 4H
has the two chains with the IDs A, and C and beta the chains B, and D. In total, hemoglobin is
built up out of four chains.
-This prints all the compounds/entities in a structure
+This prints all the entities in a structure
```java
Structure structure = StructureIO.getStructure("4hhb");
System.out.println(structure);
- System.out.println(" # of compounds (entities) " + structure.getCompounds().size());
+ System.out.println(" # of compounds (entities) " + structure.getEntityInfos().size());
- for ( Compound entity: structure.getCompounds()) {
+ for ( EntityInfo entity: structure.getEntityInfos()) {
System.out.println(" " + entity);
}
```
@@ -160,3 +158,16 @@ This prints all the compounds/entities in a structure
+
+
+
+---
+
+Navigation:
+[Home](../README.md)
+| [Book 3: The Structure Modules](README.md)
+| Chapter 3 : Structure Data Model
+
+Prev: [Chapter 2 : First Steps](firststeps.md)
+
+Next: [Chapter 4 : Local Installations](caching.md)
diff --git a/structure/symmetry.md b/structure/symmetry.md
index e5f910a..cfe5186 100644
--- a/structure/symmetry.md
+++ b/structure/symmetry.md
@@ -1,16 +1,258 @@
-Detection of Protein Symmetry and Pseudo-symmetry using BioJava
+Protein Symmetry using BioJava
================================================================
-This chapter is still under construction. See the [protein symmetry](https://github.com/rcsb/symmetry) project for more information for now.
+BioJava can be used to detect, analyze, and visualize **symmetry** and
+**pseudo-symmetry** in the **quaternary** (biological assembly) and tertiary
+(**internal**) structural levels of proteins.
-BioJava can be used to
- - Detect, analyze, and visualize **protein symmetry**
- - Detect symmetry in **biological assemblies**
-
-
+## Quaternary Symmetry
- - Detect **internal pseudo-symmetry** in protein chains
-
-
+The **quaternary symmetry** of a structure defines the relation and arrangement of the individual chains or groups of chains that are part of a biological assembly.
+For a more exhaustive explanation about protein quaternary symmetery and the different types visit the [PDB help page](http://www.rcsb.org/pdb/staticHelp.do?p=help/viewers/jmol_symmetry_view.html).
-- Visualize results in [Jmol](http://www.jmol.org)
\ No newline at end of file
+In the **quaternary symmetry** detection problem, we are given a set of chains (subunits) that are part of a biological assembly as input, defined by their atomic coordinates, and we are required to find the higest overall symmetry group that
+relates them as ouptut.
+The solution is divided into the following steps:
+
+1. First, we need to identify the chains that are identical (or similar
+in the pseudo-symmetry case). For that purpose, we perform a pairwise alignment of all
+chains and identify **clusters of identical or similar subunits**.
+2. Next, we reduce each of the polypeptide chains to a single point, their **centroid** (center of mass).
+3. Afterwards, we try different **symmetry operations** using a grid search to superimpose the chain centroids
+and score them using the RMSD.
+4. Finally, based on the parameters (cutoffs), we determine the **overall symmetry** of the
+structure, with the symmetry relations obtained in the previous step.
+5. In case of asymmetric structure, we discard combinatorially a number of chains and try
+to detect any **local symmetries** present (symmetry that does not involve all subunits of the biological assembly).
+
+The **quaternary symmetry** detection algorithm is implemented in the biojava class
+[QuatSymmetryDetector](http://www.biojava.org/docs/api/org/biojava/nbio/structure/symmetry/core/QuatSymmetryDetector).
+An example of how to use it programatically is shown below:
+
+```java
+// First download the structure in the biological assembly form
+Structure s;
+
+// Set some parameters if needed different than DEFAULT - see descriptions
+QuatSymmetryParameters parameters = new QuatSymmetryParameters();
+SubunitClustererParameters clusterParams = new SubunitClustererParameters();
+
+// Instantiate the detector
+QuatSymmetryDetector detector = QuatSymmetryDetector(s, parameters, clusterParams);
+
+// Static methods in QuatSymmetryDetector perform the calculation
+QuatSymmetryResults globalResults = QuatSymmetryDetector.getGlobalSymmetry(s, parameters, clusterParams);
+List localResults = QuatSymmetryDetector.getLocalSymmetries(s, parameters, clusterParams);
+
+```
+See also the [demo](https://github.com/biojava/biojava/blob/885600670be75b7f6bc5216bff52a93f43fff09e/biojava-structure/src/main/java/demo/DemoSymmetry.java#L37-L59) provided in **BioJava** for a real case working example.
+
+The returned `QuatSymmetryResults` object contains all the information of the subunit clustering and structural symmetry.
+This object will be used later to obtain axes of symmetry, point group name, stoichiometry or even display the results in Jmol.
+The return object of quaternary symmetry (`QuatSymmetryResults`) contains the
+In case of asymmetrical structure, the result is a C1 point group.
+The return type of the local symmetry is a `List` because there can be multiple valid options of local symmetry.
+The list will be empty if there exist no local symmetries in the structure.
+
+
+### Global Symmetry
+
+In the **global symmetry** mode all chains have to be part of the symmetry result.
+
+#### Point Group
+
+In a **point group** a single or multiple rotation axes define the overall symmetry
+operations, with the property that all the axes coincide in the same point.
+
+
+
+#### Helical
+
+In **helical** symmetry there is a single axis with rotation and translation
+components.
+
+
+
+### Local Symmetry
+
+In **local symmetry** a number of chains is left out, so that the symmetry only applies to a subset of chains.
+
+
+
+### Pseudo-Symmetry
+
+In **pseudo-symmetry** the chains related by the symmetry are not completely
+identical, but they share a sequence or structural similarity above the pseudo-symmetry
+similarity threshold.
+
+If we consider hemoglobin, at a 95% sequence identity threshold the alpha and
+beta subunits are considered different, which correspond to an A2B2 stoichiometry
+and a C2 point group. At the structural similarity level, all four chains are
+considered homologous (~45% sequence identity) with an A4 pseudostoichiometry and
+D2 pseudosymmetry.
+
+
+
+## Internal Symmetry
+
+**Internal symmetry** refers to the symmetry present in a single chain, that is,
+the tertiary structure. The algorithm implemented in biojava to detect internal
+symmetry is called **CE-Symm**.
+
+### CE-Symm
+
+The **CE-Symm** algorithm was originally developed by [Myers-Turnbull D., Bliven SE.,
+Rose PW., Aziz ZK., Youkharibache P., Bourne PE. & Prlić A. in 2014]
+(http://www.sciencedirect.com/science/article/pii/S0022283614001557) [](http://www.ncbi.nlm.nih.gov/pubmed/24681267).
+As the name of the algorithm explicitly states, **CE-Symm** uses the Combinatorial
+Extension (**CE**) algorithm to generate an alignment of the structure chain to itself,
+disabling the identity alignment (the diagonal of the **DotPlot** representation of a
+structure alignment). This allows the identification of alternative self-alignments,
+which are related to symmetry and/or structural repeats inside the chain.
+
+By a procedure called **refinement**, the subunits of the chain that are part of the symmetry
+are defined and a **multiple alignment** is created. This process can be thought as to
+divide the chain into other subchains, and then superimposing each subchain to each other to
+create a multiple alignment of the subunits, respecting the symmetry axes.
+
+The **internal symmetry** detection algorithm is implemented in the biojava class
+[CeSymm](http://www.biojava.org/docs/api/org/biojava/nbio/structure/symmetry/internal/CeSymm).
+It returns a `MultipleAlignment` object, see the explanation of the model in [Data Models](alignment-data-model.md),
+that describes the similarity of the internal repeats. In case of no symmetry detected, the
+returned alignment represents the optimal self-alignment produced by the first step of the **CE-Symm**
+algorithm.
+
+```java
+//Input the atoms in a chain as an array
+Atom[] atoms = StructureTools.getRepresentativeAtomArray(chain);
+
+//Initialize the algorithm
+CeSymm ceSymm = new CeSymm();
+
+//Choose some parameters
+CESymmParameters params = ceSymm.getParameters();
+params.setRefineMethod(RefineMethod.SINGLE);
+params.setOptimization(true);
+params.setMultipleAxes(true);
+
+//Run the symmetry analysis - alignment as an output
+MultipleAlignment symmetry = ceSymm.analyze(atoms, params);
+
+//Test if the alignment returned was refined with
+boolean refined = SymmetryTools.isRefined(symmetry);
+
+//Get the axes of symmetry from the aligner
+SymmetryAxes axes = ceSymm.getSymmetryAxes();
+
+//Display the results in jmol with the SymmetryDisplay
+SymmetryDisplay.display(symmetry, axes);
+
+//Show the point group, if any of the internal symmetry
+QuatSymmetryResults pg = SymmetryTools.getQuaternarySymmetry(symmetry);
+System.out.println(pg.getSymmetry());
+
+```
+
+To enable some extra features in the display, a `SymmetryDisplay`
+class has been created, although the `MultipleAlignmentDisplay` method
+can also be used for that purpose (it will not show symmetry axes or
+symmetry menus).
+
+Lastly, the `SymmetryGUI` class in the **structure-gui** package
+provides a GUI to trigger internal symmetry analysis, equivalent
+to the GUI to trigger structure alignments.
+
+### Symmetry Display
+
+The symmetry display is similar to the **quaternary symmetry**, because
+part of the code is shared. See for example this beta-propeller (1U6D),
+where the repeated beta-sheets are connected by a linker forming a C6
+point group internal symmetry:
+
+
+
+#### Hierarchical Symmetry
+
+One additional feature of the **internal symmetry** display is the representation
+of hierarchical symmetries and repeats. Contrary to point groups, some structures
+have different **levels** of symmetry. That is, the whole strucutre has, e.g. C2
+symmetry and, at the same time, each of the two parts has C2 symmetry, but the axes
+of both levels are not related by a point group (i.e. they do not cross to a single
+point).
+
+A very clear example are the beta-gamma-crystallins, like 4GCR:
+
+
+
+#### Subunit Multiple Alignment
+
+Another feature of the display is the option to show the **multiple alignment** of
+the symmetry related subunits created during the **refinement** process. Search for
+the option *Subunit Superposition* in the *symmetry* menu of the Jmol window. For
+the previous example the display looks like that:
+
+
+
+The subunit display highlights the differences and similarities between the symmetry
+related subunits of the chain, and helps the user to identify conseved and divergent
+regions, with the help of the *Sequence Alignment Panel*.
+
+## Quaternary + Internal Overall Symmetry
+
+Finally, the internal and quaternary symmetries can be merged to obtain the
+overall combined symmetry. As we have seen before, the protein 1VYM is a DNA-clamp that
+has three chains arranged in a C3 symmetry.
+Each chain is internally fourfold symmetric with two levels of symmetry. We can analyze the overall symmetry of the structure by considering together the C3 quaternary symmetry and the fourfold internal symmetry.
+In this case, the internal symmetry **augments** the point group of the quaternary symmetry to a D6 overall symmetry, as we can see in the figure below:
+
+
+
+An example of how to toggle the **combined symmetry** (quaternary + internal symmetries) programatically is shown below:
+
+```java
+// First download the structure in the biological assembly form
+Structure s;
+
+// Initialize default parameters
+QuatSymmetryParameters parameters = new QuatSymmetryParameters();
+SubunitClustererParameters clusterParams = new SubunitClustererParameters();
+
+// In SubunitClustererParameters set the clustering method to STRUCTURE and the internal symmetry option to true
+clusterParams.setClustererMethod(SubunitClustererMethod.STRUCTURE);
+clusterParams.setInternalSymmetry(true);
+
+// You can lower the default structural coverage to improve the recall
+clusterParams.setStructureCoverageThreshold(0.75);
+
+// Instantiate the detector
+QuatSymmetryDetector detector = QuatSymmetryDetector(s, parameters, clusterParams);
+
+// Static methods in QuatSymmetryDetector perform the calculation
+QuatSymmetryResults overallResults = QuatSymmetryDetector.getGlobalSymmetry(s, parameters, clusterParams);
+
+```
+
+See also the [test](https://github.com/biocryst/biojava/blob/df22da37a86a0dba3fb35bee7e17300d402ab469/biojava-integrationtest/src/test/java/org/biojava/nbio/structure/test/symmetry/TestQuatSymmetryDetectorExamples.java#L167-L192) provided in **BioJava** for a real case working example.
+
+
+## Please Cite
+
+**Analyzing the symmetrical arrangement of structural repeats in proteins with CE-Symm**
+*Spencer E Bliven, Aleix Lafita, Peter W Rose, Guido Capitani, Andreas Prlić, & Philip E Bourne*
+[PLOS Computational Biology (2019) 15 (4):e1006842.](https://journals.plos.org/ploscompbiol/article/citation?id=10.1371/journal.pcbi.1006842)
+[](https://doi.org/10.1371/journal.pcbi.1006842) [](http://www.ncbi.nlm.nih.gov/pubmed/31009453)
+
+
+
+
+
+---
+
+Navigation:
+[Home](../README.md)
+| [Book 3: The Structure Modules](README.md)
+| Chapter 14 : Protein Symmetry
+
+Prev: [Chapter 13 - Finding all Interfaces in Crystal: Crystal Contacts](crystal-contacts.md)
+
+Next: [Chapter 15 : Protein Secondary Structure](secstruc.md)