void Docking::dockingSearchTest(double R, double beta1, double gamma1, double beta2, double gamma2,vector <pair<double, ScoreConfiguration> >& scores) { RotationMatrix rotationMatrixGamma1, rotationMatrixBeta1; RotationMatrix rotationMatrixGamma2, rotationMatrixBeta2; rotationMatrixGamma1.calculateMatrix(receptor_.getOrder(), RotationAngle( 0, gamma1) ); rotationMatrixBeta1.calculateMatrix(receptor_.getOrder(), RotationAngle( beta1, 0.0) ); rotationMatrixGamma2.calculateMatrix(receptor_.getOrder(), RotationAngle( 0, gamma2) ); rotationMatrixBeta2.calculateMatrix(receptor_.getOrder(), RotationAngle( beta2, 0.0)); rotReceptor_ = new Protein[1]; rotLigand_ = new Protein[alphaSize_]; receptor_.rotateTo(rotReceptor_[0], rotationMatrixGamma1); rotReceptor_[0].rotate(rotationMatrixBeta1); ligand_.rotateTo (rotLigand_[0], rotationMatrixGamma2); rotLigand_[0].rotate(rotationMatrixBeta2); Protein *transTmp; if (R > 0) { transTmp = new Protein; char buffer[100]; sprintf(buffer, "%s/%d/%.6lf.dat", translationPath_.c_str(), receptor_.getOrder(), R); TranslationMatrix translationmatrix(buffer); rotReceptor_[0].translateTo(*transTmp, translationmatrix); }else { transTmp = &rotReceptor_[0]; } set <pair<double, ScoreConfiguration> > bestScores; scores.clear(); double minScore = 10000000.0, maxScore = -10000000.0; for (int j = 1; j < alphaSize_; ++j) { rotLigand_[0].rotateTo(rotLigand_[j], ((2.0*PI)/alphaSize_) * j); double tmpScore = scoreIt(*transTmp, rotLigand_[j], penalty_); printf("%lf \n", tmpScore); bestScores.insert(make_pair(tmpScore,ScoreConfiguration(R, ((2.0*PI)/alphaSize_) * j, beta1, gamma1, beta2, gamma2))); minScore = min(minScore, tmpScore); maxScore = max(maxScore, tmpScore); while ((int)bestScores.size() > scoresSize_) { bestScores.erase(bestScores.begin()); } } printf("For R:%lf min score is %lf; max score is %lf\n",R, minScore, maxScore); for (set <pair<double, ScoreConfiguration> >::iterator itr = bestScores.begin(); itr != bestScores.end(); ++itr) { scores.push_back(*itr); } if (R>0) delete transTmp; }
void Docking::dockingSearch(vector <pair<double, ScoreConfiguration> >& scores, vector<double> RadiusSet, vector<double>& MaxScoresRadius) { int raSize = 20*(1<<(tessellationOrder_*2))+1; set <pair<double, ScoreConfiguration> > bestScores; preDockingCalculateRotations(); //precalculation of all rotations Protein *transTmp = new Protein; //printf("Starting docking search...\n"); //scores.clear(); for (unsigned int radiusIndex = 0; radiusIndex < RadiusSet.size(); ++radiusIndex) { double R = RadiusSet[radiusIndex]; double minScore = 10000000.0, maxScore = -10000000.0; char buffer[100]; sprintf(buffer, "%s/%d/%.6lf.dat", translationPath_.c_str(), receptor_.getOrder(), R); TranslationMatrix translationmatrix(buffer); for (int i = 0; i < raSize; ++i) { rotReceptor_[i].translateTo(*transTmp, translationmatrix); for (int j = 0; j < raSize*alphaSize_; ++j) { double tmpScore = scoreIt(*transTmp, rotLigand_[j], penalty_); bestScores.insert(make_pair(tmpScore, ScoreConfiguration(R, (j%alphaSize_) * (2.0*PI/alphaSize_), rotationAngles_[i].beta, rotationAngles_[i].gamma, rotationAngles_[j/alphaSize_].beta, rotationAngles_[j/alphaSize_].gamma))); minScore = min(minScore, tmpScore); maxScore = max(maxScore, tmpScore); } while ((int)bestScores.size() > scoresSize_) { bestScores.erase(bestScores.begin()); } } printf("For R:%lf min score is %lf; max score is %lf\n",R, minScore, maxScore); MaxScoresRadius.push_back(R); MaxScoresRadius.push_back(maxScore); } for (set <pair<double, ScoreConfiguration> >::iterator itr = bestScores.begin(); itr != bestScores.end(); ++itr) { scores.push_back(*itr); } delete transTmp; }
// // translate // void camera::translate(math3d::vector const& v) { /* matrix tmp; tmp[math3d::matrix::da] = v[math3d::vector::x]; tmp[math3d::matrix::db] = v[math3d::vector::y]; tmp[math3d::matrix::dc] = v[math3d::vector::z]; */ worldMatrix_ *= translationmatrix(v); worldMatrixInvers_ = inverse(worldMatrix_); }
void Docking::dockingSearch(vector <pair<double, ScoreConfiguration> >& scores) { int raSize = 20*(1<<(tessellationOrder_*2)); set <pair<double, ScoreConfiguration> > bestScores; preDockingCalculateRotations(); Protein *transTmp = new Protein; scores.clear(); for (double R = radiusStart_; R < radiusEnd_; R += 0.5) { double minScore = 10000000.0, maxScore = -10000000.0; printf("R: %lf\n", R); char buffer[100]; sprintf(buffer, "%s/%d/%.6lf.dat", translationPath_.c_str(), receptor_.getOrder(), R); TranslationMatrix translationmatrix(buffer); for (int i = 0; i < raSize; ++i) { rotReceptor_[i].translateTo(*transTmp, translationmatrix); for (int j = 0; j < raSize*alphaSize_; ++j) { double tmpScore = scoreIt(*transTmp, rotLigand_[j], penalty_); bestScores.insert(make_pair(tmpScore,ScoreConfiguration(R,(j%alphaSize_)*(2.0*PI/alphaSize_),rotationAngles_[i].beta,rotationAngles_[i].gamma,rotationAngles_[j/alphaSize_].beta, rotationAngles_[j/alphaSize_].gamma))); minScore = min(minScore, tmpScore); maxScore = max(maxScore, tmpScore); } while ((int)bestScores.size() > scoresSize_) { bestScores.erase(bestScores.begin()); } } printf("For this R: min score is %lf; max score is %lf\n", minScore, maxScore); printf("OK\n"); } for (set <pair<double, ScoreConfiguration> >::iterator itr = bestScores.begin(); itr != bestScores.end(); ++itr) { scores.push_back(*itr); } freeMemory(); delete transTmp; }
void Docking::setConfiguration(const ScoreConfiguration& scoreConfiguration, Protein &newReceptor, Protein &newLigand) const { // rotate receptor RotationMatrix rotationMatrix; rotationMatrix.calculateMatrix(receptor_.getOrder(), RotationAngle(0.0, scoreConfiguration.gamma2)); receptor_.rotateTo(newReceptor, rotationMatrix); rotationMatrix.calculateMatrix(receptor_.getOrder(), RotationAngle(scoreConfiguration.beta2, 0.0)); newReceptor.rotate(rotationMatrix); // translate char buffer[100]; // sprintf(buffer, "%s/%d/%.6lf.dat", "data/trans", receptor_.getOrder(), scoreConfiguration.R); sprintf(buffer, "%s/%d/%.6lf.dat", translationPath_.c_str(), receptor_.getOrder(), scoreConfiguration.R); TranslationMatrix translationmatrix(buffer); newReceptor.translate(translationmatrix); rotationMatrix.calculateMatrix(receptor_.getOrder(), RotationAngle(0.0, scoreConfiguration.gamma1)); ligand_.rotateTo(newLigand, rotationMatrix); rotationMatrix.calculateMatrix(receptor_.getOrder(), RotationAngle(scoreConfiguration.beta1, 0.0)); newLigand.rotate(rotationMatrix); rotationMatrix.calculateMatrix(receptor_.getOrder(), RotationAngle(0.0, scoreConfiguration.alpha)); newLigand.rotate(rotationMatrix); }
void Docking::dockingQsearch(vector <pair<double, ScoreConfiguration> >& scores, vector<double> RadiusSet, vector<double>& MaxScoresRadius) { int raSize = 20*(1<<(tessellationOrder_*2))+1; set <pair<double, ScoreConfiguration> > bestScores; preDockingCalculateQRotations(); //precalculation of all rotations trigonometricCash(); calculateCoeffMapping( ); Protein *transReceptor = new Protein; //printf("Starting docking search...\n"); //scores.clear(); vector<double> qCoeffPlusPlus, qCoeffMinusMinus; int order = receptor_.getOrder(); qCoeffPlusPlus.resize(order, 0.0); qCoeffMinusMinus.resize(order, 0.0); vector<double> qCoeffPlus; qCoeffPlus.resize((2* order - 1), 0.0); vector<double> qCoeffMinus; qCoeffMinus.resize((2* order - 1), 0.0); int timeFlag = 0; //vector<int> translationIndexes; //receptor_.calculateTranslationIndexes( translationIndexes ); for (unsigned int radiusIndex = 0; radiusIndex < RadiusSet.size(); ++radiusIndex) { double R = RadiusSet[radiusIndex]; double minScore = 10000000.0, maxScore = -10000000.0; char buffer[100]; sprintf(buffer, "%s/%d/%.6lf.dat", translationPath_.c_str(), receptor_.getOrder(), R); TranslationMatrix translationmatrix(buffer); for (int i = 0; i < raSize; ++i) { /*clock_t start,end; start = clock ();*/ //rotReceptor_[i].translateTo(*transReceptor, translationmatrix, translationIndexes); rotReceptor_[i].translateTo(*transReceptor, translationmatrix); /*end = clock (); if (timeFlag == 0) printf("Finished translation in about %d ms. \n",(end-start)); start = clock ();*/ for (int j = 0; j < raSize; ++j) { /*calculateQcoeffPlusPlus(qCoeffPlusPlus,qCoeffPlus, *transReceptor, qRotLigand_[j] ); calculateQcoeffMinusMinus(qCoeffMinusMinus,qCoeffMinus, *transReceptor, qRotLigand_[j] );*/ calculateQcoeffs(qCoeffPlusPlus, qCoeffPlus, qCoeffMinusMinus, qCoeffMinus,*transReceptor, qRotLigand_[j]); double maxScoreAlfa = - 100000.0; double maxAlfa = 0.0; for (int k = 0; k < alphaSize_; ++k) { int index_alfa = k*order; double tmpScore = qCoeffPlusPlus[0]; for (int m = 1; m <= (order-1); ++m) { tmpScore += (qCoeffPlusPlus[m] * cosValue_->at(index_alfa+m) ) + (qCoeffMinusMinus[m] * sinValue_->at(index_alfa+m) ); } if (tmpScore > maxScoreAlfa){ maxScoreAlfa = tmpScore; maxAlfa = k*(2.0*PI/alphaSize_); } if ( (i+1 == raSize)&&(j+1==raSize)&& (k==0) ){ printf("R:%lf ,b1:%lf, g1:%lf, a2:%lf, b2:%lf, g2:%lf score:%lf \n",R, k*(2.0*PI/alphaSize_),rotationAngles_[i].beta,rotationAngles_[i].gamma,rotationAngles_[j].beta, rotationAngles_[j].gamma,tmpScore); } minScore = min(minScore, tmpScore); maxScore = max(maxScore, tmpScore); } bestScores.insert(make_pair( maxScoreAlfa,ScoreConfiguration(R, maxAlfa ,rotationAngles_[i].beta, rotationAngles_[i].gamma, rotationAngles_[j].beta, rotationAngles_[j].gamma ))); } while ((int)bestScores.size() > scoresSize_) { bestScores.erase(bestScores.begin()); } /*end = clock (); if (timeFlag == 0){ printf("Finished rotation in about %d ms. \n", (end-start)/100); timeFlag = 1; }*/ } printf("For R:%lf min score is %E; max score is %E\n",R, minScore, maxScore); MaxScoresRadius.push_back(R); MaxScoresRadius.push_back(maxScore); } for (set <pair<double, ScoreConfiguration> >::iterator itr = bestScores.begin(); itr != bestScores.end(); ++itr) { scores.push_back(*itr); } delete transReceptor; }
void Docking::dockingQsearchTest(double R, double beta1, double gamma1, double beta2, double gamma2,vector <pair<double, ScoreConfiguration> >& scores) { RotationMatrix rotationMatrixGamma1, rotationMatrixBeta1; RotationMatrix rotationMatrixGamma2, rotationMatrixBeta2; rotationMatrixGamma1.calculateMatrix(receptor_.getOrder(), RotationAngle( 0, gamma1) ); rotationMatrixBeta1.calculateMatrix(receptor_.getOrder(), RotationAngle( beta1, 0.0) ); rotationMatrixGamma2.calculateMatrix(receptor_.getOrder(), RotationAngle( 0, gamma2) ); rotationMatrixBeta2.calculateMatrix(receptor_.getOrder(), RotationAngle( beta2, 0.0)); rotReceptor_ = new Protein[1]; qRotLigand_ = new Protein[1]; receptor_.rotateTo(rotReceptor_[0], rotationMatrixGamma1); rotReceptor_[0].rotate(rotationMatrixBeta1); ligand_.rotateTo (qRotLigand_[0], rotationMatrixGamma2); qRotLigand_[0].rotate(rotationMatrixBeta2); qRotLigand_[0].qTransition(penalty_); Protein *transReceptor; if (R > 0) { transReceptor = new Protein; char buffer[100]; sprintf(buffer, "%s/%d/%.6lf.dat", translationPath_.c_str(), receptor_.getOrder(), R); TranslationMatrix translationmatrix(buffer); vector<int> translationIndexes; rotReceptor_[0].calculateTranslationIndexes( translationIndexes ); rotReceptor_[0].translateTo(*transReceptor, translationmatrix, translationIndexes); }else { transReceptor = &rotReceptor_[0]; } set <pair<double, ScoreConfiguration> > bestScores; scores.clear(); double minScore = 10000000.0, maxScore = -10000000.0; vector<double> qCoeffPlusPlus, qCoeffMinusMinus; int order = receptor_.getOrder(); qCoeffPlusPlus.resize(order, 0.0); qCoeffMinusMinus.resize(order, 0.0); trigonometricCash(); calculateCoeffMapping( ); vector<double> qCoeffPlus; qCoeffPlus.resize((2* order - 1), 0.0); vector<double> qCoeffMinus; qCoeffMinus.resize((2* order - 1), 0.0); //calculateQcoeffPlusPlus(qCoeffPlusPlus, qCoeffPlus ,*transReceptor, qRotLigand_[0] ); //calculateQcoeffMinusMinus(qCoeffMinusMinus,qCoeffMinus, *transReceptor, qRotLigand_[0] ); calculateQcoeffs(qCoeffPlusPlus, qCoeffPlus, qCoeffMinusMinus, qCoeffMinus,*transReceptor, qRotLigand_[0]); printf("Q Coeff plus plus : \n"); for(int i = 0 ; i < qCoeffPlusPlus.size(); ++i) printf("%lf \n",qCoeffPlusPlus[i]); printf("Q Coeff minus minus : \n"); for(int i = 0 ; i < qCoeffMinusMinus.size(); ++i) printf("%lf \n",qCoeffMinusMinus[i]); printf("Alfa function: \n"); for (int j = 1; j < alphaSize_; ++j) { double tmpScore = qCoeffPlusPlus[0]; int index_alfa = j*order; for (int m = 1; m <= (order-1); ++m) { double alfa2angle = j*((2.0*PI)/alphaSize_); //tmpScore += (qCoeffPlusPlus[m] * cos(m*alfa2angle) ) + (qCoeffMinusMinus[m] * sin(m*alfa2angle) ); tmpScore += (qCoeffPlusPlus[m] * cosValue_->at(index_alfa+m) ) + (qCoeffMinusMinus[m] * sinValue_->at(index_alfa+m) ); } printf("%lf \n", tmpScore); bestScores.insert(make_pair(tmpScore,ScoreConfiguration(R, ((2.0*PI)/alphaSize_) * j, beta1, gamma1, beta2, gamma2))); minScore = min(minScore, tmpScore); maxScore = max(maxScore, tmpScore); while ((int)bestScores.size() > scoresSize_) { bestScores.erase(bestScores.begin()); } } printf("For R:%lf min score is %lf; max score is %lf\n",R, minScore, maxScore); for (set <pair<double, ScoreConfiguration> >::iterator itr = bestScores.begin(); itr != bestScores.end(); ++itr) { scores.push_back(*itr); } if (R>0) delete transReceptor; }