//__________________________________________________________________________________ void ReadInPostFiles(void) { if (!likeFuncList.lLength) return; _String fileIndex; FILE* modelList = fopen (fileIndex.getStr(),"r"); fileIndex = baseArgDir &"TemplateBatchFiles/postprocessors.lst"; modelList = fopen (fileIndex.getStr(),"r"); fseek (modelList,0,SEEK_END); unsigned long fLength = ftell(modelList); fseek (modelList,0,SEEK_END); fLength = ftell(modelList); if (fLength) { rewind (modelList); _String theData (fLength); fread (theData.getStr(),sizeof (char), fLength, modelList); _ElementaryCommand::ExtractConditions(theData,0,availablePostProcessors); for (long i = 0; i<availablePostProcessors.countitems(); i++) { _String* thisString = (_String*)availablePostProcessors(i); _List thisFile; _ElementaryCommand::ExtractConditions(*thisString,thisString->FirstNonSpaceIndex(),thisFile,','); if (thisFile.lLength!=3) { availablePostProcessors.Delete(i); i--; continue; } for (long j = 0; j<3; j++) ((_String*)thisFile(j))->StripQuotes(); if (*(_String*)thisFile(0)!=_String("SEPARATOR")) { fileIndex = *((_String*)pathNames(0)) &"TemplateBatchFiles/" & *(_String*)thisFile(1); FILE* dummyFile = fopen (fileIndex,"r"); if (!dummyFile) { fileIndex =baseArgDir&"TemplateBatchFiles/"& *(_String*)thisFile(1); dummyFile = fopen (fileIndex,"r"); } if (dummyFile) { fclose (dummyFile); _String* condition = (_String*)thisFile(2); if (condition->sLength) { _Formula condCheck (*condition,nil); _PMathObj condCheckRes = condCheck.Compute(); if ((!condCheckRes)||(condCheckRes->Value()<.5)) { availablePostProcessors.Delete(i); i--; continue; } } *(_String*)thisFile(1) = fileIndex; availablePostProcessors.Replace(i,&thisFile,true); continue; } } availablePostProcessors.Delete(i); i--; } } }
int main (int argc, char* argv[]) { mainArgCount = argc - 1; #ifdef __HYPHYMPI__ int rank, size; MPI_Init (&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); setParameter (mpiNodeID, (_Parameter)rank); setParameter (mpiNodeCount, (_Parameter)size); _hy_mpi_node_rank = rank; if (rank == 0) { mpiNodesThatCantSwitch.Populate (size,1,0); /* { char hostname[256]; gethostname(hostname, sizeof(hostname)); printf("PID %d on %s ready for attach\n", getpid(), hostname); fflush(stdout); //getchar (); } */ #endif //for (long k=0; k<NSIG; k++) //{ // signal(k, &hyphyBreak); //} #ifdef __HYPHYMPI__ } #endif char curWd[4096], dirSlash = GetPlatformDirectoryChar (); getcwd (curWd,4096); _String baseDir (curWd); if (baseDir.getChar (baseDir.sLength-1) != dirSlash) { baseDir=baseDir & dirSlash; } #if defined _HYPHY_LIBDIRECTORY_ _String libDir (_HYPHY_LIBDIRECTORY_); if (libDir.getChar (libDir.sLength-1) != dirSlash) { libDir=libDir & dirSlash; } pathNames&& &libDir; #else pathNames&& &baseDir; _String libDir = baseDir; #endif _String argFile; libDirectory = libDir; libArgDir = libDirectory; baseDirectory = baseDir; baseArgDir = baseDirectory; _ExecutionList ex; #ifdef _OPENMP systemCPUCount = omp_get_max_threads(); #endif #ifdef _MINGW32_MEGA_ { char pid[16]; snprintf (pid,16,"%u", GetCurrentProcessId()); _String pipeName = _String("\\\\.\\pipe\\MEGAPipe") & pid; printf ("Pipe name = %s\n", pipeName.sData); if ((_HY_MEGA_Pipe = CreateFile(pipeName.sData, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) { char* lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); FlagError (_String("Failed to create a pipe named '") & pipeName & "' to send data from HyPhy to MEGA. Error: "&lpMsgBuf); } } #endif for (long i=1; i<argc; i++) { _String thisArg (argv[i]); if (thisArg.sData[0]=='-') { ProcessConfigStr (thisArg); } else if (thisArg.beginswith ("BASEPATH=")) { baseArgDir = thisArg.Cut(9,-1); if (baseArgDir.sLength) { if (baseArgDir.sData[baseArgDir.sLength-1]!=dirSlash) { baseArgDir = baseArgDir&dirSlash; } baseDirectory = baseArgDir; } } else if (thisArg.beginswith ("LIBPATH=")) { libArgDir = thisArg.Cut(8,-1); if (libArgDir.sLength) { if (libArgDir.sData[libArgDir.sLength-1] != dirSlash) { libArgDir = libArgDir & dirSlash; } libDirectory = libArgDir; } } else if (thisArg.beginswith ("USEPATH=")) { baseDir = thisArg.Cut(8,-1); errorFileName = baseDir & errorFileName; messageFileName = baseDir & messageFileName; pathNames.Delete (0); pathNames&& &baseDir; } else #ifdef __MP__ if (thisArg.beginswith ("CPU=")) { _String cpus = thisArg.Cut(4,-1); systemCPUCount = cpus.toNum(); if (systemCPUCount<1) { systemCPUCount = 1; } pthread_setconcurrency (systemCPUCount+1); } else #endif argFile = thisArg; } GlobalStartup(); if (calculatorMode) { printf ("\nHYPHY is running in calculator mode. Type 'exit' when you are finished.\n"); while (ExpressionCalculator()) ; return 0; } if (pipeMode) { _String bfIn (stdin); _ExecutionList exIn (bfIn); exIn.Execute(); GlobalShutdown(); return 0; } // try to read the preferences _String prefFile (curWd); prefFile = prefFile & '/' & prefFileName; FILE * testPrefFile = fopen (prefFile.sData,"r"); if (!testPrefFile) { prefFile = baseArgDir & prefFileName; testPrefFile = fopen (prefFile.sData,"r"); } if (testPrefFile) { fclose(testPrefFile); ReadBatchFile (prefFile,ex); ex.Execute(); ex.Clear(); } //printf ("Node %d before mpiParallelOptimizer\n", rank); #ifdef __HYPHYMPI__ if (rank>0) { //if (mpiParallelOptimizer || mpiPartitionOptimizer) // mpiOptimizerLoop (rank, size); //else _String defaultBaseDirectory = *(_String*)pathNames(0); mpiNormalLoop (rank, size, defaultBaseDirectory); /*argFile = "SHUTDOWN_CONFIRM"; MPISendString (argFile, senderID);*/ } else { #endif if (!argFile.sLength) { long selection = -2; if (!updateMode) { selection = DisplayListOfChoices(); } if (selection == -1) { dialogPrompt = "Batch file to run:"; _String fStr (ReturnDialogInput (true)); if (logInputMode) { _String tts = loggedFileEntry&fStr; loggedUserInputs && & tts; } PushFilePath (fStr); ReadBatchFile (fStr,ex); } else { _String templ; if (selection >= 0) { templ = baseArgDir &"TemplateBatchFiles" & dirSlash; } else { templ = baseArgDir & "TemplateBatchFiles" & dirSlash & "WebUpdate.bf"; } if (selection >= 0) { templ= templ&*(_String*)(*(_List*)availableTemplateFiles(selection))(2); } PushFilePath (templ); ReadBatchFile (templ,ex); } } else { #ifndef __MINGW32__ if (argFile.sData[0] != '/') { argFile = baseDirectory & argFile; } #else if (argFile.sData[1] != ':') { // not an absolute path argFile = baseDirectory & argFile; } #endif PushFilePath (argFile); ReadBatchFile (argFile,ex); } ex.Execute(); if (usePostProcessors && (!updateMode)) { ReadInPostFiles(); printf ("\n\n**********Continue with result processing (y/n)?"); _String c_str (StringFromConsole()); if (logInputMode) { loggedUserInputs && & c_str; } if (c_str.getChar(0) !='n' && c_str.getChar(0)!='N' ) { long choice = DisplayListOfPostChoices(); while (choice != -1) { _ExecutionList postEx; argFile = *(_String*)(*(_List*)availablePostProcessors(choice-1))(1); PushFilePath (argFile); ReadBatchFile (argFile, postEx); postEx.Execute(); PopFilePath (); printf ("\n\n**********Continue with result processing (y/n)?"); c_str = StringFromConsole(); if (logInputMode) { loggedUserInputs && & c_str; } if (c_str.getChar(0)=='n' || c_str.getChar(0)=='N' ) { break; } choice = DisplayListOfPostChoices(); } } } #ifdef __HYPHYMPI__ } ReportWarning (_String ("Node ") & (long)rank & " is shutting down\n"); #endif #ifdef _MINGW32_MEGA_ if (_HY_MEGA_Pipe != INVALID_HANDLE_VALUE) { CloseHandle (_HY_MEGA_Pipe); } #endif PurgeAll (true); GlobalShutdown (); #ifdef __HYPHYMPI__ if (rank == 0) { printf ("\n\n"); } #endif }