use of ffx.potential.bonded.NACorrectionException in project ffx by mjschnie.
the class RotamerOptimization method eliminateNABackboneRotamers.
/**
* Eliminates NA backbone rotamers with corrections greater than threshold.
* The int[] parameter allows the method to know how many Rotamers for each
* residue have previously been pruned; currently, this means any Rotamer
* pruned by reconcileNARotamersWithPriorResidues.
* <p>
* A nucleic correction threshold of 0 skips the entire method; this check
* is presently being performed inside the method in case it is called again
* at some point.
*
* @param residues Residues to eliminate bad backbone rotamers over.
* @param numEliminatedRotamers Number of previously eliminated rotamers per
* residue.
*/
private void eliminateNABackboneRotamers(Residue[] residues, int[] numEliminatedRotamers) {
/* Atom atoms[] = molecularAssembly.getAtomArray();
int nAtoms = atoms.length;
String begin[] = new String[nAtoms];
for (int i = 0; i < nAtoms; i++) {
begin[i] = atoms[i].toString();
} */
if (nucleicCorrectionThreshold != 0) {
logIfMaster(format(" Eliminating nucleic acid rotamers with correction vectors larger than %5.3f A", nucleicCorrectionThreshold));
logIfMaster(format(" A minimum of %d rotamers per NA residue will carry through to energy calculations.", minNumberAcceptedNARotamers));
ArrayList<Residue> resList = new ArrayList<>();
resList.addAll(Arrays.asList(residues));
ResidueState[] origCoordinates = ResidueState.storeAllCoordinates(resList);
for (int j = 0; j < residues.length; j++) {
Residue nucleicResidue = residues[j];
Rotamer[] rotamers = nucleicResidue.getRotamers(library);
if (nucleicResidue.getResidueType() == NA && rotamers != null) {
int nrotamers = rotamers.length;
// Default to all rotamers that have not previously been
// eliminated; subtract as rotamers are rejected.
int numAcceptedRotamers = nrotamers - numEliminatedRotamers[j];
if (minNumberAcceptedNARotamers >= numAcceptedRotamers) {
continue;
}
ArrayList<DoubleIndexPair> rejectedRotamers = new ArrayList<>();
for (int i = 0; i < nrotamers; i++) {
if (!check(j, i)) {
try {
RotamerLibrary.applyRotamer(nucleicResidue, rotamers[i], nucleicCorrectionThreshold);
} catch (NACorrectionException error) {
double rejectedCorrection = error.getCorrection();
numAcceptedRotamers--;
DoubleIndexPair rejected = new DoubleIndexPair(i, rejectedCorrection);
rejectedRotamers.add(rejected);
}
}
}
int numAdditionalRotamersToAccept = minNumberAcceptedNARotamers - numAcceptedRotamers;
if (numAdditionalRotamersToAccept > 0) {
DoubleIndexPair[] rejectedArray = new DoubleIndexPair[rejectedRotamers.size()];
for (int i = 0; i < rejectedArray.length; i++) {
rejectedArray[i] = rejectedRotamers.get(i);
}
Arrays.sort(rejectedArray);
rejectedRotamers = new ArrayList<>();
rejectedRotamers.addAll(Arrays.asList(rejectedArray));
for (int i = 0; i < numAdditionalRotamersToAccept; i++) {
rejectedRotamers.remove(0);
}
}
for (DoubleIndexPair rotToReject : rejectedRotamers) {
eliminateRotamer(residues, j, rotToReject.getIndex(), print);
logIfMaster(format(" Correction magnitude was %6.4f A > %5.3f A", rotToReject.getDoubleValue(), nucleicCorrectionThreshold));
}
}
nucleicResidue.revertState(origCoordinates[j]);
// revertSingleResidueCoordinates(nucleicResidue, originalCoordinates[j]);
}
}
}
Aggregations