/////////////////////////////////////////////////////////////////////////////// // Run calculations. /////////////////////////////////////////////////////////////////////////////// void refold::run() { // Create a variable that handles errors. int error = 0; /* * Use the constructor for RNA that specifies a filename. * Specify type = 4 (folding save file). * The save file handles the type of nucleic acid being folded, so it can be set as the default (RNA) in the constructor. * * After construction of the strand data structure, create the error checker which monitors for errors. * Throughout, the error status of the calculation is checked with a variant of the isErrorStatus method, which returns 0 if no error occurred. * The calculation proceeds as long as error = 0. */ cout << "Initializing nucleic acids..." << flush; RNA* strand = new RNA( saveFile.c_str(), 4 ); ErrorChecker<RNA>* checker = new ErrorChecker<RNA>( strand ); error = checker->isErrorStatus(); if( error == 0 ) { cout << "done." << endl; } /* * Set the window size, based on the length of the sequence given as input. * Only do this if window size hasn't been set on the command line. * Use method GetSequenceLength to get the length of the sequence. * The window sizes in relation to the length are hardcoded values. */ if( windowSize == -1 && error == 0 ) { int length = strand->GetSequenceLength(); windowSize = ( length > 1200 ) ? 20 : ( length > 800 ) ? 15 : ( length > 500 ) ? 11 : ( length > 300 ) ? 7 : ( length > 120 ) ? 5 : ( length > 50 ) ? 3 : 2; } /* * Refold the regenerated strand using the ReFoldSingleStrand method. * After the main calculation is complete, use the error checker's isErrorStatus method to check for errors. */ if( error == 0 ) { // Show a message saying that the main calculation has started. cout << "Refolding nucleic acids..." << flush; // Do the main calculation and check for errors. int mainCalcError = strand->ReFoldSingleStrand( percent, maxStructures, windowSize ); error = checker->isErrorStatus( mainCalcError ); // If no error occurred, print a message saying that the main calculation is done. if( error == 0 ) { cout << "done." << endl; } } /* * Write a CT output file using the WriteCt method. * After writing is complete, use the error checker's isErrorStatus method to check for errors. */ if( error == 0 ) { // Show a message saying that the CT file is being written. cout << "Writing output ct file..." << flush; // Write the CT file and check for errors. int writeError = strand->WriteCt( ctFile.c_str() ); error = checker->isErrorStatus( writeError ); // If no errors occurred, show a CT file writing completion message. if( error == 0 ) { cout << "done." << endl; } } // Delete the error checker and data structure. delete checker; delete strand; // Print confirmation of run finishing. if( error == 0 ) { cout << calcType << " complete." << endl; } else { cerr << calcType << " complete with errors." << endl; } }