void runSaltBridgeMC( subSeq &_exposedPositions, map<string,map<string,map<int, map<string,map<string, double> > > > > &_sbScoreTable, System &_sys, Options &_opt, std::priority_queue< std::pair<saltBridgeResult,subSeq>, std::vector< std::pair<saltBridgeResult,subSeq> >, compareScores> &_mcData){ // WT score saltBridgeResult wt_sbresult = scoreSaltBridgePositions(_exposedPositions,_sbScoreTable,_sys); // Map to insure we don't fill priority queue with duplicates map<string,bool> mcDataMap; string possibleMutations = "KREDH"; RandomNumberGenerator rng; rng.setTimeBasedSeed(); MSLOUT.stream() << "RNG SEED: "<<rng.getSeed()<<endl; //MonteCarloManager MCMngr(_startingTemperature, _endingTemperature,_scheduleCycles, _scheduleShape, _maxRejectionsNumber, _convergedSteps, _convergedE); MonteCarloManager MCMngr(_opt.startMCtemp,_opt.endMCtemp,_opt.numMCcycles, MonteCarloManager::EXPONENTIAL,100,0,0.0); MCMngr.setRandomNumberGenerator(&rng); MCMngr.setEner(wt_sbresult.score); subSeq current = _exposedPositions; string wtSeq = _exposedPositions.seq; // TODO add options to Options opt; to take care of MC-related options..... get rid of hard-coded values. while (!MCMngr.getComplete()) { // Make change int mutIndex = rng.getRandomInt(0,possibleMutations.size()-1); int seqPosIndex = rng.getRandomInt(0,_exposedPositions.seq.size()-1); string mutAA = possibleMutations.substr(mutIndex,1); string previousAA = current.seq.substr(seqPosIndex,1); current.seq.replace(seqPosIndex,1,mutAA); // Eval saltBridgeResult sbResult = scoreSaltBridgePositions(current,_sbScoreTable,_sys); //MSLOUT.stream() << "SCORE: "<<score<<" wt: "<<wt_score<<endl; // MC test for Acceptance: if (MCMngr.accept(sbResult.score)){ //cout << "New SEQ: "<<current.seq<<" score: "<<score<<endl; //cout << "WT SEQ: "<<wtSeq<<" score: "<<wt_score<<endl; bool keepIt = false; map<string, bool>::iterator it; it = mcDataMap.find(sbResult.sbId); if (it == mcDataMap.end()){ mcDataMap[sbResult.sbId] = true; if (_mcData.size() >= _opt.numSequenceModels){ if (sbResult.score < _mcData.top().first.score){ // Remove highest score, then add _mcData.pop(); _mcData.push(pair<saltBridgeResult,subSeq>(sbResult,current)); keepIt = true; } } else { _mcData.push(pair<saltBridgeResult,subSeq>(sbResult,current)); keepIt = true; } } if (!keepIt){ current.seq.replace(seqPosIndex,1,previousAA); } } else { current.seq.replace(seqPosIndex,1,previousAA); } } MSLOUT.stream() << "MC Completed -> "<<MCMngr.getReasonCompleted()<<endl; }