6e394f1df62daf3d2f8ee410b3bcaae07f622ca6
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / trains / RunTrain.C
1 /**
2  * @file   RunTrain.C
3  * @author Christian Holm Christensen <cholm@nbi.dk>
4  * @date   Tue Oct 16 17:49:49 2012
5  * 
6  * @brief  Script to run a train 
7  *
8  * @ingroup pwglf_forward_trains
9  */
10 /** 
11  * Build a script 
12  * 
13  * @param name     Name of script 
14  * @param verbose  Whether to be verbose 
15  * @param force    Whether to force re-compilation 
16  * @param debug    Whether to enable debug symbols  
17  * 
18  * @return true on success 
19  *
20  * @ingroup pwglf_forward_trains
21  */
22 Bool_t
23 BuildScript(const char* name, Bool_t verbose, Bool_t force, Bool_t debug)
24 {
25   const char opt[] = { (force ? '+' : debug ? 'g' : '\0'), 
26                        (force && debug ? 'g' : '\0'), '\0' };
27   if (verbose) Printf("Building %s ...",name);
28   Int_t error;
29   Int_t ret = gROOT->LoadMacro(Form("%s.C+%s", name, opt), &error);
30   if (ret < 0 || error) { 
31     Error("BuildScript", "Failed to build %s: %d", error);
32     return false;
33   }
34   return true;
35   
36 }
37
38 /** 
39  * Build all helper classes 
40  * 
41  * @param verbose Whether to be verbose 
42  * @param force   Whether to force re-builds
43  * @param debug   Whether to enable debug symbols 
44  * 
45  * @return true on success 
46  *
47  * @ingroup pwglf_forward_trains
48  */
49 Bool_t
50 BuildHelpers(Bool_t verbose, Bool_t force, Bool_t debug)
51 {
52   gSystem->AddIncludePath("-I$ALICE_ROOT/include");
53   gSystem->Load("libANALYSIS");
54   gSystem->Load("libANALYSISalice");
55   const char* scripts[] = { "AvailableSoftware", 
56                             "ChainBuilder", 
57                             "ParUtilities",
58                             "OutputUtilities", 
59                             "Option",
60                             "Helper", 
61                             "LocalHelper", 
62                             "ProofHelper", 
63                             "LiteHelper",
64                             "AAFHelper", 
65                             "PluginHelper",
66                             "AAFPluginHelper", 
67                             "GridHelper",
68                             "TrainSetup",
69                             0 };
70   const char** ptr = scripts;
71   while ((*ptr)) {
72     if (!BuildScript(*ptr, verbose, force, debug)) return false;
73     ptr++;
74   }
75   return true;
76 }
77
78 /** 
79  * Show the usage 
80  * 
81  *
82  * @ingroup pwglf_forward_trains
83  */
84 void PlainUsage()
85 {
86   std::cout << "Usage: .x RunTrain.C(NAME,CLASS,OPTIONS)\n\n"
87             << "  NAME       Name of train (free form)\n"
88             << "  CLASS      Name of class implementing TrainSetup\n"
89             << "  OPTIONS    Comma separated list of options\n"
90             << std::endl;
91 }
92
93 /** 
94  * Function to run a train.  
95  * 
96  * @param name  Name of the train. 
97  * @param cls   class name of train setup
98  * @param opts  Optons 
99  * 
100  * @return true on success
101  *
102  * @ingroup pwglf_forward_trains
103  */
104 Bool_t RunTrain(const TString& name, const TString& cls, 
105                 const TString& uri,  const TString& opts)
106 {
107   // Check for help 
108   if (name.IsNull() || name.EqualTo("help", TString::kIgnoreCase) || 
109       cls.IsNull()  || cls.EqualTo("help", TString::kIgnoreCase)) {
110     PlainUsage();
111     return true;
112   }
113   
114   Bool_t verb = opts.Contains("verbose");
115   // Build our helpers 
116   if (!BuildHelpers(verb, false, true)) return false;
117
118   // Tokenize options 
119   if (!opts.EndsWith(",")) opts.Append(",");
120   opts.Append("url="); 
121   opts.Append(uri);
122   TObjArray* optList = opts.Tokenize(",");
123   return TrainSetup::Main(name, cls, optList);
124 }
125 /*
126  * EOF
127  */     
128