00001 #include "ModulesNavigator.h"
00002 #include <iostream>
00003 #include <iterator>
00004 #include <algorithm>
00005 #include <TDirectory.h>
00006 #include <TFile.h>
00007 using std::cout;
00008 using std::endl;
00009
00010 modules::navigator::navigator():fModulesLoaded(false),fModulesMade(false),fDebug(false),fDumpInputFile(false),fOutFile(NULL){};
00011
00012 int modules::navigator::LoadConfigFile(const char* filename){
00013
00014 if(fModulesLoaded ) {
00015 cout<<"Error: Loading a new modules file, when one was already loaded"<<endl;
00016 return 1;
00017 }
00018
00019 int retVal=fModulesFile.ReadFile(filename);
00020 if(retVal!=0) return retVal;
00021
00022
00023 if(fModulesFile.DumpInputFile()) fDumpInputFile=true;
00024
00025
00026 size_t num_modules=fModulesFile.GetNumModules();
00027 if(num_modules==0){
00028 cout<<"Warning: No modules were requested for use, so there's nothing to be done!"<<endl;
00029 return 2;
00030 }
00031 cout<<"Number of modules requested: "<<num_modules<<endl;
00032
00033
00034 fModulesLoaded=true;
00035 return 0;
00036 }
00037
00038 int modules::navigator::MakeModules(){
00039
00040 if(! (fOutFile && fOutFile->IsWritable()) ){
00041 cout<<"Error: Output file is not useable"<<endl;
00042 return 1;
00043 }
00044
00045
00046 if(!fModulesLoaded) {
00047 cout<<"Error: MakeModules(): Cannot make modules until you load a Modules file."<<endl;
00048 return 1;
00049 }
00050
00051
00052 if(fModulesMade) {
00053 cout<<"Error: MakeModules(): You've already called MakeModules."<<endl;
00054 return 1;
00055 }
00056
00057
00058
00059 modules::factory* mgr = modules::factory::Instance();
00060 std::string name;
00061 modules::options* opts;
00062 BaseModule* mod=NULL;
00063 size_t num_modules=fModulesFile.GetNumModules();
00064 for(unsigned i=0;i<num_modules;i++){
00065 name = fModulesFile.GetModule(i);
00066 opts = fModulesFile.GetOptions(i);
00067 if(mgr->canCreate(name)){
00068 if(Debug()){
00069 cout<<"Creating module: "<<name<<endl;
00070 cout<<"With options:"<<endl;
00071 opts->DumpOptions(" ");
00072 }
00073 gDirectory->cd("/");
00074 mod = mgr->createModule(name,opts);
00075 gDirectory->cd("/");
00076 if(mod){
00077 AddModule(name, mod);
00078 }
00079 else return 3;
00080 }else {
00081 std::cout<<"Unknown module requested: "<<name<<std::endl;
00082 return 4;
00083 }
00084 }
00085
00086
00087 fModulesMade=true;
00088 return 0;
00089 }
00090
00091 void modules::navigator::AddModule(const std::string& name, BaseModule* mod){
00092 fModules.push_back(std::make_pair(name,mod));
00093 fModulesSearch.insert(std::make_pair(name,mod));
00094 }
00095
00096 int modules::navigator::HowMany(const std::string& name)const{
00097 if(fModulesMade) return fModulesSearch.count(name);
00098 return fModulesFile.HowMany(name);
00099 }
00100
00101 namespace{
00102 struct first_in_pair_equals{
00103 bool operator()(const modules::ordered_element& element){
00104 return element.first==comp;
00105 }
00106 std::string comp;
00107 first_in_pair_equals(const std::string& c):comp(c){};
00108 };
00109 }
00110
00111 bool modules::navigator::Before(const std::string& first, const std::string& second)const{
00112
00113 modules::const_iterator i_first= std::find_if(fModules.begin(),fModules.end(),first_in_pair_equals(first));
00114 if(i_first==fModules.end()){
00115 cout<<"Error: Unable to find module "<<first<<endl;
00116 return false;
00117 }
00118 modules::const_iterator i_second= std::find_if(fModules.begin(),fModules.end(),first_in_pair_equals(second));
00119 if(i_second==fModules.end()){
00120 cout<<"Error: Unable to find module "<<second<<endl;
00121 return false;
00122 }
00123 int dist=std::distance(i_first,i_second);
00124 return dist>0;
00125 }