#include "BBContainer.h" #include "HierarchicalFold.h" #include #include #include #include #include #include #include // #include #include namespace po = boost::program_options; // #include int main(int argc, char *argv[]) { // output arguments for (int i = 0; i < argc; i++) std::cout << argv[i] << " "; std::cout << std::endl; // input parsing double penetrationThr; float maxBackboneCollisionPerChain; float minTemperatureToConsiderCollision; unsigned int maxResultPerResSet; std::string outFileNamePrefix; double restraintsRatio; double clusterRMSD; // positional std::string suFileName; std::string transFilesPrefix; int transNumToRead; int bestK; std::string constraintsFileName; po::options_description desc("Usage: \ "); // optional desc.add_options()("help,h", "Combinatoral Assembly help")("version", "CombFold 1.0 2022")( "penetrationThr,p", po::value(&penetrationThr)->default_value(-1.0), "maximum allowed penetration between subunit surfaces (default = -1.0)")( "restraintsRatio,r", po::value(&restraintsRatio)->default_value(0.1), "constraints ratio (default = 0.1)")("clusterRMSD,c", po::value(&clusterRMSD)->default_value(5.0), "final clustering RMSD (default = 5.0)") ("maxBackboneCollisionPerChain,b", po::value(&maxBackboneCollisionPerChain)->default_value(0.1), "Max percentage(0 to 1) of backbone atoms of a chain that can collide with another chain(default=0.1)")( "minTemperatureToConsiderCollision,t", po::value(&minTemperatureToConsiderCollision)->default_value(0), "Minimal Bfactor required for atom to be considered when calculating collisions(default=0)")( "maxResultPerResSet,j", po::value(&maxResultPerResSet)->default_value(0), "number of results saved for each calculated combination of subunits (default=k)") ("outputFileNamePrefix,o", po::value(&outFileNamePrefix)->default_value("output"), "output file name, default name output.res"); // required options: currently 5 po::options_description hidden("Hidden options"); hidden.add_options()("SUlist", po::value(&suFileName)->required(), "SU list file name")( "transFilesPrefix", po::value(&transFilesPrefix)->required(), "Trans files prefix")("transNumToRead", po::value(&transNumToRead)->required(), "# of tranformations")("bestK", po::value(&bestK)->required(), "bestK")( "constraintsFile", po::value(&constraintsFileName)->required(), "constraints file name"); po::options_description cmdline_options; cmdline_options.add(desc).add(hidden); po::positional_options_description p; p.add("SUlist", 1); p.add("transFilesPrefix", 1); p.add("transNumToRead", 1); p.add("bestK", 1); p.add("constraintsFile", 1); po::variables_map vm; try { po::store(po::command_line_parser(argc, argv).options(cmdline_options).positional(p).run(), vm); if (vm.count("help")) { std::cout << desc << "\n"; return 0; } po::notify(vm); } catch (po::required_option &e) { std::cout << desc << "\n"; return 0; } catch (po::error &e) { std::cout << desc << "\n"; return 0; } if (maxResultPerResSet == 0) maxResultPerResSet = bestK; // done parsing auto start = std::chrono::high_resolution_clock::now(); HierarchicalFold::timerAll_.reset(); std::cerr << "Before process input" << std::endl; std::string argv_str(argv[0]); std::string base = argv_str.substr(0, argv_str.find_last_of("/")); std::string chemLibFileName = base + "/chem_params.txt"; BBContainer bbContainer(suFileName, chemLibFileName, minTemperatureToConsiderCollision); bbContainer.readTransformationFiles(transFilesPrefix, transNumToRead); std::cout << "Starting HierarchicalFold" << std::endl; HierarchicalFold hierarchalFold(bbContainer, bestK, maxResultPerResSet, minTemperatureToConsiderCollision, maxBackboneCollisionPerChain, penetrationThr, restraintsRatio); // read constraints hierarchalFold.readConstraints(constraintsFileName); HierarchicalFold::timer_.reset(); hierarchalFold.outputConnectivityGraph("graph.txt"); hierarchalFold.checkConnectivity(); // ProfilerStart("nameOfProfile.log"); auto startBeforeFold = std::chrono::high_resolution_clock::now(); hierarchalFold.fold(outFileNamePrefix); // ProfilerStop(); auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = end - start; std::chrono::duration diffFold = end - startBeforeFold; std::cout << "Overall time " << diff.count() << " s\n"; std::cout << "only fold time " << diffFold.count() << " s\n"; std::cerr << "countResults_ " << HierarchicalFold::countResults_ << std::endl; std::cerr << "timer_ " << HierarchicalFold::timer_ << std::endl; std::cerr << "timerAll_ " << HierarchicalFold::timerAll_ << std::endl; // SuperBB::reportCounters(); return 0; }