void PeptideBuilder::setOmega_(Residue& resold, Residue& resnew, const Angle& omega) { PDBAtom* pcarbon = getAtomByName_(resold, "C"); PDBAtom* pnitrogen_n = getAtomByName_(resnew, "N"); Vector3 C_NN_axis =(pnitrogen_n->getPosition() - pcarbon->getPosition()).normalize(); // At this point, omega has been fixed to 180 degrees Matrix4x4 mat; mat.setRotation(Angle(omega-Angle(Constants::PI)), C_NN_axis); TransformationProcessor omegatrans(mat); // translate to 0|0|0 (needed for the rotation) Vector3 toOrigin = pnitrogen_n->getPosition(); TranslationProcessor translation; translation.setTranslation(((float)(-1.))*toOrigin); resnew.apply(translation); // rotate resnew.apply(omegatrans); // translate back to the correct position translation.setTranslation(toOrigin); resnew.apply(translation); return; }
void PeptideCapProcessor::optimizeCapPosition(Chain& chain, bool start) { Vector3 translation; Atom* axis = NULL; Residue* cap = NULL; std::vector<Atom*> a; std::vector<Atom*> b; Size nr = chain.countResidues(); // cap at the beginning of a peptide if (start) { // put ACE-C to the center for (AtomIterator it = chain.getResidue(1)->beginAtom(); +it; ++it) { if (it->getName() == "N") { translation = it->getPosition(); } b.push_back(&*it); } cap = chain.getResidue(0); for (AtomIterator it = cap->beginAtom(); +it; ++it) { a.push_back(&*it); if (it->getName() == "C") { axis = &*it; } } } //cap at the end of a peptide else { for (AtomIterator it = chain.getResidue(nr-2)->beginAtom(); +it; ++it) { if (it->getName() == "C") { translation = it->getPosition(); } b.push_back(&*it); } cap = chain.getResidue(nr-1); for (AtomIterator it = cap->beginAtom(); +it; ++it) { a.push_back(&*it); if (it->getName() == "N") { axis = &*it; } } } //translate the anchor to origin TranslationProcessor tlp; tlp.setTranslation(translation*-1.0); chain.apply(tlp); //try all torsions float largest_distance = 0.0; float tmp_distance = 0.0; float torsion = 0.0; float step = 2.0; TransformationProcessor tfp; Matrix4x4 m; m.setRotation( Angle(step, false), axis->getPosition()); tfp.setTransformation(m); for (Position r = step; r <= 360; r+=step) { cap->apply(tfp); tmp_distance = computeDistance(a,b); if (largest_distance < tmp_distance) { largest_distance = tmp_distance; torsion = r; } } //apply best rotation angle m.setRotation( Angle(torsion, false), axis->getPosition()); tfp.setTransformation(m); cap->apply(tfp); //now translate the protein back tlp.setTranslation(translation); chain.apply(tlp); }
void EditMode::addStructure_() { QAction* action = dynamic_cast<QAction*>(sender()); if (action == 0) return; String name = ascii(action->text()); scene_->deselect(); if (!fragment_db_) { fragment_db_ = new FragmentDB("fragments/Editing-Fragments.db"); } list<AtomContainer*> containers = scene_->getContainers(); if (containers.size() == 0) return; Residue* residue = fragment_db_->getResidueCopy(name); if (residue == 0) { residue = fragment_db_->getResidueCopy(name + "-Skeleton"); if (residue == 0) return; } Vector3 p; Size nr = 0; AtomIterator ait = residue->beginAtom(); for (;+ait; ++ait) { p += ait->getPosition(); nr++; } if (nr == 0) { BALLVIEW_DEBUG delete residue; return; } p /= (float) nr; QPoint pos = scene_->mapFromGlobal(mouse_pos_new_); Matrix4x4 m; Vector3 x = scene_->mapViewportTo3D(pos.x(), pos.y()); TransformationProcessor tf; Vector3 vv = scene_->getStage()->getCamera().getViewVector(); float l = vv.getLength(); if (!Maths::isZero(l)) vv /= l; Vector3 axis = Vector3(1,0,0) % vv; if (axis.getSquareLength() != 0) { Angle a = vv.getAngle(Vector3(1,0,0)); m.setRotation(a, axis); tf.setTransformation(m); residue->apply(tf); } m.setTranslation(x - p); tf.setTransformation(m); residue->apply(tf); AtomContainer* s = *containers.begin(); if (RTTI::isKindOf<System>(*s)) { System* system = (System*) s; Molecule* mol = system->getMolecule(0); if (mol == 0) { mol = new Molecule(); system->insert(*mol); } s = mol; } s->insert(*residue); scene_->getMainControl()->deselectCompositeRecursive(s, true); scene_->getMainControl()->selectCompositeRecursive(residue, true); scene_->getMainControl()->update(*s); scene_->notify(new NewSelectionMessage); // setMode(MOVE__MODE); }
void PeptideBuilder::transform_ (const Angle& phi, const Angle& psi, Residue& resold, Residue& resnew) { Matrix4x4 psimat; // rotation matrix Matrix4x4 phimat; // " Vector3 psiaxis; // rotation axis for the torsion angles Vector3 phiaxis; TranslationProcessor translation; PDBAtom* pcarbon = getAtomByName_(resold, "C"); PDBAtom* pcarbona = getAtomByName_(resold, "CA"); PDBAtom* pnitrogen_n = getAtomByName_(resnew, "N"); PDBAtom* pcarbona_n = getAtomByName_(resnew, "CA"); PDBAtom* pcarbon_n = getAtomByName_(resnew, "C"); PDBAtom* pnitrogen = getAtomByName_(resold, "N"); Angle currentpsi; Angle currentphi; Vector3 v_pn = pnitrogen->getPosition(); Vector3 v_pca = pcarbona->getPosition(); Vector3 v_pc = pcarbon->getPosition(); Vector3 v_pn_n = pnitrogen_n->getPosition(); Vector3 v_pca_n = pcarbona_n->getPosition(); Vector3 v_pc_n = pcarbon_n->getPosition(); currentpsi = getTorsionAngle( v_pn.x, v_pn.y, v_pn.z, v_pca.x, v_pca.y, v_pca.z, v_pc.x, v_pc.y, v_pc.z, v_pn_n.x, v_pn_n.y, v_pn_n.z); psiaxis = ( pcarbon->getPosition() - pcarbona->getPosition()).normalize(); psimat.rotate((float)-1. * currentpsi, psiaxis); TransformationProcessor psitrans(psimat); //translate to 0|0|0 (needed for the rotation) Vector3 toOrigin = pcarbon->getPosition(); translation.setTranslation(((float)(-1.))*toOrigin); resnew.apply(translation); //rotate resnew.apply(psitrans); psimat.rotate(psi, psiaxis); psitrans.setTransformation(psimat); resnew.apply(psitrans); //translate back translation.setTranslation(toOrigin); resnew.apply(translation); v_pn = pnitrogen->getPosition(); v_pca = pcarbona->getPosition(); v_pc = pcarbon->getPosition(); v_pn_n = pnitrogen_n->getPosition(); v_pca_n = pcarbona_n->getPosition(); v_pc_n = pcarbon_n->getPosition(); currentphi = getTorsionAngle( v_pc.x, v_pc.y, v_pc.z, v_pn_n.x, v_pn_n.y, v_pn_n.z, v_pca_n.x, v_pca_n.y, v_pca_n.z, v_pc_n.x, v_pc_n.y, v_pc_n.z); phiaxis = (pcarbona_n->getPosition() - pnitrogen_n->getPosition()).normalize(); phimat.rotate(phi, phiaxis); TransformationProcessor phitrans(phimat); // translate to 0|0|0 (needed for the rotation) toOrigin = pcarbona_n->getPosition(); translation.setTranslation(((float)(-1.))*toOrigin); resnew.apply(translation); // rotate resnew.apply(phitrans); // translate back to the correct position translation.setTranslation(toOrigin); resnew.apply(translation); return; }
void PeptideBuilder::insert_(Residue& resnew, Residue& resold) { PDBAtom* pcarbon = getAtomByName_(resold, "C"); PDBAtom* pcarbona = getAtomByName_(resold, "CA"); PDBAtom* pnitrogen = getAtomByName_(resold, "N"); PDBAtom* pnitrogen_n = getAtomByName_(resnew, "N"); PDBAtom* pcarbona_n = getAtomByName_(resnew, "CA"); PDBAtom* pcarbon_n = getAtomByName_(resnew, "C"); Vector3 rot_axis; // axis for the torsion angle // set C-N-bond pcarbon->createBond(*pnitrogen_n)->setOrder(Bond::ORDER__SINGLE);; // -------------- move N into 0|0|0 TranslationProcessor translation(Vector3(BOND_LENGTH_N_CA, 0., 0.)); resnew.apply(translation); // --------------- calculate the coordinates for N Vector3 CA_C_axis = (pcarbon->getPosition() - pcarbona->getPosition()).normalize(); Vector3 N_CA_axis = (pcarbona->getPosition() - pnitrogen->getPosition()).normalize(); Vector3 CA_N_axis = ((float)-1.) * N_CA_axis; Vector3 newpos = (CA_N_axis - (CA_C_axis * CA_N_axis) * CA_C_axis).normalize(); Vector3 normaxis = (CA_C_axis % newpos).normalize(); Matrix4x4 mat; mat.setRotation(Angle(-1. * 30.* Constants::PI/180.), normaxis); newpos = mat * newpos; // rotation newpos = newpos * BOND_LENGTH_N_C; // scaling of the bond length newpos = newpos + pcarbon->getPosition(); // positioning of the nitrogen translation.setTranslation(newpos); resnew.apply(translation); //---------------set the angle in NN to 120 degrees Vector3 NN_C_axis = pcarbon->getPosition() - pnitrogen_n->getPosition(); Vector3 NN_NCA_axis = pcarbona_n->getPosition() - pnitrogen_n->getPosition(); CA_C_axis = pcarbon->getPosition() - pcarbona->getPosition(); // current angle for C Angle current(acos(NN_C_axis * NN_NCA_axis / (NN_C_axis.getLength() * NN_NCA_axis.getLength() ))); Matrix4x4 transmat; Vector3 rotaxis; if (current < (float)(Constants::PI - 1e-2)) { current = Angle(120.*Constants::PI/180.) - current; rotaxis = (NN_C_axis%NN_NCA_axis).normalize(); } else { if (current > (float)(Constants::PI+1e-2)) { // is this line really correct??? current = Angle(-120. * 120. * Constants::PI / 180.) - current; rotaxis = (NN_C_axis % NN_NCA_axis).normalize(); } else { current = Angle(-120. * Constants::PI / 180.) - current; rotaxis = (NN_C_axis%CA_C_axis).normalize(); } } transmat.rotate(current, rotaxis); TransformationProcessor transformation(transmat); // translate to 0|0|0 (needed for the rotation) Vector3 toOrigin = pnitrogen_n->getPosition(); translation.setTranslation(((float)(-1.))*toOrigin); resnew.apply(translation); // rotate in 0|0|0 resnew.apply(transformation); // translate back to the correct position translation.setTranslation(toOrigin); resnew.apply(translation); //---------------- set torsion angle to 0 Vector3 v_pca = pcarbona->getPosition(); Vector3 v_pc = pcarbon->getPosition(); Vector3 v_pn_n = pnitrogen_n->getPosition(); Vector3 v_pca_n = pcarbona_n->getPosition(); Vector3 v_pc_n = pcarbon_n->getPosition(); Vector3 v_pn =pnitrogen->getPosition(); current = getTorsionAngle( v_pca.x, v_pca.y, v_pca.z, v_pc.x, v_pc.y, v_pc.z, v_pn_n.x, v_pn_n.y, v_pn_n.z, v_pca_n.x, v_pca_n.y, v_pca_n.z ); rot_axis = (pnitrogen_n->getPosition() - pcarbon->getPosition()).normalize(); transmat.getZero();/// is this necessary??? transmat.rotate(Angle(-1. * current), rot_axis); transformation.setTransformation(transmat); // translate to 0|0|0 toOrigin = pnitrogen_n->getPosition(); translation.setTranslation(((float)(-1.))*toOrigin); resnew.apply(translation); // set torsion angles resnew.apply(transformation); // translate back translation.setTranslation(toOrigin); resnew.apply(translation); // ---------------------set the peptide bond angle omega to 180 degrees v_pca = pcarbona->getPosition(); v_pc = pcarbon->getPosition(); v_pn_n = pnitrogen_n->getPosition(); v_pca_n = pcarbona_n->getPosition(); v_pc_n = pcarbon_n->getPosition(); current = getTorsionAngle( v_pca.x, v_pca.y, v_pca.z, v_pc.x, v_pc.y, v_pc.z, v_pn_n.x, v_pn_n.y, v_pn_n.z, v_pca_n.x, v_pca_n.y, v_pca_n.z ); transmat.getZero(); transmat.rotate( Angle(Constants::PI , true), (pnitrogen_n->getPosition() - pcarbon->getPosition()).normalize()); transformation.setTransformation(transmat); // translate to 0|0|0 (needed for the rotation) toOrigin = pnitrogen_n->getPosition(); translation.setTranslation(((float)(-1.))*toOrigin); resnew.apply(translation); //rotate in 0|0|0 about 180 degrees resnew.apply(transformation); //translate back translation.setTranslation(toOrigin); resnew.apply(translation); //------------- angle psi v_pca = pcarbona->getPosition(); v_pc = pcarbon->getPosition(); v_pn_n = pnitrogen_n->getPosition(); v_pca_n = pcarbona_n->getPosition(); v_pc_n = pcarbon_n->getPosition(); current = getTorsionAngle( v_pc.x, v_pc.y, v_pc.z, v_pn_n.x, v_pn_n.y, v_pn_n.z, v_pca_n.x, v_pca_n.y, v_pca_n.z, v_pc_n.x, v_pc_n.y, v_pc_n.z ); rot_axis = (pcarbona_n->getPosition()-pnitrogen_n->getPosition()).normalize(); transmat.rotate(Angle(-1. * current), rot_axis); transformation.setTransformation(transmat); //translate to 0|0|0 (needed for the rotation) toOrigin = pcarbona_n->getPosition(); translation.setTranslation(((float)(-1.))*toOrigin); resnew.apply(translation); resnew.apply(transformation); // translate back to the correct position translation.setTranslation(toOrigin); resnew.apply(translation); return; }