]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/trains/trainMain.cxx
Various fixes
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / trains / trainMain.cxx
1 /*
2   To compile, do 
3
4   rootcint -f OptionDict.C -c Option.C 
5   g++ `root-config --cflags --libs` \
6     -lVMC -lGeom -lMinuit -lXMLIO -lTree -lTreePlayer \
7     -I$ALICE_ROOT/include -L$ALICE_ROOT/lib/tgt_${ALICE_TARGET} \
8     -lSTEERBase -lESD -lAOD -lANALYSIS -lOADB -lANALYSISalice \
9     trainMain.cxx -o runTrain
10 */
11  
12 #include "AvailableSoftware.C" 
13 #include "ChainBuilder.C" 
14 #include "ParUtilities.C"
15 #include "OutputUtilities.C" 
16 #include "Option.C"
17 #include "Helper.C" 
18 #include "LocalHelper.C" 
19 #include "ProofHelper.C" 
20 #include "LiteHelper.C"
21 #include "AAFHelper.C" 
22 #include "PluginHelper.C"
23 #include "AAFPluginHelper.C" 
24 #include "GridHelper.C"
25 #include "TrainSetup.C"
26
27 #include <TGApplication.h>
28 #include <TROOT.h>
29 #include <TList.h>
30 #include <TObjString.h>
31 #include <TString.h>
32
33 #include <iostream>
34 #include <iomanip>
35
36 /** 
37  * Custom timer to do a deferred start after the application 
38  * has been started 
39  */
40 struct Deferred : public TTimer
41 {
42   Deferred(const TString& name, const TString& cls, 
43            const TCollection* opts)
44     : TTimer(1000, false), 
45       fName(name), 
46       fClass(cls), 
47       fOptions(opts)
48   {
49     Start(1000, true);
50   }
51   Deferred(const Deferred& o)
52     : TTimer(), 
53       fName(o.fName),
54       fClass(o.fClass),
55       fOptions(o.fOptions)
56   {}
57   Deferred& operator=(const Deferred& o) 
58   { 
59     if (&o == this) return *this;
60     fName    = o.fName;
61     fClass   = o.fClass;
62     fOptions = o.fOptions;
63     return *this; 
64   }
65   Bool_t Notify()
66   {
67     // gSystem->RemoveTimer(this);
68     Info("Notify", "Will run train setup: %s (%s)", 
69          fName.Data(), fClass.Data());
70     return TrainSetup::Main(fName, fClass, fOptions);
71   }
72   TString fName;
73   TString fClass;
74   const TCollection* fOptions;
75 };
76
77 /** 
78  * Append directory to header and script search path
79  * 
80  * @param dir Directory
81  * 
82  * @ingroup pwglf_forward_trains_run
83  */
84 void AppendPath(const char* dir)
85 {
86   gROOT->SetMacroPath(Form("%s:%s",gROOT->GetMacroPath(), dir));
87   gSystem->AddIncludePath(Form("-I%s", dir));
88 }
89 /** 
90  * Print a fake option description.  Used for options specific to this
91  * program.
92  * 
93  * @param o    Output stream 
94  * @param opt  Option (including meta argument)
95  * @param desc Option description.
96  * 
97  * @ingroup pwglf_forward_trains_run
98  */
99 void PrintFakeOption(std::ostream& o, const char* opt, const char* desc)
100 {
101   o << "  --" << std::left << std::setw(30) << opt << " " << desc << std::endl;
102 }
103
104 /** 
105  * Print usage information 
106  * 
107  * @param progname Program name 
108  * @param o        Output stream
109  * @param r        Optional runner. 
110  * 
111  * @ingroup pwglf_forward_trains_run
112  */
113 void Usage(const char* progname, std::ostream& o)
114 {
115   o << "Usage: " << progname << " --class=CLASS --name=NAME [OPTIONS]\n\n"
116     << "PROGRAM OPTIONS:\n";
117   PrintFakeOption(o, "class=CLASS",       "Train class");
118   PrintFakeOption(o, "name=NAME",         "Name of train");
119   PrintFakeOption(o, "include=DIRECTORY", "Append dir to macro/header path");
120   PrintFakeOption(o, "batch",             "Batch mode");
121 }
122
123 int
124 main(int argc, char** argv)
125 {
126   TList optList;
127   TString name;
128   TString cls;
129   Bool_t  batch = false;
130   Bool_t  help  = false;
131
132   // --- Parse options -----------------------------------------------
133   for (int i = 1; i < argc; i++) { 
134     if (argv[i][0] == '-' && argv[i][1] == '-') { 
135       TString arg(argv[i]);
136       TString val("");
137       arg.ReplaceAll("\"'", "");
138       Int_t   eq = arg.Index("=");
139       if (eq != kNPOS) val = arg(eq+1, arg.Length()-eq-1);
140       if      (arg.BeginsWith("--class"))   cls  = val;
141       else if (arg.BeginsWith("--name"))    name = val;
142       else if (arg.BeginsWith("--include")) AppendPath(val);
143       else if (arg.BeginsWith("--batch"))   batch = true;
144       else if (arg.BeginsWith("--help"))    help  = true;
145       else optList.Add(new TObjString(&(argv[i][2])));
146     }
147   }
148   // --- check for help ----------------------------------------------
149   if (help && cls.IsNull()) {
150     if (cls.IsNull()) {
151       Usage(argv[0], std::cout);
152       return 0;
153     }
154     optList.Add(new TObjString("help"));
155   }
156
157   // --- Check name and class ----------------------------------------
158   if (name.IsNull()) { 
159     Error("main", "No name specified");
160     return 1;
161   }
162   if (cls.IsNull()) { 
163     Error("main", "No class specified");
164     return 1;
165   }
166
167   // --- Setup script path -------------------------------------------
168   const char* aliPath  = gSystem->ExpandPathName("$ALICE_ROOT");
169   const char* fwdPath  = gSystem->ExpandPathName("$ALICE_ROOT/PWGLF/FORWARD/");
170   AppendPath(aliPath);
171   AppendPath(Form("%s/include",   aliPath));
172   AppendPath(Form("%s/trains",    fwdPath));
173   AppendPath(Form("%s/analysis2", fwdPath));
174
175
176   // --- Set-up Application ------------------------------------------
177   TApplication* app = 0;
178   gROOT->SetBatch(true);
179   if (!batch) { 
180     gROOT->SetBatch(false);
181     app = new TGApplication("runTrain", 0, 0);
182     app->InitializeGraphics();
183   }
184
185   // --- run, possibly in a timer ------------------------------------
186   Bool_t ret = true;
187   if (batch) 
188     ret = TrainSetup::Main(name, cls, &optList);
189   else {
190     new Deferred(name, cls, &optList);
191     Info("main", "Running application (%s)", gROOT->IsBatch() 
192          ? "batch" : "normal");
193     gApplication->Run();
194   }
195
196   // --- Return ------------------------------------------------------
197   return ret ? 0 : 1;
198 }
199 //
200 // EOF
201 //
202
203         
204