]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/trains/LiteRailway.C
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / trains / LiteRailway.C
1 /**
2  * @file   LiteRailway.C
3  * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
4  * @date   Tue Oct 16 18:59:59 2012
5  * 
6  * @brief  Proof-Lite analysis helper
7  * 
8  * @ingroup pwglf_forward_trains_helper
9  * 
10  */
11 #ifndef LITEHELPER_C
12 #define LITEHELPER_C
13 #include "ProofRailway.C"
14 #ifndef __CINT__
15 # include "ChainBuilder.C"
16 # include <TUrl.h>
17 # include <TString.h>
18 # include <TChain.h>
19 # include <TDSet.h>
20 # include <AliAnalysisManager.h>
21 # include <AliVEventHandler.h>
22 #else
23 class TChain;
24 class TUrl;
25 #endif
26
27 // ===================================================================
28 /**
29  * Handler of analysis in Proof-Lite.  This is triggered by URIs of the 
30  * form 
31  * 
32  * @code 
33  * local:///<datadir>[?<options>][#treeName]
34  * local:///<collection>[?<options>][#treeName]
35  * local:///<file>[?<options>][#treeName]
36  * @endcode 
37  *
38  * where 
39  *
40  * <dl>
41  *   <dt><tt>&lt;datadir&gt;</tt></dt>
42  *   <dd>is the base directory holding data files </dd>
43  *   <dt><tt>&lt;collection&gt;</tt></dt>
44  *   <dd>is an ASCII or XML list of input sources</dd>
45  *   <dt><tt>&lt;file&gt;</tt></dt>
46  *   <dd>is a single ROOT file</dd>
47  *   <dt><tt>&lt;options&gt;</tt></dt>
48  *   <dd>A &amp; separated list of options
49  *     <dl>
50  *       <dt><tt>recursive</tt></dt>
51  *       <dd>Scan &lt;datadir&gt; recursively</dd>
52  *       <dt><tt>mc</tt></dt>
53  *       <dd>Scan also for MC files (<tt>galice.root</tt>, 
54  *          <tt>Kinematics.root</tt>, and <tt>TrackRefs.root</tt>) when 
55  *          scanning &lt;datadir&gt;</dd>
56  *       <dt><tt>pattern=&lt;GLOB&gt;</tt></dt>
57  *       <dd>Shell glob pattern that files must check when scanning 
58  *         &lt;datadir&gt;</dd>
59  *       <dt><tt>workers=N[x]</tt></dt>
60  *       <dd>Set the number of workers to use.  If <tt>x</tt> is appended, 
61  *         then it's maximum number of workers per slave</dd>
62  *       <dt><tt>par[=all]</tt></dt>
63  *       <dd>Use PAR files.  If the value <tt>all</tt> is given, then also 
64  *         PAR files of STEERBase, ESD, AOD, ANALYSIS, OADB, ANALYSISalice 
65  *         are used. </dd>
66  *       <dt><tt>mode=[default,rec,sim,train,custom]</tt></dt>
67  *       <dd>Set the AliROOT mode.  If not specified <tt>default</tt> 
68  *         is assumed.  See also CreateAliROOTPar</dd>
69  *      </dl>
70  *   </dd>
71  * </dl>
72  *       
73  * @ingroup pwglf_forward_trains_helper
74  */
75 struct LiteRailway : public ProofRailway
76 {
77   /** 
78    * Constructor 
79    * 
80    * @param url     Url 
81    * @param verbose Verbosity
82    */
83   LiteRailway(const TUrl& url, Int_t verbose)
84     : ProofRailway(url, verbose), fChain(0)
85   {
86     fOptions.Add("recursive","Recursive scan");
87     fOptions.Add("pattern",  "GLOB", "File name pattern", "*.root");
88     fOptions.Remove("dsname");
89     fOptions.Remove("storage");
90   }
91   /** 
92    * Copy constructor 
93    * 
94    * @param o Object to copy from 
95    */
96   LiteRailway(const LiteRailway& o) 
97     : ProofRailway(o), fChain(o.fChain)
98   {}
99   /** 
100    * Assignment operator 
101    * 
102    * @param o Object to assign from 
103    * 
104    * @return Reference to this 
105    */
106   LiteRailway& operator=(const LiteRailway& o) 
107   {
108     if (&o == this) return *this;
109     ProofRailway::operator=(o);
110     fChain = o.fChain;
111     return *this;
112   }
113   /** 
114    * Destructor 
115    */
116   virtual ~LiteRailway() {}
117   /** 
118    * Set-up done before task set-ups 
119    * 
120    * @return true on success 
121    */
122   virtual Bool_t PreSetup() 
123   {
124     fUrl.SetProtocol("lite");
125     Bool_t ret = ProofRailway::PreSetup();
126     return ret;
127   }
128   /** 
129    * Set-up done after task set-ups
130    * 
131    * @return true on success
132    */
133   virtual Bool_t PostSetup()
134   {
135     // -- Check for local chain --------------------------------------
136     TString  pattern   = (fOptions.Has("pattern") ?fOptions.Get("pattern") :"");
137     TString  treeName  = fUrl.GetAnchor();
138     Bool_t   recursive = fOptions.Has("recursive");
139     Bool_t   mc        = fOptions.Has("mc");
140     TString  src       = fUrl.GetFile();
141     UShort_t type      = ChainBuilder::CheckSource(src, 0);
142     if (type == ChainBuilder::kInvalid) {
143       Error("LiteRailway", "Cannot generate TChain from %s", src.Data());
144       return false;
145     }
146
147     // --- Create the chain ------------------------------------------
148     pattern.ReplaceAll("@", "#");
149     Bool_t chainMC = (mc && AliAnalysisManager::GetAnalysisManager()
150                       ->GetMCtruthEventHandler() != 0);
151     fChain = ChainBuilder::Create(type, src, treeName, pattern, 
152                                   chainMC, recursive, fVerbose > 5);
153     if (!fChain) { 
154       Error("PostSetup", "No chain defined "
155             "(src=%s, treeName=%s, pattern=%s, mc=%s, recursive=%s)", 
156             src.Data(), treeName.Data(), pattern.Data(), 
157             (mc ? "true" : "false"), (recursive ? "true" : "false"));
158       return false;
159     }
160
161     return ProofRailway::PostSetup();
162   }
163   /** 
164    * Start the analysis 
165    * 
166    * @param nEvents Number of events to analyse 
167    * 
168    * @return The return value of AliAnalysisManager::StartAnalysis
169    */
170   virtual Long64_t Run(Long64_t nEvents=-1) 
171   {
172     AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
173     gProof->SetLogLevel(TMath::Max(fVerbose-2,0), 
174                         /* TProofDebug::kPacketizer| */
175                         TProofDebug::kLoop|
176                         /* TProofDebug::kSelector|
177                         TProofDebug::kOutput|
178                         TProofDebug::kInput|
179                         TProofDebug::kGlobal|*/
180                         TProofDebug::kPackage);
181     if (nEvents < 0) nEvents = fChain->GetEntries();
182     Long64_t off = fOptions.AsLong("offset", 0);
183     if (nEvents > 0 && nEvents < off) {
184       Warning("Run", "Number of events %lld < offset (%lld), stopping", 
185               nEvents, off);
186       return 0;
187     }
188     Long64_t ret = mgr->StartAnalysis("proof", fChain, nEvents, off);
189     
190     if (fVerbose > 2) 
191       TProof::Mgr(fUrl.GetUrl())->GetSessionLogs()->Save("*","lite.log");
192     return ret;
193   }
194   /** 
195    * Path of output 
196    * 
197    * @return Path to output - possibly a data set
198    */
199   virtual TString OutputPath() const 
200   {
201     AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
202     if (!mgr) return "";
203
204     AliVEventHandler* outH = mgr->GetOutputEventHandler();
205     if (!outH) return "";
206     
207     TString ret = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
208                                           outH->GetOutputFileName());
209     return ret;
210   }
211
212   /** 
213    * @return URL help string
214    */
215   virtual const Char_t* UrlHelp() const 
216   {
217     return "lite://<datadir_or_list>[?<options>][#<treeName]";
218   }
219   /** 
220    * @return The short description
221    */
222   virtual const char* Desc() const { return "PROOF-lite"; }
223   /** Our chain */
224   TChain* fChain;
225 };
226 #endif
227 //
228 // EOF
229 //
230