Skip to content

Commit e7235d4

Browse files
committed
Correct significance criteria for internal symmetry
The score threhold is imposed on the self-alignment, and a 90% of the threshold is imposed after refinement.
1 parent 0ad855f commit e7235d4

5 files changed

Lines changed: 58 additions & 82 deletions

File tree

biojava-structure-gui/src/main/java/org/biojava/nbio/structure/symmetry/gui/SymmetryDisplay.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public static MultipleAlignmentJmol displayFull(CeSymmResult symm)
102102
public static AbstractAlignmentJmol display(CeSymmResult symmResult)
103103
throws StructureException {
104104

105-
if (symmResult.isSignificant()) {
105+
if (symmResult.isRefined()) {
106106
MultipleAlignment msa = symmResult.getMultipleAlignment();
107107
List<Atom[]> atoms = msa.getAtomArrays();
108108
MultipleAlignmentJmol jmol = new MultipleAlignmentJmol(msa, atoms);
@@ -211,10 +211,11 @@ public static String printSymmetryAxes(CeSymmResult symm, boolean elementary) {
211211
* @param symm
212212
* CeSymmResult
213213
* @return
214+
* @throws StructureException
214215
*/
215-
public static String printSymmetryGroup(CeSymmResult symm) {
216+
public static String printSymmetryGroup(CeSymmResult symm) throws StructureException {
216217

217-
QuatSymmetryResults gSymmetry = symm.getSymmGroup();
218+
QuatSymmetryResults gSymmetry = SymmetryTools.getQuaternarySymmetry(symm);
218219

219220
AxisAligner axes = AxisAligner.getInstance(gSymmetry);
220221

biojava-structure/src/main/java/org/biojava/nbio/structure/symmetry/internal/CeSymm.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,12 @@ protected static CeSymmResult align(Atom[] atoms, CESymmParameters params)
248248
// Store the optimal self-alignment
249249
result.setSelfAlignment(optimalAFP);
250250
result.setStructureId(id);
251+
252+
// Do not try the refinement if the self-alignment is not significant
253+
if (optimalAFP.getTMScore() < params.getScoreThreshold()){
254+
result.setSymmOrder(1);
255+
return result;
256+
}
251257

252258
// Determine the symmetry Type or get the one in params
253259
if (params.getSymmType() == SymmetryType.AUTO) {
@@ -407,7 +413,7 @@ public static CeSymmResult analyze(Atom[] atoms, CESymmParameters params)
407413
CeSymmIterative iter = new CeSymmIterative(params);
408414
CeSymmResult result = iter.execute(atoms);
409415

410-
if (result.isSignificant()) {
416+
if (result.isRefined()) {
411417
// Optimize the global alignment freely once more (final step)
412418
if (params.getOptimization() && result.getSymmLevels() > 1) {
413419
// Remove the axes to do free superposition optimization TODO

biojava-structure/src/main/java/org/biojava/nbio/structure/symmetry/internal/CeSymmResult.java

Lines changed: 36 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.biojava.nbio.structure.align.multiple.Block;
1515
import org.biojava.nbio.structure.align.multiple.MultipleAlignment;
1616
import org.biojava.nbio.structure.align.multiple.util.MultipleAlignmentScorer;
17-
import org.biojava.nbio.structure.symmetry.core.QuatSymmetryResults;
1817
import org.biojava.nbio.structure.symmetry.internal.CESymmParameters.RefineMethod;
1918
import org.biojava.nbio.structure.symmetry.internal.CESymmParameters.SymmetryType;
2019
import org.biojava.nbio.structure.symmetry.utils.SymmetryTools;
@@ -38,48 +37,42 @@ public class CeSymmResult {
3837

3938
private CESymmParameters params;
4039
private SymmetryAxes axes;
41-
private QuatSymmetryResults symmGroup;
40+
private String symmGroup;
4241

4342
private int symmOrder;
4443
private int symmLevels;
4544
private boolean refined;
4645
private SymmetryType type;
4746

4847
/**
49-
* Return true if the symmetry result is significant, false otherwise.
48+
* Conditions checked are: score above the threshold, order higher than 1
49+
* and refinement succeeded.
5050
*
5151
* @return true if significant, false otherwise
5252
*/
5353
public boolean isSignificant() {
5454

5555
// In any case if the order is 1 it is asymmetric
56-
if (symmOrder < 1)
56+
if (symmOrder < 2)
5757
return false;
5858

59-
// If the old version was turned ON
60-
if (params.getRefineMethod() == RefineMethod.NOT_REFINED) {
61-
if (selfAlignment.getTMScore() < params.getScoreThreshold())
62-
return false;
63-
else
64-
return true;
65-
}
59+
// If the TM-Score is below the threshold
60+
if (selfAlignment.getTMScore() < params.getScoreThreshold())
61+
return false;
6662

67-
// For the new version
68-
if (refined) {
69-
// Length is over min length
70-
if (symmLevels > 1)
71-
return true; // significance already checked
72-
else if (multipleAlignment.getCoreLength() < params
73-
.getMinCoreLength())
63+
// If the refinement was attempted
64+
if (params.getRefineMethod() != RefineMethod.NOT_REFINED) {
65+
// Check for minimum length
66+
if (multipleAlignment.getCoreLength() < params.getMinCoreLength())
7467
return false;
75-
else if (multipleAlignment
76-
.getScore(MultipleAlignmentScorer.AVGTM_SCORE) < params
77-
.getScoreThreshold())
68+
// Allow 90% of original TM-Score theshold
69+
if (multipleAlignment.getScore(MultipleAlignmentScorer.AVGTM_SCORE) < params
70+
.getScoreThreshold() * 0.9)
7871
return false;
79-
else
80-
return true;
81-
} else
82-
return false;
72+
return true;
73+
}
74+
75+
return true;
8376
}
8477

8578
/**
@@ -91,12 +84,9 @@ else if (multipleAlignment
9184
*/
9285
public List<StructureIdentifier> getRepeatsID() throws StructureException {
9386

94-
if (!isSignificant())
95-
return null;
96-
97-
if(!isRefined())
87+
if (!isRefined())
9888
return null;
99-
89+
10090
List<StructureIdentifier> repeats = new ArrayList<StructureIdentifier>(
10191
symmOrder);
10292

@@ -121,9 +111,9 @@ public List<StructureIdentifier> getRepeatsID() throws StructureException {
121111

122112
@Override
123113
public String toString() {
124-
return structureId + ", symmGroup=" + symmGroup.getSymmetry()
125-
+ ", symmOrder=" + symmOrder + ", symmLevels=" + symmLevels
126-
+ ", refined=" + refined + ", type=" + type + " | " + params;
114+
return structureId + ", symmGroup=" + symmGroup + ", symmOrder="
115+
+ symmOrder + ", symmLevels=" + symmLevels + ", refined="
116+
+ refined + ", type=" + type + " | " + params;
127117
}
128118

129119
public MultipleAlignment getMultipleAlignment() {
@@ -183,19 +173,25 @@ public void setRefined(boolean refined) {
183173
this.refined = refined;
184174
}
185175

186-
public QuatSymmetryResults getSymmGroup() {
187-
// Lazily calculate the symmetry group
176+
public String getSymmGroup() {
177+
// Lazily calculate the symmetry group if significant
188178
if (symmGroup == null) {
189-
try {
190-
symmGroup = SymmetryTools.getQuaternarySymmetry(this);
191-
} catch (StructureException e) {
192-
e.printStackTrace();
179+
if (isRefined() && isSignificant()) {
180+
try {
181+
symmGroup = SymmetryTools.getQuaternarySymmetry(this)
182+
.getSymmetry();
183+
} catch (StructureException e) {
184+
symmGroup = "C1";
185+
}
186+
if (symmGroup.equals("C1"))
187+
symmGroup = "R";
193188
}
189+
symmGroup = "C1";
194190
}
195191
return symmGroup;
196192
}
197193

198-
public void setSymmGroup(QuatSymmetryResults symmGroup) {
194+
public void setSymmGroup(String symmGroup) {
199195
this.symmGroup = symmGroup;
200196
}
201197

@@ -231,31 +227,4 @@ public void setStructureId(StructureIdentifier structureId) {
231227
this.structureId = structureId;
232228
}
233229

234-
/**
235-
* Returns the TM-Score of the symmetry alignment, independently of the
236-
* state of the result (MultipleAlignment or AFPChain).
237-
*
238-
* @return TM-score
239-
*/
240-
public double getTMScore() {
241-
if (multipleAlignment != null)
242-
return multipleAlignment
243-
.getScore(MultipleAlignmentScorer.AVGTM_SCORE);
244-
else
245-
return selfAlignment.getTMScore();
246-
}
247-
248-
/**
249-
* Returns the RMSD of the symmetry alignment, independently of the state of
250-
* the result (MultipleAlignment or AFPChain).
251-
*
252-
* @return RMSD
253-
*/
254-
public double getRMSD() {
255-
if (multipleAlignment != null)
256-
return multipleAlignment.getScore(MultipleAlignmentScorer.RMSD);
257-
else
258-
return selfAlignment.getTotalRmsdOpt();
259-
}
260-
261230
}

biojava-structure/src/main/java/org/biojava/nbio/structure/symmetry/utils/SymmetryTools.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ public static Structure getQuaternaryStructure(CeSymmResult symmetry) {
516516
char chainID = 'A';
517517

518518
// Create new structure containing the repeat atoms
519-
for (int i = 0; i < symmetry.getSymmOrder(); i++) {
519+
for (int i = 0; i < symmetry.getMultipleAlignment().size(); i++) {
520520

521521
Chain newCh = new ChainImpl();
522522

@@ -849,15 +849,15 @@ public static boolean isSignificant(MultipleAlignment msa,
849849
return false;
850850

851851
// TM-score cutoff
852-
if (msa.getScore(MultipleAlignmentScorer.AVGTM_SCORE) == null) {
853-
double tm = MultipleAlignmentScorer.getAvgTMScore(msa);
854-
if (tm < symmetryThreshold)
855-
return false;
856-
} else {
857-
double tm = msa.getScore(MultipleAlignmentScorer.AVGTM_SCORE);
858-
if (tm < symmetryThreshold)
859-
return false;
860-
}
852+
double tm = 0.0;
853+
if (msa.getScore(MultipleAlignmentScorer.AVGTM_SCORE) == null)
854+
tm = MultipleAlignmentScorer.getAvgTMScore(msa);
855+
else
856+
tm = msa.getScore(MultipleAlignmentScorer.AVGTM_SCORE);
857+
858+
if (tm < symmetryThreshold)
859+
return false;
860+
861861
return true;
862862
}
863863

biojava-structure/src/test/java/org/biojava/nbio/structure/symmetry/internal/TestCeSymm.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
public class TestCeSymm {
4343

4444
@Test
45-
public void testIndependence() throws IOException, StructureException {
45+
public void testEasyCases() throws IOException, StructureException {
4646

4747
String[] names = new String[] { "1hiv.A", "4i4q", "1n0r.A"};
4848
int[] orders = new int[] { 2, 3, 4 };

0 commit comments

Comments
 (0)